TI中文支持网
TI专业的中文技术问题搜集分享网站

ADS131B04-Q1: 关于 ADC SPI 数据的CRC校验问题咨询

Part Number:ADS131B04-Q1

你好,我使用 ADS131B04 进行产品开发,使用中遇到如下问题还请帮忙解答。谢谢。

1 . SPI 通信时 CRC 不清楚怎么使用,按如下方法使用时无法得到正常的CRC 校验。

初始化代码如下

void adcStartup(void)
{
	/* (OPTIONAL) Provide additional delay time for power supply settling */
	delay_ms_ADS131(50);

	/* (REQUIRED) Set nRESET pin high for ADC operation */
//	setSYNC_RESET(HIGH);

	/* (OPTIONAL) Toggle nRESET pin to ensure default register settings. */
	/* NOTE: This also ensures that the device registers are unlocked.	 */
//	toggleRESET();/* (REQUIRED) Initialize internal 'registerMap' array with device default settings 使用设备默认设置初始化内部“registerMap”数组*/
	restoreRegisterDefaults();/* (OPTIONAL) Validate first response word when beginning SPI communication: (0xFF40 | CHANCNT) (可选)开始 SPI 通信时验证第一个响应字:(0xFF40 | CHANCNT) */
	uint16_t response = sendCommand(OPCODE_NULL);

	/* (OPTIONAL) Define your initial register settings here (可选)在此处定义您的初始寄存器设置*/
//writeSingleRegister(CLOCK_ADDRESS, (CLOCK_DEFAULT & ~CLOCK_OSR_MASK) | CLOCK_OSR_256);
	writeSingleRegister(CLOCK_ADDRESS, (CLOCK_DEFAULT & ~CLOCK_OSR_MASK) | CLOCK_OSR_4096); /* 设置采样频率 *//* (REQUIRED) Configure MODE register settings (必需)配置模式寄存器设置* NOTE: This function call is required here for this particular code implementation to work. 注意:这里需要此函数调用才能使此特定代码实现正常工作。* This function will enforce the MODE register settings as selected in the 'ads131b04-q1.h' header file. 此函数将强制执行在“ads131b04-q1.h”头文件中选择的 MODE 寄存器设置。*/

//	writeSingleRegister(MODE_ADDRESS, MODE_DEFAULT);  /* 默认配置 */
	writeSingleRegister(MODE_ADDRESS, (MODE_DEFAULT & ~MODE_RX_CRC_EN_MASK & ~MODE_CRC_TYPE_MASK) | MODE_RX_CRC_EN_ENABLED | MODE_CRC_TYPE_16BIT_CCITT);  /* 默认配置,增加CRC */writeSingleRegister(GAIN_ADDRESS, (GAIN_DEFAULT & ~GAIN_PGAGAIN0_MASK) | GAIN_PGAGAIN0_1);writeSingleRegister(GAIN_ADDRESS, (GAIN_DEFAULT & ~GAIN_PGAGAIN1_MASK) | GAIN_PGAGAIN1_1);/* (OPTIONAL) Read back all registers */

	/* (OPTIONAL) Check STATUS register for faults */

}

SPI 通信数据 逻辑分析仪抓包如下

问题1:逻辑分析数据与 这个芯片TI官方 SDK 的 readData()函数读取类容相同, 但readData 函数的CRC校验失败,根据数据内容自己进行CRC计算也不符。请问该如何对数据进行 CRC 校验。

问题2:MISO 收到的数据前3个字节经常不同,中间6个字节是通道数据这个数据是正常的。请问 前三个字节数据怎么理解 ,是否是经常变化的数据。

问题3:如图 SDK的 readData函数中    uint16_t crcWordIn = calculateCRC(dataTx, bytesPerWord * 2, 0xFFFF);     dataTx长度是4,

bytesPerWord 是3,那计算CRC时 bytesPerWord *2 = 6 已经超过 dataTx 范围,这样的设计目的是什么?

lei yan:

问题已解决:自己回答

问题1:

1:说明,我只使用0,1 通道,所以 #define CHANNEL_COUNT (2) 宏设置了2, 同时就理解成了ADC  2,3 通道的数据不会输出,而 readData()函数读取的数据也不完整,导致陷入了 CRC 校验问题的陷阱。

2:实际上 无论  #define CHANNEL_COUNT (2) 设置的是几个通道,CLOCK Register寄存器中是否有关闭没使用的通道,SPI 读取时序仍然是按如下图进行的。

这就解释了,我问题中为什么读取的CRC数据是错误的,实际情况是  #define CHANNEL_COUNT (2) 设置了2,readData()函数读取数据不完整导致。

问题2:

前2个字节是 STATUS 状态寄存器的值,状态寄存器包含了多个功能,当有的条件触发时这个值就会变化具体规格书上有描述。

问题3: 估计是SDK的这部分代码错误导致,更改为 uint16_t crcWordIn = calculateCRC(dataTx, bytesPerWord, 0xFFFF); 后功能正常。

补充说明: SDK   readData()函数功能不完善,如果需要 CRC 功能甚至有错误,实际只提供了读取通道值的基本功能。

,

Amy Luo:

很高兴您的问题已解决,非常感谢您分享解决方法!

赞(0)
未经允许不得转载:TI中文支持网 » ADS131B04-Q1: 关于 ADC SPI 数据的CRC校验问题咨询
分享到: 更多 (0)