基于STM32F429的ADS1115驱动程序
Posted feiniaoliangtiangao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于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=0; i<8; i++) { if(uSendByte & 0X80) IIC_SDA_1 (hIICx); else IIC_SDA_0 (hIICx); uSendByte <<= 1; 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 = 0; IIC_GPIO_MODE_Ipt (hIICx); IIC_SDA_1 (hIICx); for(i=0;i<8;i++) { uReceiveByte <<= 1; 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*256+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使用RT-Thread实现web服务器功能
如何让STM32F429NI中的bootloader跳转到外部Nor Flash
无法使用 HAL 驱动程序在 STM32F429 上写入双字
STM32F429开发板用户手册第32章 STM32F429的SPI总线应用之驱动W25QXX(支持查询,中断和DMA)