注意两点事项,ADS1246、ADS1247、ADS1248的问题就可以迎刃而解了!
前些天调试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为高。
第一个注意点是SPI的特性,所有SPI的应用都需要这样。
我打开内部参考源,怎么在参考源输出管脚上测不到电压,我检查时序都是对的,可就是没有电压,奇怪,请问会是哪里的原因造成的