基于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

STM32F429基于CUBEMX的串口中断接收

无法使用 HAL 驱动程序在 STM32F429 上写入双字

一个基于STM32F429 HAL库的学习工程模板

STM32F429开发板用户手册第32章 STM32F429的SPI总线应用之驱动W25QXX(支持查询,中断和DMA)