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,
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:
很高兴您的问题已解决,非常感谢您分享解决方法!