研究生
最后登录1970-1-1
在线时间 小时
注册时间2021-8-17
|
本帖最后由 liguanghui 于 2023-11-3 21:58 编辑
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;
} |
|
|