Разобрался немного.
Чтобы принять данные на прерываниях в режиме слейва, надо делать так:
До входа в основную петлю вызываем ф-ю
Код
HAL_I2C_Slave_Receive_IT(&hi2c2, slave_rx_buff, 10);
и теперь проц будет ждать пока не придут данные. После этого, массив slave_rx_buff заполнится данными и на этом прием закончится. Ничего больше не будет приниматься.
Чтобы продолжить прием, надо написать ф-ю
Код
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *I2cHandle)
{
if(I2cHandle->Instance==hi2c2.Instance)
{
HAL_I2C_Slave_Receive_IT(&hi2c2, slave_rx_buff, 10);
}
}
где при каждом прерывании будет выполнятся код в теле. И запускаться вновь на ожидание прерываний. Причина- как писали выше- после приема данных, прерывания по i2c запрещаются. Мы т.о. снова их разрешаем.