基于STM32F429的ADS1115驱动程序
1.ADS1115中文资料:https://wenku.baidu.com/view/8bab101feef9aef8941ea76e58fafab069dc44e7.html?rec_flag=default&sxts=1557987780920
2.IIC协议程序
IIC协议是大多数传感的通信协议,每个嵌入式工程师都要有自己的IIC底层协议
IIC可细分为7个函数
1.开始
2.读取
3.发送
4.结束
5.主机检测从机应答
6. 主机应答
7. 主机不应答
/*******************************************************************************
*
*
* Protocol Part
*
*
****************************************************************************** */ /*******************************************************************************
* Function Name : vIIC_Start_Signal
* Description : Master Send Start Signal
* Input : None
* Output : None
* Return : None
****************************************************************************** */
void vIIC_Start_Signal(IIC_HandleTypedef * hIICx)
{ IIC_SDA_1 (hIICx); //拉高数据线
IIC_SCL_1 (hIICx); //拉高时钟线
vIIC_Delay_2us ( ); //延时
IIC_SDA_0 (hIICx); //拉低数据线
vIIC_Delay_2us ( ); //延时
IIC_SCL_0 (hIICx); //拉低时钟线
vIIC_Delay_2us ( ); //延时
} /*******************************************************************************
* Function Name : vIIC_SendByte
* Description : Master Send a Byte to Slave
* Input : Will Send Date
* Output : None
* Return : None
****************************************************************************** */
void vIIC_SendByte(IIC_HandleTypedef * hIICx,uint8_t uSendByte)
{ uint8_t i; for (i=; i<; i++)
{
if(uSendByte & 0X80)
IIC_SDA_1 (hIICx);
else
IIC_SDA_0 (hIICx);
uSendByte <<= ;
vIIC_Delay_1us ( );
IIC_SCL_1 (hIICx);
vIIC_Delay_2us ( );
IIC_SCL_0 (hIICx);
vIIC_Delay_1us ( ); } } /*******************************************************************************
* Function Name : uIIC_RecvByte
* Description : Master Reserive a Byte From Slave
* Input : None
* Output : None
* Return : Date From Slave
****************************************************************************** */
uint8_t uIIC_RecvByte(IIC_HandleTypedef * hIICx)
{
uint8_t i,uReceiveByte = ; IIC_GPIO_MODE_Ipt (hIICx);
IIC_SDA_1 (hIICx);
for(i=;i<;i++)
{
uReceiveByte <<= ; vIIC_Delay_1us ( );
IIC_SCL_1 (hIICx);
vIIC_Delay_1us ( ); if(IIC_SDA_R (hIICx))
{
uReceiveByte |=0x01;
} vIIC_Delay_1us ( );
IIC_SCL_0 (hIICx);
vIIC_Delay_1us ( );
}
IIC_GPIO_MODE_Opt (hIICx); return uReceiveByte; } /*******************************************************************************
* Function Name : vIIC_Ack
* Description : Master Send Acknowledge Single
* Input : None
* Output : None
* Return : None
****************************************************************************** */
void vIIC_Ack(IIC_HandleTypedef * hIICx)
{ IIC_SDA_0 (hIICx); //拉低数据位
vIIC_Delay_1us ( ); //延时
IIC_SCL_1 (hIICx); //拉高时钟位
vIIC_Delay_2us ( ); //延时
IIC_SCL_0 (hIICx); //拉低时钟位
vIIC_Delay_1us ( ); //延时 } /*******************************************************************************
* Function Name : vProto_IIC_NAck
* Description :
* Input : None
* Output : None
* Return : None
****************************************************************************** */
void vIIC_NAck(IIC_HandleTypedef * hIICx)
{ IIC_SDA_1 (hIICx); //SDA拉高 不应答对方
vIIC_Delay_1us ( );
IIC_SCL_1 (hIICx);
vIIC_Delay_2us ( );
IIC_SCL_0 (hIICx);
vIIC_Delay_1us ( ); } /*******************************************************************************
* Function Name : bIIC_ReadACK
* Description : Master Reserive Slave Acknowledge Single
* Input : None
* Output : None
* Return : None
****************************************************************************** */
bool bIIC_ReadACK(IIC_HandleTypedef * hIICx) //返回为:=1有ACK,=0无ACK
{
IIC_GPIO_MODE_Ipt (hIICx);
IIC_SDA_1 (hIICx); //拉高数据线
vIIC_Delay_1us ( ); //延时
IIC_SCL_1 (hIICx); //拉高时钟线
vIIC_Delay_2us ( ); //延时 if(IIC_SDA_R(hIICx))
{
vIIC_Delay_1us( );
IIC_SCL_0 (hIICx);
vIIC_Delay_1us( );
IIC_GPIO_MODE_Opt(hIICx);
return FALSE; // 没有应答
}
else
{
vIIC_Delay_1us( );
IIC_SCL_0 (hIICx);
vIIC_Delay_1us( );
IIC_GPIO_MODE_Opt(hIICx);
return TRUE;
} } /*******************************************************************************
* Function Name : vIIC_Stop_Signal
* Description : Master Send Stop Signal
* Input : None
* Output : None
* Return : None
****************************************************************************** */
void vIIC_Stop_Signal(IIC_HandleTypedef * hIICx)
{ IIC_SDA_0 (hIICx); //拉低数据线
vIIC_Delay_2us ( ); //延时
IIC_SCL_1 (hIICx); //拉高时钟线
vIIC_Delay_2us ( ); //延时
IIC_SDA_1 (hIICx); //拉高数据线
vIIC_Delay_2us ( ); //延时 }
3.寄存器操作
ADS1115的ADDR引脚接地,则寄存器地址为0x90
ADS1115的操作只有3步
1.向配置寄存器0x01写入配置,先写高8位,再写低8位
void uSen_ADS1115_Confight(IIC_HandleTypedef * iicHandle)
{
vIIC_Start_Signal(iicHandle); //1. IIC_Start ; 起始信号
vIIC_SendByte(iicHandle, Slave_Address); //2. IIC_Send Device Address(W); 发送设备地址 0x90 bIIC_ReadACK(iicHandle); vIIC_SendByte(iicHandle, 0x01); //发送寄存器地址 0x01
bIIC_ReadACK(iicHandle);
vIIC_SendByte(iicHandle, 0xc0); //具体如何配置看手册
bIIC_ReadACK(iicHandle);
vIIC_SendByte(iicHandle, 0x83);
bIIC_ReadACK(iicHandle);
vIIC_Stop_Signal(iicHandle); }
2. 写入指针寄存器0x00,准备读取电压
void uSen_ADS1115_PointRegister(IIC_HandleTypedef * iicHandle, uint8_t Register_Address)
{
vIIC_Start_Signal(iicHandle); //1. IIC_Start ; 起始信号
vIIC_SendByte(iicHandle, Slave_Address); //2. IIC_Send Device Address(W); 发送设备地址 0x90 vIIC_Ack(iicHandle); vIIC_SendByte(iicHandle, 0x00); //4. IIC_Send Register Address ; 发送要操作的寄存器地址
vIIC_NAck(iicHandle); vIIC_Stop_Signal(iicHandle); //9. IIC_Stop ; 结束信号
}
3.读取电压数据
float uSen_ADS1115_Read_Date(IIC_HandleTypedef * iicHandle)
{
uint8_t uRev_Register_Data_H = 0x00,uRev_Register_Data_L = 0x00;
float uRev_Register_Data = 0x00; vIIC_Start_Signal(iicHandle); //1. IIC_Start ; 起始信号
vIIC_SendByte(iicHandle,0x91); //7. I2C_Send Device Address(R); 发送设备地址+1 准备读取
vIIC_Ack(iicHandle); //8. I2C_Ack ; 等待应答
uRev_Register_Data_H = uIIC_RecvByte(iicHandle); //9. I2C_ReadByte ; 读取高位数据
vIIC_Ack(iicHandle);
uRev_Register_Data_L = uIIC_RecvByte(iicHandle); //9. I2C_ReadByte ; 读取低位数据
vIIC_NAck(iicHandle); //数据处理
vIIC_Stop_Signal(iicHandle);
uRev_Register_Data=uRev_Register_Data_H*+uRev_Register_Data_L; //合取为16位数据 if(uRev_Register_Data>=0x8000)
uRev_Register_Data=((float)(0xffff-uRev_Register_Data)/32767.0)*4.096;
else
uRev_Register_Data=((float)uRev_Register_Data/32768.0)*4.096;
; return uRev_Register_Data; }
4. 数据处理
(16位数据/2的15次方)*量程
即(uRev_Register_Data/32768)*4.096
注意有电压有正负
5.量程范围
VCC+/-量程
比如 0v+/-4.096
基于STM32F429的ADS1115驱动程序的更多相关文章
- 基于STM32F429和Cube的主从定时器多通道输出固定个数的PWM波形
主从定时器的原理已在上篇博文: 基于STM32F429+HAL库编写的定时器主从门控模式级联输出固定个数PWM脉冲的程序 讲解了,这篇重点就讲如何实现多通道的PWM级联输出. 1.软件环境 Keil5 ...
- 基于STM32F429和Cube的ov2640程序
1.ov2640和DCMI介绍 OV2640 是 OV(OmniVision)公司生产的一颗 1/4 寸的 CMOS UXGA(1632*1232)图 像传感器.该传感器体积小.工作电压低,提供单片 ...
- 基于STM32F429的TFT0.96屏幕驱动
1.介绍TFT 2.Cube配置 该屏幕是用SPI通信的,但没有MISO引脚,意思是说该屏幕只能接收数据,但无法读取里面的数据,理论上说四线就能启动,但我弄不出,只能用六线. 在Cube上只要开启六 ...
- 基于STM32F429的内存管理
1.内存管理介绍 内存管理,是指软件运行时对计算机内存资源的分配和使用的技术.其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源. 内存管理的实现方法有很多种,他们其实最终都是要 ...
- 基于STM32F429+HAL库编写的定时器主从门控模式级联输出固定个数PWM脉冲的程序
硬件设备 42步进电机,步进电机驱动器,正点原子F429开发板 开发软件 keil5,Cube 综述 一般要精准的控制电机,就要控制单片机的引脚输出指定个数的PWM波,有多种可实现的方法 ...
- 基于STM32F429和HAL库的CAN收发例程
1.CAN协议介绍 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信协议.在当前的汽车产业中,出于对安全性.舒适性.方便性.低公 ...
- 基于STM32F429,Cubemx的SAI音频播放实验
书接上文:https://www.cnblogs.com/feiniaoliangtiangao/p/11060674.html 和 https://www.cnblogs.com/feiniaoli ...
- 基于STM32F429,Cubemx的SDHC卡的基本Fatfs文件移植
本博文要求各位初步了解Fatfs文件系统 友情提示Fatfs官网:http://elm-chan.org/fsw/ff/00index_e.html 1.开发软件 keil5,Cube5.21 2.实 ...
- 基于WDF的PCI/PCIe接口卡Windows驱动程序(3)- 驱动程序代码(头文件)
原文出处:http://www.cnblogs.com/jacklu/p/4679304.html 在WDF的PCIe驱动程序中,共有四个.h文件(Public.h Driver.h Device ...
随机推荐
- django基础之day05,F与Q查询,Q查询的高级用法
#F与Q查询 #*************************** F 查询 ******************** # F 查询数据库中的其他字段!!! #1.查询库存数大于卖出数的书籍 fr ...
- java设计模式(一)动态代理模式,JDK与CGLIB分析
-本想着这个知识点放到Spring Aop说说可能更合适一点,但因为上一篇有所提到就简单分析下,不足之处请多多评论留言,相互学习,有所提高才是关键! 什么是代理模式: 记得有本24种设计模式的书讲到代 ...
- Cesium案例解析(二)——ImageryLayers影像图层
目录 1. 概述 2. 实例 2.1. ImageryLayers.html 2.2. ImageryLayers.js 2.2.1. 代码 2.2.2. 解析 3. 结果 1. 概述 Cesium支 ...
- Nginx代理缓存功能
Nginx代理缓存功能 Nginx缓存主要是用于减轻后端服务器的负载,提高网站并发量,提升用户体验度. 注意:Nginx反向代理的缓存功能是由ngx_http_proxy_module提供, ...
- [ASP.NET Core 3框架揭秘] 跨平台开发体验: Linux
如果想体验Linux环境下开发.NET Core应用,我们有多种选择.一种就是在一台物理机上安装原生的Linux,我们可以根据自身的喜好选择某种Linux Distribution,目前来说像RHEL ...
- springboot windows10风格 activiti 整合项目框架源码 shiro 安全框架 druid
官网:www.fhadmin.org 此项目为Springboot工作流版本 windows 风格,浏览器访问操作使用,非桌面应用程序. 1.代码生成器: [正反双向](单表.主表.明细表.树形表 ...
- Cesium专栏-地形开挖2-任意多边形开挖(附源码下载)
“任意多边形地形开挖” 是“地形开挖”的补充篇,在这节里,我们介绍关于如何使用任意多边形对地形进行开挖,同时,由于有不少小伙伴也咨询了关于“地形开挖”篇后序内容中的填充地形的效果,之前没放出来,是想让 ...
- Spring-web-security Issue (Access is denied. User must have one of the these roles: ACTUATOR)
前提条件(Prerequisite) 1.你的项目里引进了Spring web security <dependency> <groupId>org.springframewo ...
- 安卓JNI精细化讲解,让你彻底了解JNI(二):用法解析
目录 用法解析 ├── 1.JNI函数 │ ├── 1.1.extern "C" │ ├── 1.2.JNIEXPORT.JNICALL │ ├── 1.3.函数名 │ ├── 1 ...
- 百度大脑UNIT3.0详解之嵌入式对话理解技术
相信很多人都体验过手机没有网时的焦虑,没有网什么也做不了.而机器人也会遇到这样的时刻,没有网或者网络环境不好的情况下,无法识别用户在说什么,也无法回复用户.在AIoT(AI+物联网)飞速普及的现在,智 ...