问题描述
我目前正在开展一个心电图项目,但在将 Waveshare 高精度 AD/DA 板(具有 ADS1256 ADC 且旨在与 RPI 配合使用)与 Terasic DE10-Nano 套件一起使用时遇到了一些困难.
我在 Qsys 中使用 Altera SPI Master 外设,设置如下:
- SCLK 速率:20000
- 数据宽度:8 位
- 切换方向:MSB 优先
- 时钟极性:0
- 时钟相位:1
- 没有同步器阶段
对于其余所需的信号,我使用的是 Avalon PIO:
- DRDY(输入)
- RST(输出)
- PWR(输出)
此外,还有一个 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
非常感谢有关如何设置的任何帮助。如果我的帖子不是很好,很抱歉,我是在这些论坛上发帖的新手。
解决方法
某些引脚分配不正确。在修复这些问题并使用不同的微控制器而不是 AD/DA 板进行测试后,DRDY 被断言,但问题仍然存在于 waveshare 板上。看起来像是主板的特定问题,因此我已联系制造商寻求帮助。