qjs412_51 发表于 2012-1-12 14:28:53

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

用的是Atmega32的内部SPI操作,
读写寄存器都能成功,为何就是读取24Bit的结果时,却不行
//************读取D转换结果*************
void ReadADConv(uint8_t Channel,uint8_t* ADVaule)
{
          CLRCS;
        SendCMD(RDATA);               
        ADVaule=SPISendReadByte(0xff);      //程序在此死住了
        ADVaule=SPISendReadByte(0xff);
        ADVaule=SPISendReadByte(0xff);
        SETCS;       
}

lichee 发表于 2012-1-12 14:31:34

死在那里感觉和SPI配置或程序有关系吧,和那个ad应该没啥关系.

marshallemon 发表于 2012-1-12 14:35:20

你是用的CVAVR?是用的编译器自带的SPI函数?SPI(0)是读
另外请上传你的电路图

qjs412_51 发表于 2012-1-12 14:43:50

回复【1楼】lichee 小松鼠
-----------------------------------------------------------------------

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

http://cache.amobbs.com/bbs_upload782111/files_50/ourdev_712578GEY92R.jpg
(原文件名:2.jpg)


我用的时AVRSTUDIO+WINAVR
http://cache.amobbs.com/bbs_upload782111/files_50/ourdev_712579CZE5SW.jpg
(原文件名:3.jpg)
http://cache.amobbs.com/bbs_upload782111/files_50/ourdev_712580CKIXNN.jpg
(原文件名:4.jpg)

qjs412_51 发表于 2012-1-12 14:48:29

ADS1248的DRDY引脚始终是低电平,
DRDY引脚应该是AD转换完成之后的变成低电平的

electricit 发表于 2012-1-12 15:07:06

如果连续读会出现问题,解决的办法是分次读取,来保证读取不出问题

lichee 发表于 2012-1-12 15:10:09

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

size327948964 发表于 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=spisendreadbyte(0xff);      //程序在此死住了
        advaule=spisendreadbyte(0xff);
        advaule=spisendreadbyte(0xff);
        setcs;       
}

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

qjs412_51 发表于 2012-1-12 15:15:33

回复【5楼】electricit
-----------------------------------------------------------------------

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

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

两个函数一样,呵呵

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

确实没发现问题,哎

qjs412_51 发表于 2012-1-12 15:18:06

回复【7楼】size327948964
-----------------------------------------------------------------------

OK,我试试

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

size327948964 发表于 2012-1-12 15:19:31

对 就是这样子
回复【9楼】qjs412_51
回复【7楼】size327948964
-----------------------------------------------------------------------
ok,我试试
另外,转换启动引脚start一直是置高的,没什么问题吧?
-----------------------------------------------------------------------

qjs412_51 发表于 2012-1-12 15:21:44

回复【10楼】size327948964
-----------------------------------------------------------------------

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

electricit 发表于 2012-1-12 15:22:48

uint8_t spisendreadbyte(void)
{
      SPDR = 0xFF;
      while(!(SPSR & 0x80));
      return SPDR;
}

size327948964 发表于 2012-1-12 15:23:50

你在什么情况下读?
应该在DRDY置低以后才能读

qjs412_51 发表于 2012-1-12 15:27:54

回复【13楼】size327948964
-----------------------------------------------------------------------

不知道为什DRDY一直为低,

lichee 发表于 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);注释掉这一句试试.

qjs412_51 发表于 2012-1-12 15:39:01

回复【15楼】lichee 小松鼠
-----------------------------------------------------------------------

好的,我试试看看

qjs412_51 发表于 2012-1-14 14:12:34

问题已经解决,采用模拟的的SPI模式解决的,幸好SPI比较容易模拟

代码留给需要的人参考

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

zhcj66 发表于 2012-11-14 16:31:10

谢谢喽 正需要这方面资料

zhcj66 发表于 2012-11-14 16:31:46

qjs412_51 发表于 2012-1-14 14:12 static/image/common/back.gif
问题已经解决,采用模拟的的SPI模式解决的,幸好SPI比较容易模拟

代码留给需要的人参考


这个芯片用着稳定吗

zhcj66 发表于 2013-1-9 16:24:52

qjs412_51 发表于 2012-1-14 14:12 static/image/common/back.gif
问题已经解决,采用模拟的的SPI模式解决的,幸好SPI比较容易模拟

代码留给需要的人参考


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

qjs412_avr 发表于 2013-1-9 16:42:09

zhcj66 发表于 2013-1-9 16:24 static/image/common/back.gif
请问您用这个芯片数据稳定性怎么样,防静电之类的,之前我用的AD7793很差劲不稳定,想换个这个芯片试试 ...

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

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

李帅 发表于 2013-3-15 16:37:02

请问,你读取寄存器的时候,信号输入等引脚是什么状态?悬空,拉低,还是正常输入?我现在连寄存器都不能正确读取,急!!请求帮助{:dizzy:}

李帅 发表于 2013-3-18 18:38:35

qjs412_51 发表于 2012-1-14 14:12 static/image/common/back.gif
问题已经解决,采用模拟的的SPI模式解决的,幸好SPI比较容易模拟

代码留给需要的人参考


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

李帅 发表于 2013-3-22 10:23:46

qjs412_51 发表于 2012-1-14 14:12 static/image/common/back.gif
问题已经解决,采用模拟的的SPI模式解决的,幸好SPI比较容易模拟

代码留给需要的人参考


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

李帅 发表于 2013-3-22 10:26:45

size327948964 发表于 2012-1-12 15:11 static/image/common/back.gif
这样子试试

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


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

a273798630 发表于 2014-3-12 16:33:58

请问那个ADS1248,写和读寄存器的那个 Second Command Byte: 0000 nnnn, where nnnn is the number of bytes to read –1 是什么意思,求大神
页: [1]
查看完整版本: ADS1248神人用过?SPI接口,读写寄存器均能成功,为何读取AD值不行