This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我在同步从模式下使用 ADS131A04 ADC、配置如下。
M0:悬空、同步从模式。
M1:GND、24位配置。
M2:GND、汉明码关闭。
我能够按照数据表中的规定配置和读取每个命令和寄存器的响应。 但是、在启用全部四个 ADC 后、我无法获取 ADC 数据。
在配置期间、我的 D_SYS_CFG[0](CRC 被禁用)_CFG[1]= 0 (动态帧大小)、并且全部四个 ADC 都被启用。 因此,在读取 ADC 数据时,我将读取20字节的数据(4字节状态响应和4*4字节通道数据)。
上电复位时、寄存器正在进行配置、但数据日志中显示的状态响应读取需要一些时间才能稳定至0x22000000。
记录的 ADC 配置和 ADC 数据如下所示:-
*所有响应均为32位十六进制。
ADC 首次测试计划!!!
复位寄存器响应:ff0400ff
解锁命令 respone:65500ff
STAT_1寄存器响应:220000ff
STAT_N 寄存器响应:240000ff
STAT_S 寄存器响应:250000ff
STAT_M2寄存器响应:270200ff
A_SYS_CFG 寄存器响应:2b6000ff
D_SYS_CFG 寄存器响应:2c3c00ff
CLK1寄存器响应:2d0800ff
CLK1寄存器响应:2d0200ff
CLK2寄存器响应:2e2600ff
ADC_ENA 寄存器响应:2f0f0000
WAKEUP 命令 respone:330000
LOCK 命令 respone:5550000
您好、Anshul、
欢迎来到我们的论坛、感谢您的发帖!
[引用 USER="Anshul Basra "]在读取 ADC 数据时,我正在读取20字节的数据(4字节状态响应和4 * 4字节通道数据)。[/引用]
您是否真正使用24位模式? 当 M1 = GND 时、每个 SPI 字只需发送3个字节。 因此、为了从所有四个通道读取数据、您总共需要15个字节:一个字表示状态、另一个字表示每个通道。
[报价用户="Anshul Basra "]读取状态响应需要一些时间才能稳定到数据日志中下面显示的0x22000000。[/报价]
您是否在数据日志中显示的每个状态响应之前在帧中发送 NULL 命令? 发送 NULL 命令时、请查看 STAT_1寄存器的内容。 数据日志中的状态响应指示的一些错误消息表示您有 SPI 故障、我之前的评论将对此进行解释。 其他响应没有意义、这可能表明由于每帧 SCLK 数量不正确而导致 SPI 传输错误。
此致、
是的、我使用 Null 命令来读回每个寄存器设置的状态响应、并发送命令来配置 ADC。
我已经对函数进行了定义、以便向 ADC 发送32位命令。 如前所述、在我使用 Null 命令读取响应的下一帧中、present 命令的状态可用。
正如您所说的、现在我正在读取15个字节的数据(3字节状态响应、3字节* 4通道数据= 12字节)。 我仍然没有从 ADC 获取数据。 所有通道数据为零、状态响应为0x2200。
我正在分享如何配置 ADC 和读取微控制器上的数据。
/*用户代码 begin 2 */
printf ("ADC 首次测试程序!!!!!\n");
ResetCommand (GPIOA、GPIO_PIN_4);
printf ("复位寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
DevIdCommand (GPIOA、GPIO_PIN_4);
//printf ("就绪命令响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
//等待设备就绪...........
while ((((NullCommand (GPIOA、GPIO_PIN_4))& 0xFFFFFF0000)!= 0xFF040000){}
UnlockCommand (GPIOA、GPIO_PIN_4);
printf ("解锁命令响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
readRegisterCommand (GPIOA、GPIO_PIN_4、STAT_1);
printf ("STAT_1寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
readRegisterCommand (GPIOA、GPIO_PIN_4、STAT_N);
printf ("STAT_N 寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
readRegisterCommand (GPIOA、GPIO_PIN_4、STAT_S);
printf ("STAT_S 寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
readRegisterCommand (GPIOA、GPIO_PIN_4、STAT_M2);
printf ("STAT_M2寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
readRegisterCommand (GPIOA、GPIO_PIN_4、A_SYS_CFG);
printf ("A_SYS_CFG 寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
//writeRegisterCommand (GPIOA、GPIO_PIN_4、D_SYS_CFG、0x3F);
readRegisterCommand (GPIOA、GPIO_PIN_4、D_SYS_CFG);
printf ("D_SYS_CFG 寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
readRegisterCommand (GPIOA、GPIO_PIN_4、CLK1);
printf ("CLK1寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
writeRegisterCommand (GPIOA、GPIO_PIN_4、CLK1、0x02);
printf ("CLK1寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
writeRegisterCommand (GPIOA、GPIO_PIN_4、CLK2、0x26);
printf ("CLK2寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
writeRegisterCommand (GPIOA、GPIO_PIN_4、ADC_ENA、0x0F);
printf ("ADC_ENA 寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
WakeupCommand (GPIOA、GPIO_PIN_4);
printf ("唤醒命令响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
LockCommand (GPIOA、GPIO_PIN_4);
printf ("锁定命令响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
/*用户代码在*/时开始
while (1)
{
/*用户代码结束,同时*/
printf("\n**** 循环开始*** \n");
DRDY_STATUS = HAL_GPIO_ReadPin (GPIOA、GPIO_PIN_0);
DONE_STATUS = HAL_GPIO_ReadPin (GPIOA、GPIO_PIN_1);
printf ("DRDY 状态:%x\n"、DRDY_STATUS);
//读取数据
HAL_GPIO_WritePin (GPIOA、GPIO_PIN_4、GPIO_PIN_RESET);// CS 低电平
HAL_SPI_Receive (&hspi1、Rx_DATA、15、200);
// HAL_DELAY (500);
HAL_GPIO_WritePin (GPIOA、GPIO_PIN_4、GPIO_PIN_SET);// CS 高电平
uint32_t STATUS_RESPONSE = Rx_DATA[0]<<16 | Rx_DATA[1]<<8 | Rx_DATA[2];
uint32_t ch0 = rx_data[3]<<16 | rx_data[4]<<8 | rx_data[5];
uint32_t CH1 = rx_data[6]< 16 | rx_data[7]< 8 | rx_data[8];
uint32_t CH2 = rx_data[9]<<16 | rx_data[10]<8 | rx_data[11];
uint32_t ch3 = rx_data[12]<<16 | rx_data[13]<<8 | rx_data[14];
// uint32_t CRC = rx_data[20]<<24 | rx_data[21]<<16 | rx_data[22]<<8 | rx_data[23];
printf ("状态响应:%x\n"、STATUS_RESPONSE);
printf ("ch0:%x\n"、ch0);
printf ("ch1:%x\n"、ch1);
printf ("ch2:%x\n"、ch2);
printf ("ch3:%x\n"、ch3);
//printf ("CRC:%x\n"、CRC);
HAL_GPIO_TogglePin (GPIOB、GPIO_PIN_3);
printf ("\n ****** 循环结束******* \n");
/*用户代码 begin 3 */
}
DSO 波形快照:-
黄色:CS
蓝色:SCLK
品红色:MISO
绿色:MOSI
您好、Anshul、
您必须为 SPI 帧中的每个字发送正确的位数。 如果器件配置为24位模式、并且您每字发送32位、则通信将不起作用。
请通过将 M1连接到 IOVDD、将 ADS131A04配置为32位模式。
此致、
大家好、我将 M1连接到 IOVDD。
现在、我正在读取20字节的通道数据(禁用 CRC)、但 仍然会获得与0x22000000相同的状态响应、并且所有通道数据都为0。
在同步从机模式下、我已将 DRDY 和 CS 连接到微控制器 CS、在读取数据时、我将 CS 设置为低电平读取20个字节并将其设置回高电平。 是正确的、或者我必须发送 Null 命令才能读取通道数据。
HAL_GPIO_WritePin (GPIOA、GPIO_PIN_4、GPIO_PIN_RESET);// CS 低电平
HAL_SPI_Receive (&hspi1、Rx_DATA、20、200);//读取20字节数据
HAL_GPIO_WritePin (GPIOA、GPIO_PIN_4、GPIO_PIN_SET); // CS 高电平
// HAL_DELAY (5);
uint32_t STATUS_RESPONSE = Rx_DATA[0]<<24 | Rx_DATA[1]<<16 | Rx_DATA[2]<<8 | Rx_DATA[3];
uint32_t ch0 = rx_data[4]<<24 |rx_data[5]<<16 | rx_data[6]<8 | rx_data[7];
uint32_t CH1 = Rx_DATA[8]<<24 |Rx_DATA[9]<<16 | Rx_DATA[10]<8 | Rx_DATA[11];
uint32_t CH2 = rx_data[12]<<24 |rx_data[13]<<16 | rx_data[14]<<8 | rx_data[15];
uint32_t ch3 = rx_data[16]<<24 |rx_data[17]<<16 | rx_data[18]<8 | rx_data[19];
尊敬的 Anshul:
感谢您的更新。
您的原理图连接声音正确。 当您保持/CS 为低电平并发送20个字节的 SCLK、并且 DIN 也为低电平时、您实际上已经在发送 NULL 命令。 在读取数据时、您不需要发送任何内容、只需发送 DIN 上的内容。
您是否在范围内查看过通信时序、以验证您是否满足所有时序规格? 请记住、同步从机模式需要一个固定的数据速率周期、该周期由/DRDY 下降沿之间的时间设置。 由于/DRDY 和/CS 在您的设置中连接在一起、因此数据速率周期还会建立通信帧的周期。 在下面的图66中、请注意/DRDY 和/CS 如何设置 DIN 和 DOUT 同时传输的通信帧大小。
如果这不是您打算与 ADS131A04进行通信的方式、则可能异步从模式更适合您的应用。
此致、