打印

ADS1293 spi数据读取

[复制链接]
9951|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
twins7713|  楼主 | 2013-12-30 11:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

这是1293的时序图
这是我SPI读写程序,可以写入,示波器也能看见SCLK的的波形,但是
/****************写入命令和数据******************/

void ADS_Write(unsigned char ADS_COM,unsigned char ADS_DAT)
{
ADS_CS = 0;        // SSN LOW
U0DBUF = ADS_COM; while (!(U0CSR&0x02)); U0CSR &= 0xFD;
U0DBUF = ADS_DAT; while (!(U0CSR&0x02)); U0CSR &= 0xFD;
unsigned char temp = U0DBUF;
ADS_CS = 1;        // SSN high
}

/********************************
  从SPI器件读出一个字节数据
********************************/
unsigned char ADS_read(unsigned char ADS_addr)
{
unsigned char ADS_DAT;
ADS_CS = 0;        // SSN LOW
U0DBUF = 0x80+ADS_addr;
while (!(U0CSR&0x02)); U0CSR &= 0xFD;
ADS_DAT = U0DBUF;
ADS_CS=1;
return ADS_DAT;
}

//初始化
  ADS_Write(0x01,0x11);  //IN1连CH1- ,IN2连CH1+
  Delay(1000);
  ADS_Write(0x02,0x19);  //IN1连CH2- ,IN3连CH2+
  Delay(1000);
  ADS_Write(0x03,0x2E);
  Delay(1000);
  ADS_Write(0x0A,0x07);  // 共模检测IN1,IN2,IN3.
  Delay(1000);
  ADS_Write(0x0C,0x04);  //通道IN4 为右腿驱动
  Delay(1000);
  ADS_Write(0x0D,0x01);  //威尔逊参考输入IN1
  Delay(1000);
  ADS_Write(0x0E,0x02);  //威尔逊参考输入IN2
  Delay(1000);
  ADS_Write(0x0F,0x03);  //威尔逊参考输入IN3
  Delay(1000);
  ADS_Write(0x10,0x01);  //威尔逊选择
  Delay(1000);
  ADS_Write(0x12,0x04);   //使能时钟  注意:设置此位高后,才振荡器起振后或振荡器已关闭和外部时钟已经开始了。
  Delay(1000);
  ADS_Write(0x21,0x02);  //抽取率?????
  Delay(1000);
  ADS_Write(0x22,0x02);
  Delay(1000);
  ADS_Write(0x23,0x02);
  Delay(1000);
  ADS_Write(0x24,0x02);
  Delay(1000);
  ADS_Write(0x27,0x08);   //Data Ready Pin Source  Driven by channel 1 ECG
  Delay(1000);
  ADS_Write(0x2F,0x70);  // 配置通道的环回读模式
  Delay(1000);
  ADS_Write(0x01,0x01);


void main(void)
{
    uchar count = 0;
    uchar LDate,MDate,HDate;
    uint ALLDate;
    Init_T4_AND_LED();
    INT_ADS1293();
    //Set_Spi();
    while(1)
    {

      LDate=ADS_read(TI_ADS1293_DATA_CH1_ECG_L_REG);
      MDate=ADS_read(TI_ADS1293_DATA_CH1_ECG_M_REG);  
      HDate=ADS_read(TI_ADS1293_DATA_CH1_ECG_H_REG);
      ALLDate=LDate+MDate*255+HDate*255*255;  
    };

总是不能返回数据,我用中断模式去读取数据,DRDYB也不会被拉低,就是说没有返回数据,请高手看下,哪里有错误,或者可能是哪里的错误?

相关帖子

沙发
玄德| | 2013-12-30 14:40 | 只看该作者
用示波器看几个管脚,波形对不对,然后再分析。

使用特权

评论回复
板凳
twins7713|  楼主 | 2013-12-30 15:29 | 只看该作者
玄德 发表于 2013-12-30 14:40
用示波器看几个管脚,波形对不对,然后再分析。

示波器看了,CS、CLK、MOSI都有方波波形,但就是不回数据,可能是ADS1293配置没对吗?

使用特权

评论回复
地板
airwill| | 2013-12-30 15:33 | 只看该作者
/********************************
  从SPI器件读出一个字节数据
********************************/
unsigned char ADS_read(unsigned char ADS_addr)
{
unsigned char ADS_DAT;
ADS_CS = 0;        // SSN LOW
U0DBUF = 0x80+ADS_addr;
while (!(U0CSR&0x02)); U0CSR &= 0xFD;
ADS_DAT = U0DBUF;
ADS_CS=1;
return ADS_DAT;
}

这样的时序是不对的, 应该在
U0DBUF = 0x80+ADS_addr;
后面再假写一个字符. 比如添加一行:
  while (!(U0CSR&0x02)); U0DBUF = 0x0;

使用特权

评论回复
5
twins7713|  楼主 | 2013-12-30 15:41 | 只看该作者
airwill 发表于 2013-12-30 15:33
/********************************
  从SPI器件读出一个字节数据
********************************/

为什么呢,请高手解释下,小弟初次使用,是为了时钟吗?

使用特权

评论回复
6
twins7713|  楼主 | 2013-12-30 15:43 | 只看该作者
airwill 发表于 2013-12-30 15:33
/********************************
  从SPI器件读出一个字节数据
********************************/

我改成

unsigned char ADS_read(unsigned char ADS_addr)
{
unsigned char ADS_DAT;
ADS_CS = 0;        // SSN LOW
U0DBUF = 0x80+ADS_addr;
while (!(U0CSR&0x02)); U0CSR &= 0xFD;
U0DBUF = 0x00;
while (!(U0CSR&0x02)); U0CSR &= 0xFD;
ADS_DAT = U0DBUF;
ADS_CS=1;
return ADS_DAT;
}

但依旧不回数据。

使用特权

评论回复
7
airwill| | 2013-12-30 15:44 | 只看该作者
因为要 16位的波形, 写两个字节才能得到 16 位嘛.
这是硬件相关的编程, 先试一试, 用示波器验证一下波形, 你就能想明白了.

使用特权

评论回复
8
twins7713|  楼主 | 2013-12-30 15:57 | 只看该作者
airwill 发表于 2013-12-30 15:44
因为要 16位的波形, 写两个字节才能得到 16 位嘛.
这是硬件相关的编程, 先试一试, 用示波器验证一下波形,  ...
unsigned char ADS_read(unsigned char ADS_addr)
{
unsigned char ADS_DAT;
ADS_CS = 0;        // SSN LOW
U0DBUF = 0x80+ADS_addr;
while (!(U0CSR&0x02)); U0CSR &= 0xFD;
U0DBUF = 0x00;
while (!(U0CSR&0x02)); U0CSR &= 0xFD;
ADS_DAT = U0DBUF;
ADS_CS=1;
return ADS_DAT;
}


改为这样了,还是没有收到数据,CS、CLK、MOSI都有方波波形。

使用特权

评论回复
9
twins7713|  楼主 | 2013-12-30 16:56 | 只看该作者
airwill 发表于 2013-12-30 15:44
因为要 16位的波形, 写两个字节才能得到 16 位嘛.
这是硬件相关的编程, 先试一试, 用示波器验证一下波形,  ...

CPOL CPHA 都为0,对吧。

使用特权

评论回复
10
dirtwillfly| | 2013-12-30 19:49 | 只看该作者
楼主用的什么单片机?

使用特权

评论回复
11
zxf0168| | 2013-12-30 21:05 | 只看该作者
威尔逊参数?这是什么单片机?

使用特权

评论回复
12
twins7713|  楼主 | 2013-12-30 21:54 | 只看该作者
cc2540

使用特权

评论回复
13
shenpingbing| | 2013-12-30 22:08 | 只看该作者
示波器抓一下波形

使用特权

评论回复
14
airwill| | 2013-12-31 08:59 | 只看该作者
twins7713 发表于 2013-12-30 16:56
CPOL CPHA 都为0,对吧。

CPOL CPHA 对照手册吧
时钟波形和采样点边沿来确定.

使用特权

评论回复
15
twins7713|  楼主 | 2013-12-31 09:22 | 只看该作者
airwill 发表于 2013-12-31 08:59
CPOL CPHA 对照手册吧
时钟波形和采样点边沿来确定.

看这里的时序图,起始的CLK为高电平,所以CPOL=1,。由于第二个延边为上升沿,所以CPHA=1,对吗?

使用特权

评论回复
16
niuyaliang| | 2013-12-31 12:08 | 只看该作者
最讨厌自己写神马时序了,纠结的愁

使用特权

评论回复
17
twins7713|  楼主 | 2013-12-31 13:35 | 只看该作者
niuyaliang 发表于 2013-12-31 12:08
最讨厌自己写神马时序了,纠结的愁

我也是呀,试了几天了,就是不出数据,还不知道哪里的问题。

使用特权

评论回复
18
地瓜patch| | 2013-12-31 14:03 | 只看该作者
楼主,提醒你一点,在读取数据的时候,其clk是用的写入数据时的时钟。
换句话说,你在写入一个空数据的同时读取一个数据

使用特权

评论回复
19
twins7713|  楼主 | 2013-12-31 14:25 | 只看该作者
地瓜patch 发表于 2013-12-31 14:03
楼主,提醒你一点,在读取数据的时候,其clk是用的写入数据时的时钟。
换句话说,你在写入一个空数据的同时 ...

写入一个空数据的同时读取一个数据如何做到,我上面的写法是写入了8位空数据后立即去读取8为数据,如果要同时读取,那就得自己写时序了,对吗?

使用特权

评论回复
20
地瓜patch| | 2013-12-31 14:33 | 只看该作者
twins7713 发表于 2013-12-31 14:25
写入一个空数据的同时读取一个数据如何做到,我上面的写法是写入了8位空数据后立即去读取8为数据,如果要 ...

你用spi接口的话,直接读接收寄存器即可。用模拟spi的话,需要自己写时序,在写入一个bit的同时读出一个bit

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

29

帖子

1

粉丝