咚咚咚————【封装驱动】ADS1256驱动程序,分享交流自己编写的程序。
咚咚咚————【封装驱动】ADS1256驱动程序,分享交流自己编写的程序。
注意此程序好像还有一些BUG,我读取出来的电压比万用表测的低0.3V左右
这个是ADS1256我查手册总结的编程注意事项
tCLKIN = 1/7.680000MHz = 130ns
tDATA = 1/Data Rate Max = 30KHzSCLK Period Min =4tCLKIN =520ns
SCLK Period Max =10tDATA
SCLK High Min =200ns
SCLK High Max =9tDATA
SCLK Low Min =200ns以SCLK Period Min=600ns来计算,SCLK频率不要超过1.66MHz
以SCLK Period Min=800ns来计算,SCLK频率不要超过1.25MHz以Data Rate Max=30KHz来计算tDATA=33.3us
SCLK频率不能低于3KHz
SCLK高电平时间不能超过300usDIN setup time =50ns
DIN setup hold =50nsSCLK复位模式
一、first high pulse = 39us-65us
二、second high pulse = 72us-97us
三、third high pulse = 137us-162us
四、every low pulse > 0.65us每个操作/命令需要间隔 50tCLKIN = 6.5us注意:
nnnn =需要读/写的寄存器数量-1
rrrr =需要读/写的寄存器地址
例如,读或者写三个寄存器,nnnn就是3-1 = 2 即(0010)。CS线不能随便拉高拉低,执行完一套动作前拉低,一套动作执行完再拉高。
/********************************************
主控芯片:STM32 Controller
模块型号:ADS1256
通讯方式:SPI串口通信
作者:苏夏雨
授权:未经作者允许,禁止转载
********************************************/
//定义模块头文件名称
#ifndef _ADS1256_H
#define _ADS1256_H
//定义模块使用头文件
#include "sys.h"
#include "delay.h"
#include "usart.h"
//定义模块使用的引脚
#define DRDY HAL_GPIO_ReadPin(GPIOI,GPIO_PIN_2)
#define CS_H HAL_GPIO_WritePin(GPIOI,GPIO_PIN_1,GPIO_PIN_SET)
#define CS_L HAL_GPIO_WritePin(GPIOI,GPIO_PIN_1,GPIO_PIN_RESET)
#define RESET_H HAL_GPIO_WritePin(GPIOI,GPIO_PIN_0,GPIO_PIN_SET)
#define RESET_L HAL_GPIO_WritePin(GPIOI,GPIO_PIN_0,GPIO_PIN_RESET)
//定义模块使用的函数
void ADS1256_Init(void);
void ADS1256_Read(u8 MUX);
//定义模块寄存器地址
/*ADS1256寄存器地址*/
#define REG_STATUS 0x00 //状态寄存器
#define REG_MUX 0x01 //通道寄存器
#define REG_ADCON 0x02 //AD控制寄存器
#define REG_DRATE 0x03 //采样速率寄存器
#define REG_IO 0x04 //IO控制寄存器
#define REG_OFC0 0x05 //OFC校准寄存器:offset calibration
#define REG_OFC1 0x06 //OFC
#define REG_OFC2 0x07 //OFC
#define REG_FSC0 0x08 //FSC校准寄存器:full-scale calibration
#define REG_FSC1 0x09 //FSC
#define REG_FSC2 0x0A //FSC
/*ADS1256寄存器命令*/
#define CMD_RDATA 0x01 //单次读取数据
#define CMD_RDATAC 0x03 //连续读取数据
#define CMD_SDATAC 0x0F //停止连续读取
#define CMD_RREG 0x10 //写寄存器
#define CMD_WREG 0x50 //读寄存器
#define CMD_SELFCAL 0xf0 //偏移增益自动校准
#define CMD_SELFOCAL 0xf1 //抵消自动校准
#define CMD_SELFGCAL 0xf2 //获取自动校准
#define CMD_SYSOCAL 0xf3 //系统偏移校准
#define CMD_SYSGCAL 0xf4 //系统增益校准
#define CMD_SYNC 0xfc //同步AD转换
#define CMD_STANDBY 0xfd //待机
#define CMD_WAKEUP 0x00 //唤醒
#define CMD_RESET 0xfe //复位
/*ADS1256放大器设置*/
#define PGA_1 0x00 //量程±5.000000V
#define PGA_2 0x01 //量程±2.500000V
#define PGA_4 0x02 //量程±1.250000V
#define PGA_8 0x03 //量程±0.625000V
#define PGA_16 0x04 //量程±0.312500V
#define PGA_32 0x05 //量程±0.156250V
#define PGA_64 0x06 //量程±0.078125V
/*ADS1256采样速率设置*/
#define DRATE_30000SPS 0xF0 //速率30000次/秒
#define DRATE_15000SPS 0xE0 //速率15000次/秒
#define DRATE_7500SPS 0xD0 //速率7500次/秒
#define DRATE_3750SPS 0xC0 //速率3750次/秒
#define DRATE_2000SPS 0xB0 //速率2000次/秒
#define DRATE_1000SPS 0xA1 //速率1000次/秒
#define DRATE_500SPS 0x92 //速率500次/秒
#define DRATE_100SPS 0x82 //速率100次/秒
#define DRATE_60SPS 0x72 //速率60次/秒
#define DRATE_50SPS 0x63 //速率50次/秒
#define DRATE_30SPS 0x53 //速率30次/秒
#define DRATE_25SPS 0x43 //速率25次/秒
#define DRATE_15SPS 0x33 //速率15次/秒
#define DRATE_10SPS 0x23 //速率10次/秒
#define DRATE_5SPS 0x13 //速率5次/秒
#define DRATE_2SPS 0x03 //速率2次/秒
/*ADS1256复用器通道选择*/
#define MUXP_AIN0 0x00 //正极=AIN0
#define MUXP_AIN1 0x10 //正极=AIN1
#define MUXP_AIN2 0x20 //正极=AIN2
#define MUXP_AIN3 0x30 //正极=AIN3
#define MUXP_AIN4 0x40 //正极=AIN4
#define MUXP_AIN5 0x50 //正极=AIN5
#define MUXP_AIN6 0x60 //正极=AIN6
#define MUXP_AIN7 0x70 //正极=AIN7
#define MUXP_AINCOM 0x80 //正极=ACOM
#define MUXN_AIN0 0x00 //负极=AIN0
#define MUXN_AIN1 0x01 //负极=AIN1
#define MUXN_AIN2 0x02 //负极=AIN2
#define MUXN_AIN3 0x03 //负极=AIN3
#define MUXN_AIN4 0x04 //负极=AIN4
#define MUXN_AIN5 0x05 //负极=AIN5
#define MUXN_AIN6 0x06 //负极=AIN6
#define MUXN_AIN7 0x07 //负极=AIN7
#define MUXN_AINCOM 0x08 //负极=ACOM #endif
/********************************************
主控芯片:STM32 Controller
模块型号:ADS1256
通讯方式:SPI串口通信
作者:苏夏雨
授权:未经作者允许,禁止转载
********************************************/
#include "ads1256.h"
SPI_HandleTypeDef SPI2_Handler;//SPI2句柄
/**************************SPI配置程序**************************/
void SPI2_Init(void)//SPI2初始化
{SPI2_Handler.Instance=SPI2; //SP2SPI2_Handler.Init.Mode=SPI_MODE_MASTER; //设置SPI工作模式,设置为主模式SPI2_Handler.Init.Direction=SPI_DIRECTION_2LINES; //设置SPI单向或者双向的数据模式:SPI设置为双线模式SPI2_Handler.Init.DataSize=SPI_DATASIZE_8BIT; //设置SPI的数据大小:SPI发送接收8位帧结构SPI2_Handler.Init.CLKPolarity=SPI_POLARITY_LOW; //串行同步时钟的空闲状态为低电平SPI2_Handler.Init.CLKPhase=SPI_PHASE_2EDGE; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样SPI2_Handler.Init.NSS=SPI_NSS_SOFT; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI2_Handler.Init.NSSPMode=SPI_NSS_PULSE_DISABLE; //NSS信号脉冲失能SPI2_Handler.Init.MasterKeepIOState=SPI_MASTER_KEEP_IO_STATE_ENABLE; //SPI主模式IO状态保持使能SPI2_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_64;//定义波特率预分频的值:波特率预分频值为64SPI2_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始SPI2_Handler.Init.TIMode=SPI_TIMODE_DISABLE; //关闭TI模式SPI2_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验SPI2_Handler.Init.CRCPolynomial=7; //CRC值计算的多项式HAL_SPI_Init(&SPI2_Handler);__HAL_SPI_ENABLE(&SPI2_Handler); //使能SPI2
}
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)//SPI2底层服务函数
{GPIO_InitTypeDef GPIO_Initure;RCC_PeriphCLKInitTypeDef SPI2ClkInit;__HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOF时钟__HAL_RCC_SPI2_CLK_ENABLE(); //使能SPI2时钟//设置SPI2的时钟源 SPI2ClkInit.PeriphClockSelection=RCC_PERIPHCLK_SPI2; //设置SPI2时钟源SPI2ClkInit.Spi123ClockSelection=RCC_SPI123CLKSOURCE_PLL; //SPI2时钟源使用PLL1QHAL_RCCEx_PeriphCLKConfig(&SPI2ClkInit);//PB13,14,15GPIO_Initure.Pin=GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //快速 GPIO_Initure.Alternate=GPIO_AF5_SPI2; //复用为SPI2HAL_GPIO_Init(GPIOB,&GPIO_Initure); //初始化}
/**************************ADS1256程序**************************/
u8 ADS1256_ReadWrite(u8 TxData)
{u8 Rxdata;delay_us(10);HAL_SPI_TransmitReceive(&SPI2_Handler,&TxData,&Rxdata,1,1000); delay_us(10);return Rxdata; //返回收到的数据
}
void ADS1256_Write_Reg(u8 reg,u8 cmd)//写一个寄存器
{CS_L;delay_us(2); while(DRDY){};delay_us(10);ADS1256_ReadWrite(CMD_WREG | (reg & 0x0F));delay_us(10);ADS1256_ReadWrite(0);delay_us(10);ADS1256_ReadWrite(cmd);delay_us(10);//CS_H;delay_us(2);
}
u8 ADS1256_Read_Reg(u8 reg)
{u8 temp=0;CS_L;delay_us(2); while(DRDY){};delay_us(10);ADS1256_ReadWrite(CMD_RREG | (reg & 0x0F));delay_us(10);ADS1256_ReadWrite(0);delay_us(10);temp=ADS1256_ReadWrite(0);delay_us(10);//CS_H;delay_us(2); return temp;//返回数据
}
void ADS1256_Init(void)
{//配置GPIO设置GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOI_CLK_ENABLE(); //开启GPIOI时钟GPIO_Initure.Pin=GPIO_PIN_1|GPIO_PIN_0; //CS/RESET GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速HAL_GPIO_Init(GPIOI,&GPIO_Initure); GPIO_Initure.Pin=GPIO_PIN_2; //DRDYGPIO_Initure.Mode=GPIO_MODE_INPUT; //输入模式GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速HAL_GPIO_Init(GPIOI,&GPIO_Initure); SPI2_Init(); //初始化SPI2delay_init(400); //延时初始化uart_init(921600); //串口初始化 CS_L;RESET_L;delay_us(100);RESET_H;delay_us(100);while(DRDY);delay_us(10);ADS1256_Write_Reg(REG_STATUS,0x04);//关闭缓冲器,打开自校准,输出高位先输出delay_us(10); ADS1256_Write_Reg(REG_MUX,MUXP_AIN0|MUXN_AINCOM);//通道复用器(P=AIN0,N=COM4)delay_us(10); ADS1256_Write_Reg(REG_ADCON,PGA_1);//PGA放大倍数=1(5.000000V)delay_us(10); ADS1256_Write_Reg(REG_DRATE,DRATE_1000SPS);//采样速率2000Hz,每通道250HzCS_H;delay_us(10);
}
void ADS1256_Read(u8 MUX)
{/* u8 Result=0;u8 buf[12]={" \r\n"};Result = ADS1256_Read_Reg(REG_MUX); buf[0]=(u8)(Result%1000/100)+0x30;buf[1]=(u8)(Result%100/10)+0x30;buf[2]=(u8)(Result%10/1)+0x30; HAL_UART_Transmit(&UART1_Handler,buf,sizeof(buf),1000);*/u8 buf[12]={"0.0000V "};u32 Result=0;u32 Data1,Data2,Data3; double Data;CS_L;delay_us(2);while(DRDY);delay_us(10);ADS1256_Write_Reg(REG_MUX,MUX);delay_us(10); ADS1256_ReadWrite(CMD_SYNC);delay_us(10); ADS1256_ReadWrite(CMD_WAKEUP);delay_us(10);while(DRDY); delay_us(10); ADS1256_ReadWrite(CMD_RDATA);delay_us(10); Data1 = ADS1256_ReadWrite(0); delay_us(10); Data2 = ADS1256_ReadWrite(0);delay_us(10); Data3 = ADS1256_ReadWrite(0); delay_us(10); CS_H;delay_us(2); Result = (Data1<<16) | (Data2<<8) | Data3;Data = Result/1.6777215;Result = Data;buf[0]=(u8)(Result/1000000)+0x30;buf[2]=(u8)(Result%1000000/100000)+0x30;buf[3]=(u8)(Result%100000/10000)+0x30;buf[4]=(u8)(Result%10000/1000)+0x30; HAL_UART_Transmit(&UART1_Handler,buf,sizeof(buf),1000);
}
咚咚咚————【封装驱动】ADS1256驱动程序,分享交流自己编写的程序。相关推荐
- 咚咚咚————【封装驱动】W25QXX全系列驱动程序,分享交流自己编写的程序。
咚咚咚----[封装驱动]W25QXX全系列驱动程序,分享交流自己编写的程序. /******************************************** 主控芯片:STM32 Con ...
- 咚咚咚————【封装驱动】DS3231时钟芯片读写程序,分享交流自己编写的程序。
咚咚咚----[封装驱动]DS3231时钟芯片读写程序,分享交流自己编写的程序. /******************************************** 主控芯片:STM32 Co ...
- 咚咚咚————【封装驱动】MAX6675热电偶温度传感器,分享交流自己编写的程序。
咚咚咚----[封装驱动]MAX6675热电偶温度传感器,分享交流自己编写的程序. /******************************************** 主控芯片:STM32 C ...
- 咚咚咚————【封装驱动】MLX90614医用级红外温度传感器,分享交流自己编写的程序。
咚咚咚----[封装驱动]MLX90614医用级红外温度传感器,自己编写封装的驱动程序. /******************************************** 主控芯片:STM3 ...
- LinuxUSB驱动程序调试--009:编写应用程序---验证协议【转】
转自:http://biancheng.dnbcw.info/linux/257411.html [1] 如何编译X86下的 uBuntu APP---非常简单: gcc -o ...
- java 编写 servlet 程序_Java技术分享:如何编写servlet程序
身为计算机专业的我,从接触java至今,已经有七年之久,从最开始的小白到现在的大白,这是一个漫长而曲折的历程. 大学刚接触Java这个学科时,一点儿都不理解java是要干嘛的,只知道学起来肯定不容易, ...
- 咚咚咚————【封装驱动】Si5351A方波信号发生器发送任意(8K-160Mhz)频率程序
咚咚咚----[封装驱动]Si5351A方波信号发生器发送任意[8K-160Mhz]频率程序 (一)效果展示 (二)源码分享 (三)需要改进的地方及不足 (使用阿波罗STM32F7开发板) (一)效果 ...
- 唯品会、滴滴、沪江架构师,关于微服务粒度、高可用、持续交互的实践分享交流(下)...
架构师小组交流会:每期选择一个时下最热门的技术话题进行实践经验分享. 本期小组交流会邀请到了沪江黄凯.唯品会郑明华.滴滴赵伟.七牛云肖勤,对微服务粒度.高可用.持续交互展开了交流. 本期接着上期唯品会 ...
- Linux驱动(驱动程序开发、驱动框架代码编译和测试)
目录 什么是驱动: 设备分类: 驱动认知: 字符设备驱动工作原理 字符设备.字符设备驱动与用户空间访问该设备的程序三者之间的关系 驱动程序开发步骤 基于驱动框架的代码开发 驱动模块代码编译和测试 加载 ...
- 记一次软路由折腾记录(Esxi封装驱动、OpenWrt编译与DDNS、Truenas)
目录 前言 方案选择 软件系统 硬件选择 Esxi 封装驱动 安装Vmware PowerCli 封装驱动 硬件直通 OpenWrt 编译 阿里云DDNS DDNS开机不启动的问题 TrueNas 设 ...
最新文章
- js提取url参数的几种方法。(搜集)
- golang struct 动态创建
- Java动态代理生成的对象导出方法
- 安装fastdfs出现/usr/local/lib/libfastcommon.so: undefined reference to `fcntl64@GLIBC_2.28‘
- mysql注入提取邮件_【sql注入教程】mysql注入直接getshell
- android文本框自动补全,[Android]AutoCompleteTextView自动补全文本框
- # [银联复赛]-整数对:数论
- python module错误_python 解决方法:ImportError: No module
- 2、Linux多线程,线程的分离与结合
- python获取windows当前登录用户名 域 计算机名 mac地址 ip
- 八个常见CMD网络命令
- 草根程序员进入BAT
- netty报错:远程主机强迫关闭了一个现有的连接
- 关于淘淘商城的一些基本说明
- 走完离职流程心力交瘁,血泪教训:年终奖兑换期权要慎重,期权变现有风险,加班认定最管用的是加班申请记录!...
- 报错:v-html will override element children 解决方法
- HDU6194 后缀数组
- 关于pip 下载从清华源或者豆瓣源下载的命令总结
- CAM350 V10.5/V14.6 导出拼板gerber文件
- 安卓开发之集成微信登录以及分享群聊,朋友圈功能。
热门文章
- java发微信_java实现微信发送消息
- 现在90,00后经常上哪些网站?喜欢看啥网站?
- 第3章 从零开始的计算机系统
- 得知大熊哥最后一天在岗位工作今天离开有感而发
- SNF快速开发平台2019-权限管理模型-记录级-字段级权限实践
- 聊聊传统行业产品经理与互联网产品经理的区别
- LeetCode 3:Longest Substring Without Repeating Charact
- pythoninterpreter_java-Jython :: PythonInterpreter可以使用哪些模块...
- 蓝桥杯科学素养题(2020年12月-2021年12月)
- android 记事本上功能,安卓手机上有多功能记事本app吗?