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.

注意两点事项,ADS1246、ADS1247、ADS1248的问题就可以迎刃而解了!

Other Parts Discussed in Thread: ADS1248, ADS1246, ADS1247

    前些天调试ADS1248,遇到很多奇怪问题,花了近两周时间,几乎把网上的相关讨论都看了。最后自己反复试验和琢磨,总算是把这个芯片搞得差不多了。给大家分享一下,少走些弯路。
    我用的是STM32F103的3.5库函数开发的,可以完美操作这款芯片。一些常见注意事项,大家在网上都可以看到。只想说一下我的心得体会,只要掌握以下两点,基本上很多奇怪的问题就解决了,这两条也适用于ADS1246和ADS1247。

1、最后一条写寄存器操作,在CS拉高之前,必须要等数据被发完(不是送到发送缓冲就完事了),可以加延时,也可以加发一条NOP指令(会等待发送缓冲空,相当于上条有效命令发完),保证上条指令写入数据完成再拉高CS。
/*
 * 函数名:SPI1_ReadWriteByte
 * 描述  :SPI1 读写一个字节
 * 输入  :TxData:要写入的字节
 * 输出  :读取到的字节
 */
u8 SPI1_ReadWriteByte(u8 TxData)
{  
 vu16 retry = 0;
 u16 dat;
 
 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)  //检查发送缓存空标志位,等待发送区空
 {
  retry++;
  if (retry > 200) return 0;
 }    
 SPI_I2S_SendData(SPI1, TxData);      //通过外设SPI1发送一个数据
 
 retry=0;
 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查接收缓存非空标志位,等待接收完一个字节
 {
  retry++;
  if (retry > 200) return 0;
 }
 dat = SPI_I2S_ReceiveData(SPI1);
 return (u8)dat;        //返回通过SPI1最近接收的数据   

     
}
/*
 * 函数名:ADS1248_WriteReg
 * 描述  :写ADS1248的寄存器
 * 输入  : RegAddr 寄存器起始地址
 *   *Buffer 存放待写入数据的指针
 *   length 数据字节数
 * 输出  :无
 * 返回  :无
 */
void ADS1248_WriteReg(u8 RegAddr,u8 *Buffer,u8 Length)
{
 u8 Cmd[2];
 
 ADS1248_CS_0;
 Cmd[0] = ADC_CMD_WREG|RegAddr;
 Cmd[1] = Length - 1;
 spi_write_bytes(Cmd,2);
 spi_write_bytes(Buffer,Length);
 Cmd[0] = ADC_CMD_NOP;  //发一条空操作,保证上条指令被从机读走
 spi_write_bytes(Cmd,1);
 //Delay_us(20);   //或者用这条延时,不用发NOP指令
 ADS1248_CS_1;
}
    很多用库函数的写指令有时不成功,而用软件模拟的就可以,估计就是这个问题吧。因为库函数操作只是写入缓冲,就退出了,没有等待数据送走,就把CS拉高了。

2、手册提到,START脚为低,芯片处于sleep模式,此时只有RDATA、RDATAC、SDATAC、WAKEUP、NOP命令是有效的。网上很多例程写命令前没有让START为高。自己试过,好像读写寄存器的操作还是有效的。但是有些情况下又不正常,例如改变转换速率。试验还发现,校验指令前必须置位START,否则校验不成功,而且寄存器被全部清零,重新写入也无效。所以,为了保险起见,操作寄存器我一直让START为高。