搜索
bottom↓
回复: 26

ADS1248神人用过?SPI接口,读写寄存器均能成功,为何读取AD值不行

[复制链接]

出0入0汤圆

发表于 2012-1-12 14:28:53 | 显示全部楼层 |阅读模式
用的是Atmega32的内部SPI操作,
读写寄存器都能成功,为何就是读取24Bit的结果时,却不行
//************读取D转换结果*************
void ReadADConv(uint8_t Channel,uint8_t* ADVaule)
{
          CLRCS;
        SendCMD(RDATA);               
        ADVaule[2]=SPISendReadByte(0xff);      //程序在此死住了
        ADVaule[1]=SPISendReadByte(0xff);
        ADVaule[0]=SPISendReadByte(0xff);
        SETCS;       
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-1-12 14:31:34 | 显示全部楼层
死在那里感觉和SPI配置或程序有关系吧,和那个ad应该没啥关系.

出0入85汤圆

发表于 2012-1-12 14:35:20 | 显示全部楼层
你是用的CVAVR?是用的编译器自带的SPI函数?SPI(0)是读
另外请上传你的电路图

出0入0汤圆

 楼主| 发表于 2012-1-12 14:43:50 | 显示全部楼层
回复【1楼】lichee 小松鼠
-----------------------------------------------------------------------

SPI的程序原来用来操作过TMP121,所以应该没有问题,并且我又看了一遍配置程序
读写ADS1248的寄存器是正常的


(原文件名:2.jpg)


我用的时AVRSTUDIO+WINAVR

(原文件名:3.jpg)

(原文件名:4.jpg)

出0入0汤圆

 楼主| 发表于 2012-1-12 14:48:29 | 显示全部楼层
ADS1248的DRDY引脚始终是低电平,
DRDY引脚应该是AD转换完成之后的变成低电平的

出0入4汤圆

发表于 2012-1-12 15:07:06 | 显示全部楼层
如果连续读会出现问题,解决的办法是分次读取,来保证读取不出问题

出0入0汤圆

发表于 2012-1-12 15:10:09 | 显示全部楼层
嗯~那就是死在那个SPIsendreadbyte函数的那个while等标志位里面了
那个标志位应该是SPI控制器在发送完后自动置位的,除非是从模式~感觉主模式和外部没啥关系.
看看SPI的初始化.
另外为啥你的sendcmd函数就可以执行通过,那个函数和sendreadbyte有啥区别?

出0入0汤圆

发表于 2012-1-12 15:11:37 | 显示全部楼层
这样子试试

我操作是直接读数据,不用发命令,就OK

回复【楼主位】qjs412_51  
用的是atmega32的内部spi操作,
读写寄存器都能成功,为何就是读取24bit的结果时,却不行
//************读取d转换结果*************
void readadconv(uint8_t channel,uint8_t* advaule)
{
          clrcs;
        //sendcmd(rdata);               
        advaule[2]=spisendreadbyte(0xff);      //程序在此死住了
        advaule[1]=spisendreadbyte(0xff);
        advaule[0]=spisendreadbyte(0xff);
        setcs;       
}

-----------------------------------------------------------------------

出0入0汤圆

 楼主| 发表于 2012-1-12 15:15:33 | 显示全部楼层
回复【5楼】electricit
-----------------------------------------------------------------------

单次读取和多次读取都不行

回复【6楼】lichee 小松鼠
-----------------------------------------------------------------------
#define        SendCMD(i)        SPISendReadByte(i)

两个函数一样,呵呵

就是死在了那个while等标志位里面了,一直在研究ADS1248的手册,也看了一下AVR的SPI的相关设置

确实没发现问题,哎

出0入0汤圆

 楼主| 发表于 2012-1-12 15:18:06 | 显示全部楼层
回复【7楼】size327948964
-----------------------------------------------------------------------

OK,我试试

另外,转换启动引脚START一直是置高的,没什么问题吧?

出0入0汤圆

发表于 2012-1-12 15:19:31 | 显示全部楼层
对 就是这样子
回复【9楼】qjs412_51  
回复【7楼】size327948964
-----------------------------------------------------------------------
ok,我试试
另外,转换启动引脚start一直是置高的,没什么问题吧?
-----------------------------------------------------------------------

出0入0汤圆

 楼主| 发表于 2012-1-12 15:21:44 | 显示全部楼层
回复【10楼】size327948964
-----------------------------------------------------------------------

直接读还是不行,还是死在那里了

出0入4汤圆

发表于 2012-1-12 15:22:48 | 显示全部楼层
uint8_t spisendreadbyte(void)
{
        SPDR = 0xFF;
        while(!(SPSR & 0x80));
        return SPDR;
}

出0入0汤圆

发表于 2012-1-12 15:23:50 | 显示全部楼层
你在什么情况下读?
应该在DRDY置低以后才能读

出0入0汤圆

 楼主| 发表于 2012-1-12 15:27:54 | 显示全部楼层
回复【13楼】size327948964
-----------------------------------------------------------------------

不知道为什DRDY一直为低,

出0入0汤圆

发表于 2012-1-12 15:31:41 | 显示全部楼层
SPSR |= _BV(SPIF);
这个似乎不用吧~以下引自mega32a DS 145页

Alternatively, the SPIF bit is cleared by first reading the
SPI Status Register with SPIF set, then accessing the SPI Data Register (SPDR).

在while那个语句中,SPIF已经被读取过了
只需要那个return一下,SPIF就clear了.
SPSR |= _BV(SPIF);注释掉这一句试试.

出0入0汤圆

 楼主| 发表于 2012-1-12 15:39:01 | 显示全部楼层
回复【15楼】lichee 小松鼠
-----------------------------------------------------------------------

好的,我试试看看

出0入0汤圆

 楼主| 发表于 2012-1-14 14:12:34 | 显示全部楼层
问题已经解决,采用模拟的的SPI模式解决的,幸好SPI比较容易模拟

代码留给需要的人参考

点击此处下载 ourdev_713089CSQG6Z.rar(文件大小:25K) (原文件名:ADS1248_Pro.rar)

出0入53汤圆

发表于 2012-11-14 16:31:10 | 显示全部楼层
谢谢喽 正需要这方面资料

出0入53汤圆

发表于 2012-11-14 16:31:46 | 显示全部楼层
qjs412_51 发表于 2012-1-14 14:12
问题已经解决,采用模拟的的SPI模式解决的,幸好SPI比较容易模拟

代码留给需要的人参考

这个芯片用着稳定吗

出0入53汤圆

发表于 2013-1-9 16:24:52 | 显示全部楼层
qjs412_51 发表于 2012-1-14 14:12
问题已经解决,采用模拟的的SPI模式解决的,幸好SPI比较容易模拟

代码留给需要的人参考

请问您用这个芯片数据稳定性怎么样,防静电之类的,之前我用的AD7793很差劲不稳定,想换个这个芯片试试

出0入0汤圆

发表于 2013-1-9 16:42:09 | 显示全部楼层
zhcj66 发表于 2013-1-9 16:24
请问您用这个芯片数据稳定性怎么样,防静电之类的,之前我用的AD7793很差劲不稳定,想换个这个芯片试试 ...

我当时只是做着试试看,并没有真正用在项目上,稳定性,按照我自己的板子,高15位稳定,低9位数据不可靠,可能和我做的板子有关

至于防静电之类的,说实话,不会测!不过之前用过TI的ads115,16bit(正负量程) 稳定性很不错,精度和稳定性都很好

出0入0汤圆

发表于 2013-3-15 16:37:02 | 显示全部楼层
请问,你读取寄存器的时候,信号输入等引脚是什么状态?悬空,拉低,还是正常输入?我现在连寄存器都不能正确读取,急!!请求帮助

出0入0汤圆

发表于 2013-3-18 18:38:35 | 显示全部楼层
qjs412_51 发表于 2012-1-14 14:12
问题已经解决,采用模拟的的SPI模式解决的,幸好SPI比较容易模拟

代码留给需要的人参考

为什么用模拟的就解决了,用自带的SPI就不行呢?

出0入0汤圆

发表于 2013-3-22 10:23:46 | 显示全部楼层
qjs412_51 发表于 2012-1-14 14:12
问题已经解决,采用模拟的的SPI模式解决的,幸好SPI比较容易模拟

代码留给需要的人参考

读写寄存器正常,为什么读数据全为0啊,寄存器需要设置哪些?求解!

出0入0汤圆

发表于 2013-3-22 10:26:45 | 显示全部楼层
size327948964 发表于 2012-1-12 15:11
这样子试试

我操作是直接读数据,不用发命令,就OK

你好,我在调试ADS1282跟这个AD差不多,我现在读写寄存器可以了,就是数据一直为0,请帮帮我吧,我实在没办法了。。。

出0入0汤圆

发表于 2014-3-12 16:33:58 | 显示全部楼层
请问那个ADS1248,写和读寄存器的那个 Second Command Byte: 0000 nnnn, where nnnn is the number of bytes to read –1 是什么意思,求大神
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 13:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表