现在正在调试AD7793,由于用到电磁隔离,通道数不够用,于是直接将AD7793的CS片选引脚接到GND了,现在用STM32与其通信,首先对AD7793进行复位操作,然后读其内置ID寄存器,读数正确,但如果继续再读ID寄存器,则返回数据为255.
如果在每次读取之前都复位一次,则可以连续正常读取,但一次复位操作,只能保证一次正常读取操作。
而AD7793在正常使用的时候,需要连续配置多个寄存器,才能正常工作。
- /************************************************
- 函数:void AD7793_RESET(void)
- 功能:AD7793复位命令
- 参数:无
- 返回:复位AD7793
- *************************************************/
- void AD7793_RESET(void)
- {
- u8 flag=0;
- AD7793_DIN_HIGH();
- for(flag=0;flag<32;flag++)
- {
- AD7793_SCLK_LOW();
- delay_us(1);
- AD7793_SCLK_HIGH();
- delay_us(1);
- }
- }
- /************************************************
- 函数:void AD7793_WRITE_CR(u8 dat)
- 功能:将参数写入AD7793的通信寄存器
- 参数:被写入的数据
- 返回:无
- *************************************************/
- void AD7793_WRITE_CR(u8 dat)
- {
- u8 flag=0;
- for(flag=0;flag<8;flag++)
- {
- AD7793_SCLK_LOW();
- delay_us(1);
-
- if(dat&0x80)
- AD7793_DIN_HIGH();
- else
- AD7793_DIN_LOW();
-
- AD7793_SCLK_HIGH();
- delay_us(1);
-
- dat<<=1;
- }
- }
- /************************************************
- 函数:u8 AD7793_READ_BYTE(void)
- 功能:从AD7793读取一个字节的数据
- 参数:无
- 返回:读取到的数据
- *************************************************/
- u8 AD7793_READ_BYTE(void)
- {
- u8 flag=0;
- u8 dat=0;
- u8 readDat=0;
- for(flag=0;flag<8;flag++)
- {
- dat<<=1;
- AD7793_SCLK_HIGH();
- delay_us(1);
- AD7793_SCLK_LOW();
- delay_us(1);
- readDat=AD7793_READ_DATA();
- if(readDat)
- dat|=0x01;
- else
- dat&=0xfe;
- }
- return dat;
- }
复制代码
我现在怀疑的问题,是不是因为我的CS引脚一直拉底,导致通信时序异步而错乱了呢????希望有经验的朋友帮忙解答一下
程序读取ID片段如下图所示:
QQ截图20170623105133.jpg (8.65 KB, 下载次数: 0)
下载附件
2017-6-23 10:51 上传
亲爱的朋友,谢谢你.你说的很对,就是因为空闲时sclk我是拉底,才导致的问题.改为空闲时拉高,就好了
一周热门 更多>