AD5270带Python的SPI电位计

AD5270带Python的SPI电位计,python,raspberry-pi,spi,sensors,Python,Raspberry Pi,Spi,Sensors,我尝试使用AD5270,20KOhm SPI电位计,用于我的树莓Pi 3B+个人项目。我将一些Arduino库代码翻译成Python语言,但它看起来不起作用。我无法测试电位计是否配置了良好的值,因此我读取电阻器值,并始终从SPI寄存器中获取0 问题:我不知道我的书写是否很好,因为我不能探测电阻。为了知道它是否有效,我读取寄存器并始终接收0x00。写作和/或阅读不起作用 期望:读我写的东西 硬件设置: !!SYNC=CE0=PIN24 DIN=MISO=PIN19 SDO=MOSI=PIN21

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

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

期望:读我写的东西

硬件设置:

  • !!SYNC=CE0=PIN24
  • DIN=MISO=PIN19
  • SDO=MOSI=PIN21
  • SLCK=SCLK=PIN23
带有1uF外部电容器和3V3电源(来自Raspberry)

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()
AD5270BRMZ-20的SPI测试代码 导入时间 导入spidev spi_总线=0#SPI0 spi_设备_选择=0#CE0 spi=spidev.spidev() spi.open(spi_总线、spi_设备选择) spi.max_速度_hz=50000#数据表p7 spi.mode=1#CPOL=0,CPHA=1(数据表p7) spi.lsbfirst=False#数据表p18 最大电阻=20000.0 写入\u CTRL\u REG=0x1C 读取\u CTRL\u REG=0x20 写入_RDAC=0x04 读取\u RDAC=0x08 RDAC_WRITE_PROTECT=0x02 def AD5270_CalcRDAC(电阻): 返回整数((电阻/最大电阻)*1024.0) def AD5270_ReadReg(命令): 数据=[(命令&0x3C),0] r=spi.xfer2(数据) 数据=[0x00,0x00] r2=spi.xfer2(数据) 结果=r2[0] 结果=(结果8)和0xFF,UI16命令和0xFF] spi.xfer2(数据) def AD5270_ReadRDAC(): RDAC_val=AD5270_ReadReg(读取RDAC) RDAC_val&=0x03FF 返回值((RDAC值)*最大电阻)/1024.0 def AD5270_WriteRDAC(电阻): RDAC_val=AD5270_CalcRDAC(电阻) spi.xfer2([WRITE\u CTRL\u REG,RDAC\u WRITE\u PROTECT]) AD5270_WriteReg(WRITE_RDAC,RDAC_val); 返回((RDAC值*最大电阻)/1024.0) 而(一): AD5270_WriteRDAC(10000.0)#写入10欧姆 打印(AD5270_ReadRDAC()) 时间。睡眠(1) spi.close()
初学者的错误。我改了,但还是不行。我按照数据表编写了最简单的代码。并始终收到[0x00,0x00]。请使用固定pin布局更新您的问题。极简主义的代码很棒,我可能会删除长代码,因为它不会增加问题。如果你将味噌直接连接到MOSI,消除AD5270,它是否能像预期的那样工作(你得到你所发送的)?我在RPi上跳转味噌和MOSI,并将其作为输出:[14,1],[2,0],[4,0],[96,0],我预期[xx,xx],[28,3],[5,0],[8,0]。我用
wiringpi.wiringPiSPIDataRW()尝试了相同的代码
而不是SpiDev并获取我发送的内容,但仍然无法使用AD5270。这不是它的工作方式。你应该得到“[28,3]…”,在开始时没有垃圾。发送和接收同时发生。你得到的值似乎移动了一位,但在其他方面是正确的。