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

  • 相关阅读:
    vector容器(一)
    螺旋数组实现
    zigzag数组实现
    HDU 1496
    HDU 1381 Crazy Search
    什么叫软核,固核,硬核?
    “杜拉拉思维模式”之六:小组面试提升术
    硬件工程师电路设计必须紧记的十大要点
    面试的“群殴”宝典
    三段式状态机 [CPLD/FPGA]
  • 原文地址:https://www.cnblogs.com/feiniaoliangtiangao/p/10896383.html
Copyright © 2020-2023  润新知