Estoy tratando de establecer una comunicación I2C entre STM32F030K6T6 mikrokontroller y HH10D sensor de humedad. El problema es que, después de que llame a I2C_TransferHandling (), el indicador I2C_ISR_TXIS no se activará y el programa se apaga en el bucle esperándolo.
Aquí está mi código, lo hice basado en el código de ejemplo en la biblioteca de periféricos estándar.
void initI2C()
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_1);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
I2C_InitTypeDef I2C_InitStructure;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
I2C_InitStructure.I2C_DigitalFilter = 0x00;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Timing = 0x00201D2B;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
}
uint8_t I2C_Read(uint8_t address, uint8_t reg){
uint8_t ReadByte;
I2C_TransferHandling(I2C1,address, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TXIS) == RESET); //the program stucks here
I2C_SendData(I2C1, (uint8_t)reg);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_TC) == RESET);
I2C_TransferHandling(I2C1,address, 1, I2C_AutoEnd_Mode,I2C_Generate_Start_Read);
ReadByte = I2C_ReceiveData(I2C1);
while(I2C_GetFlagStatus(I2C1, I2C_ISR_RXNE) == RESET);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF));
I2C_ClearFlag(I2C2, I2C_ICR_STOPCF);
return ReadByte;
}
Y la llamada de la función de lectura:
uint16_t readSensitivity()
{
//The sensor address is 0x01, the register adresses are 0x0A and 0x0B
return (I2C_Read(0x01, 0x0A) << 8) + I2C_Read(0x01, 0x0B);
}
La parte relevante de mi esquema es la siguiente:
¿Cuál puede ser el problema?