STM8 I2 C застревает на EV8 I2 C Событие (I2C_EVENT_MASTER_BYTE_TRANSMITTING) - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь заставить работать коммуникацию 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);
}
...