基于STM32F429的ADS1115驱动程序
2024-10-19 21:33:47
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
最新文章
- C#中string.format用法详解
- 单词(bzoj 3172)
- 在 Win10 命令行使用 Consolas + 微软雅黑
- 50款免费名片设计模板 PSD 源文件下载《上篇》
- Linux shell basic2 cat find tr
- GET /hello/fred/0926xxx572
- 【原创】Linux 增加系统调用
- python访问mysql
- 二十五、Hadoop学记笔记————Hive复习与深入
- 《网络是怎样连接的》PDF电子版书籍分享
- centos病毒
- 解决genymotion-arm-translation.zip无法拖拽安装的问题
- ubuntu 18.04下character_set_server设置为utf8
- PDF文档导出
- 2_C语言中的数据类型 (十)数组
- Linux上查看文件大小的用法(转载)
- Bower使用笔记
- vue中创建全局单文件组件/命令
- C# 最小化到托盘,托盘右击菜单显示
- oralce表空间使用情况查询