2017-10-26 3 views
0

i2c를 사용하여 ADT7420 온도 센서에서 읽을 HAL 라이브러리가있는 STM32 마이크로 컨트롤러를 설정하려고합니다. 그러나 내 코드를 실행하면 센서에서 올바른 값을 읽을 수 없습니다. ,i2C 인터페이스를 사용하여 ADT7420 온도 센서에서 읽음

uint8_t I2C_ADDR = 0x48; 
uint8_t TEMP_CONFIG = 0x03; 

uint8_t data[2]; 

HAL_I2C_Master_Transmit(&hi2c1, I2C_ADDR, &TEMP_CONFIG , 1, 10000); 

HAL_I2C_Master_Receive(&hi2c1, I2C_ADDR, data, 2, 10000); 

uint16_t temp_raw = (uint16_t)((data[0]<<8) | data[1]); 
int temp_value = calc_celcius(temp_raw); //TODO: convert to Celsius 

이 코드를 사용하여 온도 뭔가가 제대로 작동되지 않음을 나타내는 제로 유지 : 여기

는 지금까지 HAL 라이브러리를 사용하여 수행 한 방법이다. 온도 값을 읽으려면 i2c 설정에 대한 일부 구성 설정이 누락 되었습니까? 감사.

답변

2

레지스터 주소를 I2C 쓰기의 첫 번째 바이트로 보내고 그 레지스터에 쓸 데이터 또는 I2C가 값을 반복해서 시작하고 읽어야합니다. 자세한 내용은 링크 된 데이터 시트의 18 및 19 페이지를 참조하십시오.

HAL_I2C_Mem_Write()HAL_I2C_Mem_Read() 함수가이 주소 작성을 처리해야합니다. 그래서, 코드의이 부분은

HAL_I2C_Mem_Write(&hi2c1, I2C_ADDR, 0x03, I2C_MEMADD_SIZE_8BIT, &TEMP_CONFIG , 1, 10000); 
HAL_I2C_Mem_Read(&hi2c1, I2C_ADDR, 0x00, I2C_MEMADD_SIZE_8BIT, data, 2, 10000); 

면책 조항과 같습니다 내 대답 만 제공되는 문서 및 소스 코드를 통해 빠른 읽기를 기반으로 그래서, 그냥 HAL 라이브러리와 경험이 없다.

또한 IC의 전원을 켠 직후에 0이 아닌 값을 얻으려면 먼저 변환을 완료 할 때까지 기다려야한다는 점에 유의하십시오. 데이터 시트에 따르면, 첫 번째 변환은 6ms 만 (낮은 정밀도로) 수행되어야하며, 일반 모드에서의 각 변환은 240ms가 걸립니다.

+0

답장을 보내 주셔서 감사합니다. 정상 모드에서 실행하려면 TEMP_CONFIG의 어떤 값을 요구할 수 있습니까? – Mrchacha

+0

정상 모드 (연속 변환)는 비트 # 5와 비트 # 6에서 0으로 설정되므로 기본 (0) 설정 레지스터로 충분합니다. 다른 비트는 응용 프로그램과 필요에 따라 다릅니다. 이것은 출력 신호 및 알람 등과 관련이 있으며 변환 모드는 아닙니다. (필자는 코드에있는 내용을 여기에 넣었으므로 실제로 설정 레지스터에 아무 것도 쓰지 않는 것이 좋습니다.) – Martin

+0

Btw. 스 니펫 (콜백?)에 표시되지 않은 방식으로 오류를 처리하지 않으면 I2C xfer를 요청한 후에도 오류가 있는지 확인해야합니다. 잘못된 주소, 배선 문제 등 여러 가지 이유로 실패 할 수 있습니다. 이는 라이브러리를 이해하는 한 반환 코드를 확인하고 자세한 내용은 HAL_I2C_GetError() 및/또는 HAL_I2C_GetState()를 호출하는 것입니다. – Martin

0

여기 하고 메인 program..then에서 하나 개의 태스크를 생성 .. 초기 I2C 어드레스를 제공

static void temp_Init(void) 
{ 
HAL_I2C_Mem_Write(&hi2c1, (uint8_t) W_ADDR, (uint8_t) CONFIG_REG , 
      (uint8_t) 1,Config, 1, 1000); 
HAL_I2C_Mem_Write(&hi2c1, (uint8_t) W_ADDR, (uint8_t) thigh , (uint8_t) 1, 
     THigh, 1, 1000); 
HAL_I2C_Mem_Write(&hi2c1, (uint8_t) W_ADDR, (uint8_t) tlow , (uint8_t) 1, TLow, 1, 1000); 
} 

상기 명령하면 ... HAL_Drive 기반으로하는 온도 센서 (TMP175)을 사용하고 생성 된 작업은 함수를 호출하고 온도 값을 얻습니다. 다음 코드를 사용하십시오.

void StartDefaultTask(void const * argument) 
{ 

    HAL_I2C_Mem_Read(&hi2c1, (uint8_t) R_ADDR, (uint8_t)CONFIG_REG , (uint8_t) 1, 
&ConfigReg[0], 1, 1000); 

printf(" configreg==%x\t \r",ConfigReg[0]); 

HAL_I2C_Mem_Read(&hi2c1, (uint8_t) R_ADDR, (uint8_t) tlow, (uint8_t) 1,TLowReg, 
2, 1000); 
TLow1=(TLowReg[0]<<4); 
TLow1|=(TLowReg[1]>>4); 
TL=TLow1*0.0625; 
printf(" Lower Limit Temperature=%f deg celsius \r ", TL); 

HAL_I2C_Mem_Read(&hi2c1, (uint8_t) R_ADDR, (uint8_t) thigh, (uint8_t) 1,THighReg, 2, 1000); 
THigh1=(THighReg[0]<<4); 
THigh1|=(THighReg[1]>>4);TH=THigh1*0.0625; 
printf(" upper Limit Temperature=%f deg celsius \r", TH); 
HAL_I2C_Mem_Read(&hi2c1, (uint8_t) R_ADDR, (uint8_t) TEMPERATURE, (uint8_t) 1, TempReg, 2, 1000); 
Shift= TempReg[0]<<4; 
Shift|= TempReg[1]>>4; 

Temp=Shift*0.0625; 
printf("Temperature=%f deg Celsius \r",Temp); 
}