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驱动程序的更多相关文章

  1. 基于STM32F429和Cube的主从定时器多通道输出固定个数的PWM波形

    主从定时器的原理已在上篇博文: 基于STM32F429+HAL库编写的定时器主从门控模式级联输出固定个数PWM脉冲的程序 讲解了,这篇重点就讲如何实现多通道的PWM级联输出. 1.软件环境 Keil5 ...

  2. 基于STM32F429和Cube的ov2640程序

    1.ov2640和DCMI介绍 OV2640 是 OV(OmniVision)公司生产的一颗 1/4 寸的 CMOS UXGA(1632*1232)图 像传感器.该传感器体积小.工作电压低,提供单片 ...

  3. 基于STM32F429的TFT0.96屏幕驱动

    1.介绍TFT 2.Cube配置  该屏幕是用SPI通信的,但没有MISO引脚,意思是说该屏幕只能接收数据,但无法读取里面的数据,理论上说四线就能启动,但我弄不出,只能用六线. 在Cube上只要开启六 ...

  4. 基于STM32F429的内存管理

    1.内存管理介绍 内存管理,是指软件运行时对计算机内存资源的分配和使用的技术.其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源. 内存管理的实现方法有很多种,他们其实最终都是要 ...

  5. 基于STM32F429+HAL库编写的定时器主从门控模式级联输出固定个数PWM脉冲的程序

    硬件设备   42步进电机,步进电机驱动器,正点原子F429开发板 开发软件    keil5,Cube 综述   一般要精准的控制电机,就要控制单片机的引脚输出指定个数的PWM波,有多种可实现的方法 ...

  6. 基于STM32F429和HAL库的CAN收发例程

    1.CAN协议介绍 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信协议.在当前的汽车产业中,出于对安全性.舒适性.方便性.低公 ...

  7. 基于STM32F429,Cubemx的SAI音频播放实验

    书接上文:https://www.cnblogs.com/feiniaoliangtiangao/p/11060674.html 和 https://www.cnblogs.com/feiniaoli ...

  8. 基于STM32F429,Cubemx的SDHC卡的基本Fatfs文件移植

    本博文要求各位初步了解Fatfs文件系统 友情提示Fatfs官网:http://elm-chan.org/fsw/ff/00index_e.html 1.开发软件 keil5,Cube5.21 2.实 ...

  9. 基于WDF的PCI/PCIe接口卡Windows驱动程序(3)- 驱动程序代码(头文件)

    原文出处:http://www.cnblogs.com/jacklu/p/4679304.html 在WDF的PCIe驱动程序中,共有四个.h文件(Public.h  Driver.h  Device ...

随机推荐

  1. Django forms组件与钩子函数

    目录 一.多对多的三种创建方式 1. 全自动 2. 纯手撸(了解) 3. 半自动(强烈推荐) 二.forms组件 1. 如何使用forms组件 2. 使用forms组件校验数据 3. 使用forms组 ...

  2. 2019最新EI源刊目录

    2D Materials Journal3D Printing and Additive Manufacturing Journal3D Research Journal3DTV-Conference ...

  3. 简单介绍托管执行和 CLI

    目录 CIL 和 ILDASM 查看 myApp.dll 的 CIL 输出 使用 ILSpy 查看 myApp.dll 反编译后的代码 处理器不能直接解释程序集.程序集用的是另一种语言,即公共中间语言 ...

  4. QT删除整个文件夹

    故事背景:因为客户端要清理旧版本以及日志文件,所以需要删除一个月以前的所有文件夹 技术调研:在程序中我想把文件夹直接删除,但是调用QDir中的rmdir()或者rmpath()时要求文件夹必须是非空的 ...

  5. 利用keras自带路透社数据集进行多分类训练

    import numpy as np from keras.datasets import reuters from keras import layers from keras import mod ...

  6. Node.js / Python 日志

    一.Node.js 日志 1.原生 Node.js 原生方法其实很简单,就四个: // 输出到 stdout console.log() console.info() = console.log() ...

  7. 计算几何 val.1

    目录 计算几何 val.1 向量的点积 向量的叉积 一种奇怪的三角剖分求面积 凸包 点绕点旋转 后记 计算几何 val.1 本文并不是入门文章,供有高中数学基础的阅读 主要写一些重要的点和注意事项吧 ...

  8. 【AGC028D】Chord

    Problem Description 给定一个圆,圆上均等地放着 \(2n\) 个点,已有 \(k\) 对点之间连好了边,从中选择剩下 \(n-k\) 对点随意连边. 求所有连边方案中,联通块的个数 ...

  9. Python, import, module

    When the interpreter reads a python script file, it does two things: (1) set some special variable. ...

  10. C# net core程序调试错误集(持续更新)

    目录 C#程序调试错误集 1.依赖注入错误System.InvalidOperationException: Unable to resolve service for type 'xxx' whil ...