ADS1220开发-----驱动代码

ADS1220开发-----驱动代码

最近收到学长的要求,开发一个24bit ADC------ADS1220,记录一下开发的过程

数据手册概览

通信引脚及其协议

在这里插入图片描述

  • 通信协议->SPI,且仅支持SPI模式1
  • 引脚分配
    • cs:片选,拉低使能通信
    • SCLK:SPI的时钟引脚
    • DOUT/DRDY:SPI的MISO
    • DIN:SPI的MOSI
    • DRDY:当ADS1220完成数据转换以后就会产生下降沿跳变,处理器(MCU)可以将其接到对应的外部中断脚上来读取ADS1220是否准备好数据

ADS1220的通信命令

在这里插入图片描述

  • RESET:复位设备-> 0x06
  • START:开启设备转换,如果是单次转化,则每次转化前需要发送该命令,如果是连续转化,则需要在使能连续转化位(CM),开启转化->0x08
  • POWERDOWN:进入掉电模式(为低功耗设计)->0x02
  • RDATA:单次转化完成后,如若需要读取数据,则需要发送该指令,连续转化则不需要->0x10
  • RREG:读取某个寄存器上的某的数值->0x2?
  • WREG:将数据写入某一个寄存器->0x4?

注意:?是指低4位的设定,因为其中rr表示配置寄存器,nn表示待发送到该寄存器的寄存器的字节数-1

ADS1220通信时序图

在这里插入图片描述

数据手册里面指明了单次模式和连续转化模式,但是手册里也指明,时序图中都没有使用RDATA命令,所以实际上在使用的时候,读取数据前需要使用该命令。

所以单次转化读取数据的过程是:

数据完成->发送RDATA命令->连续读取三个字节->开启下次转化

连续转化:

数据完成->发送RDATA命令->连续读取三个字节

由此可见,其实单次转化和连续转化其实没有太大区别,我这里就直接使用的单次转化

相关配置寄存器

配置寄存器0

在这里插入图片描述

  • MUX:主要是选择输入引脚的,有单端输入也有差分输入
  • GAIN:增益配置
  • PGA:没理解干啥的,但是我是单端,1倍增益,我就直接将该位禁用了

配置寄存器1

在这里插入图片描述

  • DR:选择转化速率,我选择45PS
  • MODE:选择工作模式,我选择正常模式
  • CM:转化模式选择,我选择单次
  • TS:温湿度传感器,我不用直接禁用
  • BCS:这个我直接关断了

配置寄存器2

在这里插入图片描述

  • VERF:基准电压选择,我使用内部基准电压
  • FIR:滤波器频率选择,我这里不滤波
  • PSW:底层电源开关,直接断开就行
  • IDAC:激励电流,不用管

配置寄存器3

在这里插入图片描述

  • l1MUX:不用管
  • I2MUX:不用管
  • DRDYM:选择0,使用专门的DRDY引脚来表示数据完成

驱动代码概览

使用Cubemx直接生成代码

复位指令和读取和写入的指令的宏

#define ADS1220_RESET 0X06
#define ADS1220_START 0X08
#define ADS1220_POWERDOWN 0X02
#define ADS1220_RDATA 0X10
#define ADS1220_RREG 0X20
#define ADS1220_WREG 0X40

#define ADS1220_CS_LOW()  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET)
#define ADS1220_CS_HIGH()  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET)

ADS1220的写入和接收函数封装

void ADS1220_Write(uint8_t dat)
{
    HAL_SPI_Transmit(&hspi2, &dat, 1, 10);
}

uint8_t ADS1220ReceiveByte()
{
    uint8_t SData = 0xff, Result = 0;

    HAL_SPI_TransmitReceive(&hspi2, &SData, &Result, 1, 10);
    return Result;
}

ADS1220写寄存器函数封装

void ADS1220_WriteRegister(int StartAddress, int NumRegs, uint8_t * pData)
{
    int i;
    ADS1220_CS_LOW();
    /* send the command byte */
    ADS1220_Write( ADS1220_WREG | (((StartAddress << 2) & 0x0c) | ((NumRegs - 1) & 0x03)));

    /* send the data bytes */
    for(i = 0; i < NumRegs; i++)
    {
        ADS1220_Write(*pData++);
    }

    ADS1220_CS_HIGH();
}

ADS1220初始化函数

void ADS1220_Init(void)
{
    uint8_t config_0 = 0x81;
    uint8_t config_1 = 0x20;
    uint8_t config_2 = 0x00;
    uint8_t config_3 = 0x00;


    ADS1220_CS_LOW();
    ADS1220_Write(ADS1220_RESET);
    HAL_Delay(10);
    ADS1220_CS_HIGH();

    //写入配置寄存器0,使用AIN0,AIN1,1倍增益,禁用PGA
    ADS1220_WriteRegister(0x00, 1, &config_0);

    //写入配置寄存器1,使用正常工作模式,单次转模式,
    ADS1220_WriteRegister(0x01, 1, &config_1);

    //写入配置寄存器2,使用内部基准,无滤波
    ADS1220_WriteRegister(0x02, 1, &config_2);

    //写入配置寄存器3,使用设置独立的DRY引脚
    ADS1220_WriteRegister(0x03, 1, &config_3);
    
    ADS1220_CS_LOW();
    ADS1220_Write(ADS1220_START);
}

中断函数里面开始读取数据

long Data;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    Data = 0x00000000;
    ADS1220_CS_LOW();
    ADS1220_Write(ADS1220_RDATA);
    Data = ADS1220ReceiveByte();
    Data = (Data << 8) | ADS1220ReceiveByte();
    Data = (Data << 8) | ADS1220ReceiveByte();

    /* sign extend data */
    if (Data & 0x800000)
        Data |= 0xff000000;
   ADS1220_Write(ADS1220_START);
}

使用说明

对应引脚连接上,这里贴一份数据手册里的说明图

在这里插入图片描述

如果喜欢,请收藏加关注哦!

  • 12
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ADS131A04的驱动代码需要根据具体的硬件连接方式、应用场景等进行编写。以下是一个基本的参考代码,供您参考: ```c #include "stm32f4xx.h" #include "ads131a04.h" #include "spi.h" //SPI接口驱动 #define ADS131A04_CS_LOW() GPIO_ResetBits(GPIOA, GPIO_Pin_4) //拉低片选 #define ADS131A04_CS_HIGH() GPIO_SetBits(GPIOA, GPIO_Pin_4) //拉高片选 /* ADS131A04初始化函数 */ void ADS131A04_Init(void) { ADS131A04_CS_HIGH(); //先将片选拉高 //设置ADS131A04的初始化寄存器 ADS131A04_WriteReg(ADS131A04_REG_CONFIG1, 0x00); //采样率为2kSPS ADS131A04_WriteReg(ADS131A04_REG_CONFIG2, 0x02); //增益为1,内部参考电压为2.5V ADS131A04_WriteReg(ADS131A04_REG_CONFIG3, 0x04); //启用内部温度传感器 //启动ADS131A04的自校准 ADS131A04_CS_LOW(); SPI_WriteByte(ADS131A04_CMD_SELFCAL); ADS131A04_CS_HIGH(); } /* ADS131A04读取数据函数 */ void ADS131A04_ReadData(uint32_t *pData) { ADS131A04_CS_LOW(); //发送读取数据寄存器的命令 SPI_WriteByte(ADS131A04_CMD_RDATA); //读取数据 for (int i = 0; i < 4; i++) { uint8_t byte1 = SPI_ReadByte(); uint8_t byte2 = SPI_ReadByte(); uint8_t byte3 = SPI_ReadByte(); uint8_t byte4 = SPI_ReadByte(); *pData++ = (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4; } ADS131A04_CS_HIGH(); } /* ADS131A04写寄存器函数 */ void ADS131A04_WriteReg(uint8_t reg, uint8_t value) { ADS131A04_CS_LOW(); //发送写寄存器命令和寄存器地址 SPI_WriteByte(ADS131A04_CMD_WREG | reg); //发送寄存器值 SPI_WriteByte(value); ADS131A04_CS_HIGH(); } ``` 以上代码中,使用SPI接口与ADS131A04进行通信。在初始化函数中,设置了采样率、增益、内部参考电压和温度传感器等参数,并启动了自校准。在读取数据函数中,发送读取数据寄存器的命令,然后连续读取4个字节的数据,并将其拼接成32位的数据。在写寄存器函数中,发送写寄存器命令和寄存器地址,然后发送寄存器值。 需要注意的是,以上代码中的具体数值可能需要根据实际硬件和应用场景进行调整。同时,还需要根据具体的硬件连接方式进行相应的初始化和配置。建议参考相关的硬件和软件开发文档,以及示例代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值