STM32F429 기반 ADS1115 드라이버

18735 단어
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

좋은 웹페이지 즐겨찾기