现在正在调试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我是拉底,才导致的问题.改为空闲时拉高,就好了
朋友,我再请教你一个问题吧.
我用AD7793来配合PT100测温,手里没有PT100,于是接了一个150欧电阻模拟。
电路图如下:
QQ截图20170623162505.jpg (18.56 KB, 下载次数: 0)
下载附件
2017-6-23 16:25 上传
那么到最后,是需要用得到的电压值,计算出PT100的阻值,然后查表得到当前温度。那么应该如何求电阻?
如果用:电压值/电流源(210ua)
则:0.0327635V/210ua=156欧,这跟万用表实测的150欧电阻相差有点大!
一周热门 更多>