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倍增益,禁用PGAADS1220_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);
}

使用说明

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

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

ADS1220开发-----驱动代码相关推荐

  1. 【鸿蒙OS开发入门】18 - HDF驱动子系统:加速度计传感器 Driver层驱动代码分析

    [鸿蒙OS开发入门]18 - HDF驱动子系统:加速度计传感器 Driver层代码分析 一.如何添加速度计传感器驱动代码(代码.编译.配置) 1.驱动代码实现 2.驱动编译配置 2.1 linux 编 ...

  2. 开发ODBC驱动代码

    开发ODBC驱动代码需要熟练掌握C或C++编程语言,以下是一个简单示例: // Sample ODBC Driver #include <windows.h> #include <s ...

  3. S3C6410开发板adc驱动代码分析及测试代码分析

    在本文中,我们对S3C6410开发板adc驱动代码的实现过程进行分析,然后通过一个实例对adc功能进行测试.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 adc的设备驱动主要 ...

  4. S3C6410开发板LED驱动代码分析及测试代码分析

    在本文中,我们对S3C6410开发板LED驱动代码的实现过程进行分析,然后通过一个实例对LED进行控制.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 设备驱动主要实现了模块的 ...

  5. 树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”

    首先我们要知道,驱动的两大利器:电路图(通过电路图去寻找寄存器)和芯片手册 一.寄存器的介绍 芯片手册第六章的89页,GPIO有41个寄存器,所有访问都是32位的.Description是寄存器的功能 ...

  6. S3C6410开发板按键驱动代码分析及测试代码分析

    在本文中,我们对S3C6410开发板按键驱动代码的实现过程进行分析,然后通过一个实例对按键功能进行测试.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 按键的设备驱动主要实现了 ...

  7. 三星framebuffer驱动代码分析

    一.驱动总体概述 本次的驱动代码是Samsung公司为s5pv210这款SoC编写的framebuffer驱动,对应于s5pv210中的内部外设Display Controller (FIMD)模块. ...

  8. 基于框架编写驱动代码

    操作驱动的上层代码(pin4test) #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> ...

  9. 应用开发专家一席谈:开发低代码,上手低门槛,AppCube使能Citizen Developer,人人都是开发者

    摘要:让不确定因子变为确定性因子,把复杂留给平台,简单留给开发者,是软件开发效率改进一直努力的方向,也是低代码理念的来源. 本文分享自华为云社区<应用开发专家一席谈:开发低代码,上手低门槛,Ap ...

最新文章

  1. linux平台下 延迟工作队列实例
  2. 金融运营智能化搞不定?百度智能云有妙方
  3. [Wf2011]Chips Challenge(最小费用最大流)
  4. java spark 读取json_apache-spark - 与aws-java-sdk链接时,在读取json文件时发生Spark崩溃 - 堆栈内存溢出...
  5. 光耦驱动单向可控硅_光耦是什麽?
  6. ai二维码插件_送你60款AI脚本插件包,已整合成插件面板的形式,方便在AI中调用...
  7. 一个简易的数字输入框组件
  8. null索引表键值_MySQL 的B+树索引
  9. 【报告分享】2020中国股民图鉴.pdf(附下载链接)
  10. 【汇编优化】之linux下如何利用gdb调试汇编代码
  11. 阶段3 1.Mybatis_02.Mybatis入门案例_3.mybatis注解开发和编写dao实现类的方式
  12. 从Access库导入MYSQL
  13. 同态滤波及matlab实现,怎样用MATLAB的图像处理功能进行同态滤波
  14. 屏幕录像专家 V6.0+注册机
  15. 笔记本换SSD固态硬盘,系统速度可以提升吗?
  16. 前端程序员兼职?不妨来试试这几个方法
  17. OpenGL ES EGL eglDestroyContext
  18. CAD内容很少,文件很大清理无效
  19. 清除数据库中所有数据
  20. Redis(10)哨兵

热门文章

  1. js页面滚动,设置锚点,控制页面滚动到某个节点位置
  2. BaoStock:使用python的baostock接口,查询季频盈利能力
  3. BGP EVPN基础知识
  4. java学习第十一天笔记-字符串217-根据id查找用户信息
  5. java写helloworld_java编写helloworld怎么编写?HelloWorld案例常见问题
  6. 自动化设备软件,遵循SECS/GEM
  7. Zabbix5.0 客户端(agent)配置异常记录
  8. OS + Linux RedHat / redhat 5 / redhat 6 / redhat 7
  9. java的dispose方法_java-dispose()方法
  10. wait()函数和waitpid()函数详解