带Python的AD5270 SPI电位计



我尝试使用AD5270,20KOhm SPI电位计与我的Raspberry Pi 3B+进行个人项目。我把一些Arduino库的代码翻译成Python语言,但看起来不起作用。我无法测试电位计是否配置了良好的值,所以我读取电阻值,并始终从SPI寄存器中获得0。

问题:我不知道我的写作是否做得很好,因为我不能探测电阻器。为了知道它是否有效,我读取寄存器并始终接收0x00。写作和/或阅读不起作用。

期待:阅读我写的东西。

硬件设置:

  • !SYNC=CE0=引脚24
  • DIN=MISO=PIN19
  • SDO=MOSI=PIN21
  • SLCK=SCLK=引脚23

1uF ext电容器和3V3电源(来自树莓(。

此处提供AD5270的数据表。

数据表后面的最简代码不起作用:

spi = spidev.SpiDev()
spi.open(spi_bus, spi_device_select)
spi.max_speed_hz = 50000                                # Datasheet p7
spi.mode = 1                                            # CPOL = 0, CPHA = 1 (Datasheet p7)
# Datasheet example
data = [0x1C, 0x03]
r = spi.xfer(data)
print(r)
data = [0x05, 0x00]
r = spi.xfer(data)
print(r)
data = [0x08, 0x00]
r = spi.xfer(data)
print(r)
data = [0xC0, 0x00]
r = spi.xfer(data)
print(r)

从硬件设置:

  • DIN=MISO=PIN21(通过10欧姆电阻器(
  • SDO=MOSI=PIN19(通过10欧姆电阻器(

DIN输入AD5270,因此输出RPI,因此它应该是MOSI。SDO也有同样的问题。

我终于掌握了窍门。不要忘记在SDO行上添加一个上拉,并为AD5270配置Spidev。这个代码运行得很好:

# SPI test code for AD5270BRMZ-20
import time
import spidev
spi_bus = 0                                              # SPI0
spi_device_select = 0                                    # CE0
spi = spidev.SpiDev()
spi.open(spi_bus, spi_device_select)
spi.max_speed_hz = 50000                                # Datasheet p7
spi.mode = 1                                            # CPOL = 0, CPHA = 1 (Datasheet p7)
spi.lsbfirst = False                                    # Datasheet p18
MAX_RESISTANCE      = 20000.0
WRITE_CTRL_REG      = 0x1C
READ_CTRL_REG       = 0x20
WRITE_RDAC          = 0x04
READ_RDAC           = 0x08
RDAC_WRITE_PROTECT  = 0x02
def AD5270_CalcRDAC(resistance):
return int((resistance / MAX_RESISTANCE) * 1024.0)
def AD5270_ReadReg(command):
data = [(command & 0x3C), 0]
r = spi.xfer2(data)
data = [0x00, 0x00]
r2 = spi.xfer2(data)
result = r2[0]
result = (result << 8) | r2[1]
return result
def AD5270_WriteReg(command, value):
ui16Command = (command & 0x3C) << 8 | (value & 0x3FF)
data = [(ui16Command >> 8) & 0xFF, ui16Command & 0xFF]
spi.xfer2(data)
def AD5270_ReadRDAC():
RDAC_val = AD5270_ReadReg(READ_RDAC)
RDAC_val &= 0x03FF
return ((RDAC_val) * MAX_RESISTANCE) / 1024.0
def AD5270_WriteRDAC(resistance):
RDAC_val = AD5270_CalcRDAC(resistance)
spi.xfer2([WRITE_CTRL_REG, RDAC_WRITE_PROTECT])
AD5270_WriteReg(WRITE_RDAC, RDAC_val);
return ((RDAC_val * MAX_RESISTANCE) / 1024.0)
while(1):
AD5270_WriteRDAC(10000.0) # Write 10KOhm
print(AD5270_ReadRDAC())
time.sleep(1)
spi.close()

最新更新