1. 问题:ADS131A02初始化时,发送RESET指令后,可以接收到其响应FF02;但是接下来发送UNLOCK指令后,去接收不到其响应0655,用NULL指令去读取响应,也得不到。这是为什么?
2.. 条件:STM32F030CCT6驱动ADS131A02,ADS131A02采用SPI同步从模式、32位数据帧格式、开启汉明码(M0: 悬空,M1:上拉,M2:上拉)
我按照数据手册的时序图写的代码。
“`
//读写命令函数
uint16_t ADS131A02_Write_CMD(uint16_t command)
{
uint16_t receive = 0X0000;
SPI2_CS_LOW();
receive = SPI2_Write_Read((uint8_t)(command>>8));
receive <<= 8;
receive |= SPI2_Write_Read((uint8_t)(command&0X00FF));
SPI2_Write_Read(0X00);
SPI2_Write_Read(0X00);
SPI2_CS_HIGH();
delay_us(10);
}
//ADS初始化
void ADS131A02_Init(void)
{
uint16_t receive_ack = 0x0000;
ADS_RESET_HIGH();//初始化时,复位引脚必须拉高
ADS131A02_Write_CMD(0X0011);发送RESET指令
do
{
delay_ms(6);//需要延时4.5ms以上才能完成复位周期
receive_ack = ADS131A02_Write_CMD(0X0000);//发送NULL指令,读取RESET命令的响应
}while(receive_ack != 0XFF02);
printf("Receive RESET Command Ack is:%#X\n",receive_ack);
ADS131A02_Write_CMD(0X0655);发送UNLOCK指令
do
{
delay_ms(6);
receive_ack = ADS131A02_Write_CMD(0X0000);//发送NULL指令,读取UNLOCK命令的响应
}while(receive_ack != 0X0655);
printf("Receive UNLOCK Command Ack is:%#X\n",receive_ack);//这里接收不到0X0655,直接卡死在while循环这。
while(1);
}
user6058605:
1. 问题:ADS131A02初始化时,发送RESET指令后,可以接收到其响应FF02;但是接下来发送UNLOCK指令后,去接收不到其响应0655,用NULL指令去读取响应,也得不到。这是为什么?2. 条件:STM32F030CCT6驱动ADS131A02,ADS131A02采用SPI同步从模式、32位数据帧格式、开启汉明码(M0: 悬空,M1:上拉,M2:上拉)我按照数据手册的时序图写的代码。“`//读写32位命令函数uint16_t ADS131A02_Write_CMD(uint16_t command){ uint16_t receive = 0X0000; SPI2_CS_LOW(); receive = SPI2_Write_Read((uint8_t)(command>>8)); receive <<= 8; receive |= SPI2_Write_Read((uint8_t)(command&0X00FF)); SPI2_Write_Read(0X00); SPI2_Write_Read(0X00); SPI2_CS_HIGH(); delay_us(10);}//ADS初始化void ADS131A02_Init(void){ uint16_t receive_ack = 0x0000; ADS_RESET_HIGH();//初始化时,复位引脚必须拉高 ADS131A02_Write_CMD(0X0011);发送RESET指令 do { delay_ms(6);//需要延时4.5ms以上才能完成复位周期 receive_ack = ADS131A02_Write_CMD(0x0000);//发送NULL指令,读取RESET命令的响应 }while(receive_ack != 0XFF02); printf("Receive RESET Command Ack is:%#X\n",receive_ack); ADS131A02_Write_CMD(0X0655);发送UNLOCK指令 do { delay_ms(6); receive_ack = ADS131A02_Write_CMD(0x0000);//发送NULL指令,读取UNLOCK命令的响应 }while(receive_ack != 0X0655); printf("Receive UNLOCK Command Ack is:%#X\n",receive_ack);}
Kailyn Chen:
怀疑您的上电时序还没有完全完成就发送指令了,发送unclock收不到相应说明不能使能SPI接口。 参考Figure74的时序. UNLOCK from a POR Command Status Response 以及datasheet Page 52 关于9.5.3.6.1 UNLOCK from POR or RESET的介绍:
www.ti.com/…/ads131a02.pdf
user6058605:
回复 Kailyn Chen:
我说按照datasheet Page 52说明和Figure74来做的。复位完成后,先发一个NULL指令,再发UNLOCK指令,最后通过NULL指令进行读取UNKOCK指令的状态响应
user6058605:
回复 user6058605:
即使是这样,依然读取不到OX0655,只能读取到FF02
user6058605:
回复 Kailyn Chen:
即使是这样,依然只能得到FF02,而得不到0655
Kailyn Chen:
回复 user6058605:
把M1接地,改成24bit的数据帧的格式再试试,看是否能收到Unlock的ACK指令。
user6058605:
回复 Kailyn Chen:
把M1接地,24位格式,也只能接收到FF02,接收不到UNLOCK的ACK(0655)
user6058605:
回复 Kailyn Chen:
我把DOUT(MISO)引脚在STM32上设置为复用推挽输出,同时外部接100K上拉电阻,是不是这个的缘故?按通用SPI总线接口模式,应该将MISO设置为浮空输入模式。
Kailyn Chen:
回复 user6058605:
收不到unlock指令的话,说明这个器件并没有正确的接收输入指令,也就是说要检查下DIN是否没问题?
另外,再检查下电源是否没问题,DIN焊接上是否有问题,导致DIN不能正确接入?
方便的话把DOUT浮空输入再试试。
user6058605:
回复 Kailyn Chen:
恩,昨天禁用Hamming Code后,代码可以正常运行了。但是一旦启用Hamming Code后,就不能运行了,又恢复到以前状态了。
启用Hamming Code时,发送的命令格式:16bit + 8bit zeroes + 8bit HC,这8bit HC改怎么发送?