Спасибо что откликнулись.
Пошаговая отладка показала что переменая (см. ниже) LastEvent получает значение 0х00030041, вместо 0х00030001. похоже гдето ещо появляется событие RxNE: Data Register not Empty (receivers).
но откуда, и почему при шаговом выполнении все работает? не пойму. Переделал подтяжку согласно доки (добавил по резистору между шиной и контроллером), ничего не поменялось.
подскажите, как побороть эту беду
/*******************************************************************************
* Function Name : I2C_CheckEvent
* Description : Checks whether the last I2Cx Event is equal to the one passed
* as parameter.
* Input : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* - I2C_EVENT: specifies the event to be checked.
* This parameter can be one of the following values:
* - I2C_EVENT_SLAVE_ADDRESS_MATCHED : EV1
* - I2C_EVENT_SLAVE_BYTE_RECEIVED : EV2
* - I2C_EVENT_SLAVE_BYTE_TRANSMITTED : EV3
* - I2C_EVENT_SLAVE_ACK_FAILURE : EV3-1
* - I2C_EVENT_MASTER_MODE_SELECT : EV5
* - I2C_EVENT_MASTER_MODE_SELECTED : EV6
* - I2C_EVENT_MASTER_BYTE_RECEIVED : EV7
* - I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8
* - I2C_EVENT_MASTER_MODE_ADDRESS10 : EV9
* - I2C_EVENT_SLAVE_STOP_DETECTED : EV4
* Output : None
* Return : An ErrorStatus enumuration value:
* - SUCCESS: Last event is equal to the I2C_Event
* - ERROR: Last event is different from the I2C_Event
*******************************************************************************/
ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, u32 I2C_EVENT)
{
u32 LastEvent = 0;
u32 Flag1 = 0, Flag2 = 0;
ErrorStatus status = ERROR;
/* Check the parameters */
assert_param(IS_I2C_EVENT(I2C_EVENT));
Flag1 = I2Cx->SR1;!!!!!!!!!!!иногда стает 0х00000041, хотя SR1=0х00000001!!!!!!!!!!!!!!!!!!
Flag2 = I2Cx->SR2;
Flag2 = Flag2 << 16;
/* Get the last event value from I2C status register */
LastEvent = (Flag1 | Flag2) & I2C_FLAG_Mask;
/* Check whether the last event is equal to I2C_EVENT */
if (LastEvent == I2C_EVENT )
{
/* SUCCESS: last event is equal to I2C_EVENT */
status = SUCCESS;
}
else
{
/* ERROR: last event is different from I2C_EVENT */
status = ERROR;
}
/* Return status */
return status;
}