Я пытаюсь заставить работать коммуникацию SMbus, и она работает нормально большую часть времени, но я видел, что через некоторое время (около 10-20 запусков) он застревает в событии I2 C I2C_EVENT_MASTER_BYTE_TRANSMITTING.
Я реализовал функцию тайм-аута, которая повторяет событие 255 раз, но я все еще вижу, что возвращение, которое я получаю от события повтора I2 C, является ошибкой. Я также попытался выполнить сброс MCU и повторно инициализировать I2 C, если он все еще застревает после истечения времени ожидания, но затем mcu сбрасывается все время.
Неправильно ли работает моя функция I2C_EventRetry? Или есть какой-нибудь хороший способ справиться с этой ошибкой?
Ниже приведены мои функции Init, Transmit и Event Retry. В моем основном l oop я сначала вызываю функцию init, а затем в while (1) вызываю функцию StartTransmit
void I2C_Init()
{
/* Initialize I2C peripheral */
I2C_Init(I2C1, I2C_SPEED, 0x00,
I2C_Mode_SMBusHost, I2C_DutyCycle_2,
I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit); // 0x00 is a dummy value. Only used in slave mode
I2C_Cmd(I2C1, ENABLE); // Enable peripheral
}
static void I2C_EventRetry(I2C_Event_TypeDef I2C_Event)
{
uint8_t retryCounter = 0;
do{
Delay_Us(1);
retryCounter++;
}while((!I2C_CheckEvent(I2C1, I2C_Event)) && (retryCounter < RETRY_LIMIT));
}
static void StartTransmit(uint8_t slaveAddress, uint8_t commandCode, uint8_t dataLength, uint8_t
regAddress1, uint8_t regAddress2)
{
/* Disable I2C acknowledgement */
I2C_AcknowledgeConfig(I2C1, ENABLE);
/* Send I2C START condition */
I2C_GenerateSTART(I2C1, ENABLE);
/* Test on I2C EV5 and clear it */
I2C_EventRetry(I2C_EVENT_MASTER_MODE_SELECT);
/* Send slave address for write */
I2C_Send7bitAddress(I2C1, slaveAddress, I2C_Direction_Transmitter);
/* Test on I2C EV6 and clear it */
I2C_EventRetry(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);
/* Send the command code */
I2C_SendData(I2C1, commandCode);
/* Test on I2C EV8 and clear it */
I2C_EventRetry(I2C_EVENT_MASTER_BYTE_TRANSMITTING);
/* Send the Data length */
I2C_SendData(I2C1, dataLength);
/* Test on I2C EV8 and clear it */
I2C_EventRetry(I2C_EVENT_MASTER_BYTE_TRANSMITTING);
/* Send the Data byte */
I2C_SendData(I2C1, regAddress1);
/* Test on I2C EV8 and clear it */
I2C_EventRetry(I2C_EVENT_MASTER_BYTE_TRANSMITTING);
/* Send the Data byte */
I2C_SendData(I2C1, regAddress2);
/* Test on I2C EV8 and clear it */
I2C_EventRetry(I2C_EVENT_MASTER_BYTE_TRANSMITTED); //EV8_2
/* Send Stop condition */
I2C_GenerateSTOP(I2C1, ENABLE);
Delay_Ms(1);
/* Send I2C START condition */
I2C_GenerateSTART(I2C1, ENABLE);
/* Test on I2C EV5 and clear it */
I2C_EventRetry(I2C_EVENT_MASTER_MODE_SELECT);
/* Send slave address for write */
I2C_Send7bitAddress(I2C1, slaveAddress, I2C_Direction_Transmitter);
/* Test on I2C EV6 and clear it */
I2C_EventRetry(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);
/* Send the command code */
I2C_SendData(I2C1, commandCode);
/* Test on I2C EV8 and clear it */
I2C_EventRetry(I2C_EVENT_MASTER_BYTE_TRANSMITTED); //EV8_2
/* Send Stop condition */
I2C_GenerateSTOP(I2C1, ENABLE);
}