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倍增益,禁用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开发-----驱动代码相关推荐
- 【鸿蒙OS开发入门】18 - HDF驱动子系统:加速度计传感器 Driver层驱动代码分析
[鸿蒙OS开发入门]18 - HDF驱动子系统:加速度计传感器 Driver层代码分析 一.如何添加速度计传感器驱动代码(代码.编译.配置) 1.驱动代码实现 2.驱动编译配置 2.1 linux 编 ...
- 开发ODBC驱动代码
开发ODBC驱动代码需要熟练掌握C或C++编程语言,以下是一个简单示例: // Sample ODBC Driver #include <windows.h> #include <s ...
- S3C6410开发板adc驱动代码分析及测试代码分析
在本文中,我们对S3C6410开发板adc驱动代码的实现过程进行分析,然后通过一个实例对adc功能进行测试.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 adc的设备驱动主要 ...
- S3C6410开发板LED驱动代码分析及测试代码分析
在本文中,我们对S3C6410开发板LED驱动代码的实现过程进行分析,然后通过一个实例对LED进行控制.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 设备驱动主要实现了模块的 ...
- 树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”
首先我们要知道,驱动的两大利器:电路图(通过电路图去寻找寄存器)和芯片手册 一.寄存器的介绍 芯片手册第六章的89页,GPIO有41个寄存器,所有访问都是32位的.Description是寄存器的功能 ...
- S3C6410开发板按键驱动代码分析及测试代码分析
在本文中,我们对S3C6410开发板按键驱动代码的实现过程进行分析,然后通过一个实例对按键功能进行测试.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 按键的设备驱动主要实现了 ...
- 三星framebuffer驱动代码分析
一.驱动总体概述 本次的驱动代码是Samsung公司为s5pv210这款SoC编写的framebuffer驱动,对应于s5pv210中的内部外设Display Controller (FIMD)模块. ...
- 基于框架编写驱动代码
操作驱动的上层代码(pin4test) #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> ...
- 应用开发专家一席谈:开发低代码,上手低门槛,AppCube使能Citizen Developer,人人都是开发者
摘要:让不确定因子变为确定性因子,把复杂留给平台,简单留给开发者,是软件开发效率改进一直努力的方向,也是低代码理念的来源. 本文分享自华为云社区<应用开发专家一席谈:开发低代码,上手低门槛,Ap ...
最新文章
- linux平台下 延迟工作队列实例
- 金融运营智能化搞不定?百度智能云有妙方
- [Wf2011]Chips Challenge(最小费用最大流)
- java spark 读取json_apache-spark - 与aws-java-sdk链接时,在读取json文件时发生Spark崩溃 - 堆栈内存溢出...
- 光耦驱动单向可控硅_光耦是什麽?
- ai二维码插件_送你60款AI脚本插件包,已整合成插件面板的形式,方便在AI中调用...
- 一个简易的数字输入框组件
- null索引表键值_MySQL 的B+树索引
- 【报告分享】2020中国股民图鉴.pdf(附下载链接)
- 【汇编优化】之linux下如何利用gdb调试汇编代码
- 阶段3 1.Mybatis_02.Mybatis入门案例_3.mybatis注解开发和编写dao实现类的方式
- 从Access库导入MYSQL
- 同态滤波及matlab实现,怎样用MATLAB的图像处理功能进行同态滤波
- 屏幕录像专家 V6.0+注册机
- 笔记本换SSD固态硬盘,系统速度可以提升吗?
- 前端程序员兼职?不妨来试试这几个方法
- OpenGL ES EGL eglDestroyContext
- CAD内容很少,文件很大清理无效
- 清除数据库中所有数据
- Redis(10)哨兵
热门文章
- js页面滚动,设置锚点,控制页面滚动到某个节点位置
- BaoStock:使用python的baostock接口,查询季频盈利能力
- BGP EVPN基础知识
- java学习第十一天笔记-字符串217-根据id查找用户信息
- java写helloworld_java编写helloworld怎么编写?HelloWorld案例常见问题
- 自动化设备软件,遵循SECS/GEM
- Zabbix5.0 客户端(agent)配置异常记录
- OS + Linux RedHat / redhat 5 / redhat 6 / redhat 7
- java的dispose方法_java-dispose()方法
- wait()函数和waitpid()函数详解