STM32F429 기반 ADS1115 드라이버
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.