带Python的AD5270 SPI电位计

问题描述

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

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

期望:阅读我写的东西。

硬件设置:

  • !SYNC = CE0 = PIN24
  • DIN = MISO = PIN19
  • SDO = MOSI = PIN21
  • SLCK = SCLK = PIN23

具有1uF ext电容器和3V3电源(来自RaspBerry)。

可通过here获得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()