с халом HALом косяк. См
исходники В блокирующем чтении да, не выйдем из приема, пока не получим нужное кол-во байт, либо по таймауту.
в неблокирующем режиме по прерываниям, тут ворде можно можно получить переменное кол-во байт.
Вызывайте HAL_I2C_Slave_Receive_IT(hi2c, pData,
255);
на сколько я понял, в обработчике прерывания не контролируется размер принятых байт.
хал в прерывании автоматом будет ловить принятые байты и стоп.
После появления STOP-условия прием завершиться и будет вызвана функция void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c).
Определите у себя в коде void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c). Кол-во принятых байт
255 - hi2c->XferSize. Из неё отправляйте в таск эвент/флаг/сигнал/мессадж...
ps на сколько я понял, если вызвать HAL_I2C_Slave_Receive_IT(hi2c, pData,
2);, а мастер передаст больше 2-х байт,
стрельните себе HAL выстрелит вам в ногу.