OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1492|回复: 0

rt_thread操作系统下驱动ADS1256

[复制链接]

17

主题

47

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-10-8
在线时间
217 小时
发表于 2023-11-3 20:18:01 | 显示全部楼层 |阅读模式
1、在rt_thread操作系统中,首先在board.h中完成开启SPI的宏定义、将GPIO引脚初始化函数移植到board.c的末尾等固定操作。
2、关于spi的工作模式,设置如下:(注意:CPOL=0,CPHA=1,ADS1256需要在SCLK的上升沿的时候将数据发送至DIN引脚,需要在SCLK下降沿的时候把DOUT引脚的数据接收)

3、RST,SYNC设置为高电平

4、在对ADS1256的寄存器写命令的时候,(一般写寄存器的命令格式是:寄存器地址+需要写入的字节数+写入的数据)特别强调:片选信号在传输的第一个字节拉低,传输的第三个字节在拉高,中间一直拉低。
/*******定义向ADS1256写命令的函数*******************************
* 输入参数:regaddr : 需要写入的寄存器地址
*         datatype: 需要向寄存器写入的数据
* 输出参数:无
* ****************************************************/
void ads1256_wreg(unsigned char regaddr,unsigned char datatype)
{
      rt_uint8_t sendbuf[3]={0};
      sendbuf[0]= ADS1256_CMD_WREG | (regaddr & 0xF);
      sendbuf[1]= 0x00;
      sendbuf[2]= datatype;

      /***********************自定义SPI的发送命令******************************/
      struct rt_spi_message msg1,msg2,msg3;

      msg1.send_buf=&sendbuf[0];
      msg1.recv_buf=RT_NULL;
      msg1.length=1;
      msg1.cs_take=1;     
      msg1.cs_release=0;
      msg1.next=&msg2;

      msg2.send_buf=&sendbuf[1];
      msg2.recv_buf=RT_NULL;
      msg2.length=1;
      msg2.cs_take=0;
      msg2.cs_release=0;
      msg2.next=&msg3;

      msg3.send_buf=&sendbuf[2];
      msg3.recv_buf=RT_NULL;
      msg3.length=1;
      msg3.cs_take=0;
      msg3.cs_release=1;
      msg3.next=RT_NULL;

      while(rt_pin_read(ADS1256_DRDY)==PIN_HIGH);     //等待ADS1256引脚变为低电平,开始写入命令

      rt_spi_transfer_message(spi_dev_ads1256, &msg1); //根据自定义的SPI通信方式将数据发送出去
      //rt_spi_send(spi_dev_ads1256,&sendbuf,3);//连续发出WREG_MUX寄存器地址,需要写入的字节数,需要写入的字节
}

5、读取数据的函数中,需要注意的是,在向MUX通道寄存器写入命令的时候,在写完第三个字节之后,片选信号继续拉低,直到数据被读取完成后才能释放片选信号。
/************************************************
* 函数作用:从ADS1256中读取数据
* 输入参数:channel:采集通道
*  输出参数: sum:采集到的电压值
* *************************************************/
unsigned long ADS1256ReadData(unsigned char channel)
{
    char cmd_sendbuf[3]={0};
    cmd_sendbuf[0]=ADS1256_CMD_SYNC;   //同步指令
    cmd_sendbuf[1]=ADS1256_CMD_WAKEUP; //唤醒指令
    cmd_sendbuf[2]=ADS1256_CMD_RDATA;  //读取数据的指令

    char readbuf[3]={0}; //用来存放三次采集的数据
    unsigned long sum=0;//最终的数据

    /*************************自定义SPI传输方式**********************************/
    struct rt_spi_message msg1,msg2,msg3;

    msg1.send_buf=&cmd_sendbuf[0];
    msg1.recv_buf=RT_NULL;
    msg1.length=1;
    msg1.cs_take=1;//片选信号开始拉低
    msg1.cs_release=0;
    msg1.next=&msg2;

    msg2.send_buf=&cmd_sendbuf[1];
    msg2.recv_buf=RT_NULL;
    msg2.length=1;
    msg2.cs_take=0;
    msg2.cs_release=0;
    msg2.next=&msg3;

    msg3.send_buf=&cmd_sendbuf[2];
    msg3.recv_buf=RT_NULL;
    msg3.length=1;
    msg3.cs_take=0;
    msg3.cs_release=0;     //在发送完RDATA之后,片选信号不释放,继续拉低
    msg3.next=RT_NULL;

    /***************************读取数据****************************/
    struct rt_spi_message msg4,msg5,msg6;

    msg4.send_buf=RT_NULL;
    msg4.recv_buf=&readbuf[0];
    msg4.length=1;
    msg4.cs_take=0;             //CS片选信号开始接收的时候,也是低电平
    msg4.cs_release=0;
    msg4.next=&msg5;

    msg5.send_buf=RT_NULL;
    msg5.recv_buf=&readbuf[1];
    msg5.length=1;
    msg5.cs_take=0;
    msg5.cs_release=0;
    msg5.next=&msg6;

    msg6.send_buf=RT_NULL;
    msg6.recv_buf=&readbuf[2];
    msg6.length=1;
    msg6.cs_take=0;
    msg6.cs_release=1;           //当接收完毕所有数据的时候,将CS片选信号拉高
    msg6.next=RT_NULL;
    //while(rt_pin_read(ADS1256_DRDY)==PIN_HIGH);

    /************************首先更换通道****************/
    ads1256_wreg(ADS1256_MUX,channel);//首先延迟2us,然后开始下达指令
    //rt_hw_us_delay(2);
    while(rt_pin_read(ADS1256_DRDY)==PIN_HIGH); //当DRDY为低的时候,才能发送读取数据的命令(RDATA)

    rt_spi_transfer_message(spi_dev_ads1256, &msg1); //连续发送SYNC,WAKEUP,RDATA的指令
    rt_hw_us_delay(10);              //在发送完毕RDATA之后,数据需要延迟等待至少6.5us才能开始接收,这里选择10us后发送出去;

    rt_spi_transfer_message(spi_dev_ads1256, &msg4); //连续发送SYNC,WAKEUP,RDATA的指令
    sum=readbuf[0]<<16|readbuf[1]<<8|readbuf[2];  //将数据完成拼接
    return sum;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 10:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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