Добрый день.
Делаю сниффер SPI-шины на STM32F427. Частота процессора 168 МГц, частота исследуемого SPI - 4 МГц.
Использую внешнее прерывание по фронту SCK. Для тестирования посылаю известную посылку из 4-х байт (1 запрос и 3 ответ).
Вариант 1.
Сначала сделал полностью на HAL, как в примерах - в обработчике прерывания вызывается HAL_GPIO_EXTI_IRQHandler(SPI_SCK_PIN), который сбрасывает бит в регистре PR и вызывает пользовательскую функцию HAL_GPIO_EXTI_Callback(). В функции сохраняю состояние порта в буфер и считаю количество прерываний.
В этом случае "ловится" только 24 прерывания вместо 32-х.
Вариант 2.
Перенес операции сброса бита и чтения порта непосредственно в обработчик прерывания. В этом случае "ловится" 32 прерывания, однако значения в буфере не соответствуют реальным: передается байт x7 x6 x5 x4 x3 x2 x1 x0, а в буфере оказывается x6 x5 x4 x3 x2 x1 x0 ?? (как будто сдвинуто на 1 бит)
Без внешних прерываний (в бесконечном цикле ловлю фронт и читаю порт в буфер) все работает как надо.
Почему такое может происходить?