工具与软件:
您好、我最近使用 ADS1278v2EVM 通过 SPI 通信向我的 Raspberry Pi 4b 采集数据。
我看到其他人这样做,有一个案例提供了部分线路和代码参考,我试图遵循他的思路,但我有一个问题,我不能解决:我不知道什么原因,我不能读取数据,我将详细解释我的理解下述问题;
非常希望你能给我一些帮助。
接通电源后,三个电源指示灯呈绿色,处于正常状态。
现在的问题是:我无法收集数据;在 SPI 协议中、DRDY 会在 SYNC 变为低电平时变为高电平;DRDY 会在 SYNC 恢复高电平后保持高电平、在其完成检索有效数据后变为低电平;故障排除和测试后、代码卡在"DRDY 不输出下降沿"。
我的 ADS1278V2EVM 和 Raspberry Pi 之间的接线如下所示:
J6 (中间两列对应于 ADS1278V2EVM 的 J6引脚、左列和右列对应于 Raspberry Pi 的引脚)
| :μ A GPIO6 | FSDY | SCLK | SCLK |
|---|---|---|---|
| 32:GPIO26 | CLK | DO1 | MISO |
| 0 | DO2 | 业务3 | 0 |
| 0 | DO4 | DO5 | 0 |
| 0 | DO6 | DO7 | 0 |
| 0 | DO8 | DIN | |
| :μ A GPIO1 | 同步 | EEWP | 不接(原因未知) |
| 接地 | 接地 | 接地 |
J4 (在此处选择高速、SPI、TDM、固定模式、时钟输入分频为高速)
| M0 | M1 | F0 | F1 | F2 | CLKDIV |
|---|---|---|---|---|---|
| 0:开路 | 0:开路 | :Ω 短接 | 0:开路 | 0:开路 | :Ω 短接 |
| JP1——3 | JP2——3 |
|---|---|
| JP1——2 | JP2——2 |
| 开路——1 |
我的代码是:
import RPi.GPIO as GPIO
import spidev
# SPI setting
spi = spidev.SpiDev()
spi.open(0,0) # spi.open(bus,device),连接到指定设备
spi.max_speed_hz = 7800000 # SCLK frequency 根据树莓派SPI速度列表
spi.mode = 0b00 # C_POL=0, C_PHA=0;SCLK空闲时为低电平,第一个时间沿采样;
spi.no_cs = True # 设置SPI_NO_CS标志是否使用CS,此处使用CS
# get bytes
def adc_1ch(): # 1channel
data = spi.xfer([0x00,0x00,0x00]) # 24bits = 3bytes,读取
adc = (data[0] << 16) + (data[1] << 8) + data[2] # shift register,将data24字节的数据转化为数值
if adc > (2**23-1): # 2's complement
adc = adc - 2**24
voltage = (adc*2.5)/(2**23 - 1) # 此处参考电压是V(REF) = 2.5V,
return voltage
def adc_8ch(): # 8channel
ch = []
for i in range(8):
ch.append(adc_1ch())
return ch
# GPIO setting,将SYNC和CLK都设为1,高电平
# 该函数将GPIO引脚22设置为输入模式,并将其状态设置为高电平。
GPIO.setmode(GPIO.BOARD)
pins = [16, 32] # 物理接口
# SYNC, CLK Select pin
volt = [1,1] # 1=high, 0=low
for p in range(2):
GPIO.setup(pins[p],GPIO.OUT)
if volt[p] == 1:
GPIO.output(pins[p],GPIO.HIGH)
else:
GPIO.output(pins[p],GPIO.LOW)
# (新款PCB板可以通过跳线设置高低电平,所以此处只有SYNC和CLK需要编程实现高低电平)
GPIO.setup(22,GPIO.IN) # DRDY pin 该函数将GPIO引脚22设置为输入模式,并将其状态设置为高电平。
# main
i = 0 # timer
while True: # loop 100 times
GPIO.wait_for_edge(22, GPIO.FALLING) # start to capture data when DRDY falling down
print(adc_8ch()) # capture data
i = i + 1
if i == 100: # timer stop
break
GPIO.cleanup()

