我尝试使用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()