AD7793芯片CS引脚直接拉底通讯失败

2019-12-27 18:38发布

现在正在调试AD7793,由于用到电磁隔离,通道数不够用,于是直接将AD7793的CS片选引脚接到GND了,现在用STM32与其通信,首先对AD7793进行复位操作,然后读其内置ID寄存器,读数正确,但如果继续再读ID寄存器,则返回数据为255.
如果在每次读取之前都复位一次,则可以连续正常读取,但一次复位操作,只能保证一次正常读取操作。
而AD7793在正常使用的时候,需要连续配置多个寄存器,才能正常工作。


  1. /************************************************
  2. 函数:void AD7793_RESET(void)
  3. 功能:AD7793复位命令
  4. 参数:无
  5. 返回:复位AD7793
  6. *************************************************/
  7. void AD7793_RESET(void)
  8. {
  9.         u8 flag=0;
  10.         AD7793_DIN_HIGH();
  11.         for(flag=0;flag<32;flag++)
  12.         {
  13.                 AD7793_SCLK_LOW();
  14.                 delay_us(1);
  15.                 AD7793_SCLK_HIGH();
  16.                 delay_us(1);
  17.         }       
  18. }

  19. /************************************************
  20. 函数:void AD7793_WRITE_CR(u8 dat)
  21. 功能:将参数写入AD7793的通信寄存器
  22. 参数:被写入的数据
  23. 返回:无
  24. *************************************************/
  25. void AD7793_WRITE_CR(u8 dat)
  26. {
  27.         u8 flag=0;
  28.         for(flag=0;flag<8;flag++)
  29.         {
  30.                 AD7793_SCLK_LOW();
  31.                 delay_us(1);
  32.                
  33.                 if(dat&0x80)
  34.                         AD7793_DIN_HIGH();
  35.                 else
  36.                         AD7793_DIN_LOW();
  37.                
  38.                 AD7793_SCLK_HIGH();
  39.                 delay_us(1);
  40.                
  41.                 dat<<=1;
  42.         }
  43. }

  44. /************************************************
  45. 函数:u8 AD7793_READ_BYTE(void)
  46. 功能:从AD7793读取一个字节的数据
  47. 参数:无
  48. 返回:读取到的数据
  49. *************************************************/
  50. u8 AD7793_READ_BYTE(void)
  51. {
  52.         u8 flag=0;
  53.         u8 dat=0;
  54.         u8 readDat=0;
  55.         for(flag=0;flag<8;flag++)
  56.         {
  57.                 dat<<=1;
  58.                 AD7793_SCLK_HIGH();
  59.                 delay_us(1);
  60.                 AD7793_SCLK_LOW();
  61.                 delay_us(1);
  62.                 readDat=AD7793_READ_DATA();
  63.                 if(readDat)
  64.                         dat|=0x01;
  65.                 else
  66.                         dat&=0xfe;       
  67.         }
  68.         return dat;
  69. }
复制代码
我现在怀疑的问题,是不是因为我的CS引脚一直拉底,导致通信时序异步而错乱了呢????希望有经验的朋友帮忙解答一下

程序读取ID片段如下图所示:
QQ截图20170623105133.jpg (8.65 KB, 下载次数: 0) 下载附件 2017-6-23 10:51 上传
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
25条回答
20061002838
1楼-- · 2019-12-27 19:39
读完数据之后,SCK保持低电平
低电平读取数据
都不是规格书要求的时序
sdlqzql
2楼-- · 2019-12-27 23:32
20061002838 发表于 2017-6-23 11:32
读完数据之后,SCK保持低电平
低电平读取数据
都不是规格书要求的时序

麻烦您,能说的更详细点吗 我比较笨
你说"都不是规格书要求的时序"指的是我程序的时序跟规格书不对,还是规格书上说的时序不对,或者不完整?
谢谢
20061002838
3楼-- · 2019-12-28 00:02
 精彩回答 2  元偷偷看……
sdlqzql
4楼-- · 2019-12-28 04:29
20061002838 发表于 2017-6-23 12:50
前者,你的时序跟规格书描述的不一致

亲爱的朋友,谢谢你.你说的很对,就是因为空闲时sclk我是拉底,才导致的问题.改为空闲时拉高,就好了
sdlqzql
5楼-- · 2019-12-28 05:41
20061002838 发表于 2017-6-23 12:50
前者,你的时序跟规格书描述的不一致

朋友,我再请教你一个问题吧.
我用AD7793来配合PT100测温,手里没有PT100,于是接了一个150欧电阻模拟。
电路图如下:

QQ截图20170623162505.jpg (18.56 KB, 下载次数: 0)

下载附件

2017-6-23 16:25 上传


那么到最后,是需要用得到的电压值,计算出PT100的阻值,然后查表得到当前温度。那么应该如何求电阻?
如果用:电压值/电流源(210ua)
则:0.0327635V/210ua=156欧,这跟万用表实测的150欧电阻相差有点大!
cddyy
6楼-- · 2019-12-28 07:08
楼主看数据手册不仔细,如果开了BUF,那么AIN的最小电压是0.1v以上,同时REF电压也必须大于0.1v。

一周热门 更多>