问题描述
我尝试将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()