我目前正在做一个心电图项目,我在使用带有 Terasic DE10-Nano 套件的 Waveshare 高精度 AD/DA 板(它有一个 ADS1256 ADC 并且旨在与 RPI 一起使用)时遇到了一些困难。
我在 Qsys 中使用具有以下设置的 Altera SPI 主外设:
- SCLK 速率:20000
- 数据宽度:8位
- 移位方向:MSB 优先
- 时钟极性:0
- 时钟相位:1
- 无同步器阶段
对于其余需要的信号,我正在使用 Avalon PIO:
- DRDY(输入)
- RST(输出)
- 压水堆(输出)
此外,还有一个 Nios2 CPU,alt_avalon_spi_command
用于发送 SPI 命令和IOWR_ALTERA_AVALON_PIO_DATA
控制 PIO。
我遇到的问题是 DRDY 信号从未被断言(预计在能够读取数据之前它会变为低电平)。我知道这个信号应该与上拉电阻一起使用;我尝试了以下方法,但都没有奏效:
- 在 DE10-Nano GPIO 引脚上配置内部上拉电阻
- 使用外部上拉电阻 (10K/56K)
我知道在配置之前我应该能够读取 ADS1256 的芯片 ID。我首先重置设备,按照: https ://github.com/waveshare/High-Precision-AD-DA-Board/blob/master/Jetson%20nano/ADS1256/C/obj/ADS1256.c#L39
/* RESET */
IOWR_ALTERA_AVALON_PIO_DATA( WAVESHARE_ADS_RST_BASE, HIGH );
usleep(200);
IOWR_ALTERA_AVALON_PIO_DATA( WAVESHARE_ADS_RST_BASE, LOW );
usleep(200);
IOWR_ALTERA_AVALON_PIO_DATA( WAVESHARE_ADS_RST_BASE, HIGH );
然后我等待 DRDY 变低,这似乎永远不会发生,不管上述上拉电阻的设置如何:
alt_u8 ADS1256_wait_DRDY( void ) {
for( int i=0; i<50; i++ ) {
alt_u8 drdy = ADS1256_DRDY_get_level();
if ( drdy == LOW ) {
printf( "DRDY asserted\n" );
return 0;
} else {
usleep( DELAY_DRDY );
}
}
printf( "Timeout: DRDY not asserted.\n" );
return -1;
}
我正在使用 Hobby Components Logic Analyser 进行探测。引脚连接详述如下:
AD/DA RPI PIN DE10-Nano Location Standard HDL Signal Direction Logic Analyzer
==========================================================================================================
3v3 3v3 3v3
GND GND GND
MOSI 19 (GPIO 10) GPIO_0(0) PIN_V12 3.3V LVTTL SPI_MOSI OUT D0
MISO 21 (GPIO 9) GPIO_0(2) PIN_W12 3.3V LVTTL SPI_MISO IN D1
SCK 23 (GPIO 11) GPIO_0(4) PIN_D8 3.3V LVTTL SPI_SCK OUT D2
P3 (CS_PIN) 15 (GPIO 22) GPIO_0(1) PIN_E8 3.3V LVTTL SPI_SS_n(0)* OUT D3
P1 (RST) 12 (GPIO 18) GPIO_0(3) PIN_D11 3.3V LVTTL ADS_RST OUT D4
P0 (DRDY) 11 (GPIO 17) GPIO_0(6) PIN_AE15 3.3V LVTTL WAVESHARE_DRDY IN D5
逻辑分析仪输出如下: PulseView
非常感谢任何有关如何设置的帮助。抱歉,如果我的帖子不是很好,我对在这些论坛上发帖还很陌生。