IIC協議是大多數傳感的通訊協議,每一個嵌入式工程師都要有本身的IIC底層協議html
IIC可細分爲7個函數函數
1.開始ui
2.讀取spa
3.發送指針
4.結束code
5.主機檢測從機應答htm
6. 主機應答blog
7. 主機不該答ip
/******************************************************************************* * * * 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 ( ); //延時 }
ADS1115的ADDR引腳接地,則寄存器地址爲0x90io
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; }
(16位數據/2的15次方)*量程
即(uRev_Register_Data/32768)*4.096
注意有電壓有正負
VCC+/-量程
好比 0v+/-4.096