реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> stm32f4 - странности при обработке внешнего прерывания
Harvester
сообщение Apr 29 2017, 10:05
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Добрый день.
Делаю сниффер 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 бит)

Без внешних прерываний (в бесконечном цикле ловлю фронт и читаю порт в буфер) все работает как надо.

Почему такое может происходить?


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
adnega
сообщение Apr 29 2017, 10:22
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Harvester @ Apr 29 2017, 13:05) *
Делаю сниффер SPI-шины. Использую внешнее прерывание по фронту SCK.

А чем аппаратный SPI-slave не угодил?
Может, у вас по фронту данные SPI защелкивает и тут же выставляет на MOSI новый бит.
MOSI нужно считывать именно в момент перехода SCK из 0 в 1 (хотя есть разные варианты).
Конечно же считывание MOSI в прерывании будет гораздо позже.
Может, стоит воспользоваться копеечным логическим анализатором, а не разрабатывать свой сниффер?
Go to the top of the page
 
+Quote Post
Harvester
сообщение Apr 29 2017, 13:00
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(adnega @ Apr 29 2017, 13:22) *
А чем аппаратный SPI-slave не угодил?

Мне нужен именно сниффер - просмотреть обе линии MISO и MOSI. Хотя, можно взять два слейва... - попробую.
Цитата(adnega @ Apr 29 2017, 13:22) *
Может, у вас по фронту данные SPI защелкивает и тут же выставляет на MOSI новый бит.

Обмен идет корректно, на время отладки с одной стороны аппаратный SPI, с другой - NOR-Flash.
Цитата(adnega @ Apr 29 2017, 13:22) *
MOSI нужно считывать именно в момент перехода SCK из 0 в 1 (хотя есть разные варианты).
Конечно же считывание MOSI в прерывании будет гораздо позже.

Насколько "гораздо"? Пусть даже 30 тактов - при частоте процессора 168 МГц эта задержка должна быть незаметна для частоты прерываний 4 МГц.
Цитата(adnega @ Apr 29 2017, 13:22) *
Может, стоит воспользоваться копеечным логическим анализатором, а не разрабатывать свой сниффер?

В данный конкретный момент у меня его нет, а задача неожиданно возникла.

Да и вообще, уже хочется просто понять, что происходит и чего я не понимаю. laughing.gif


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
adnega
сообщение Apr 29 2017, 16:38
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Harvester @ Apr 29 2017, 16:00) *
Мне нужен именно сниффер - просмотреть обе линии MISO и MOSI. Хотя, можно взять два слейва... - попробую.

Раз сниффер, значит смотреть будет человек.
Может, проще с частотой 8 МГц по таймеру через DMA складывать значения CS + MOSI + MISO + SCK в память,
а затем неспешно анализировать?

Цитата(Harvester @ Apr 29 2017, 16:00) *
Насколько "гораздо"? Пусть даже

Да, хоть один такт. Представьте себе цепочку из D-триггеров.
По фронту на выход они записывают, что было на входе, но вход через t меняется,
где t - время распространения сигнала от входа к выходу (т.к. скорость работы логики конечна).

Цитата(Harvester @ Apr 29 2017, 16:00) *
В данный конкретный момент у меня его нет, а задача неожиданно возникла.

Логический анализатор - это инструмент для решения подобных задач.
Он у вас должен был быть задолго до того, как вы взялись за эту задачу))
Типа такого.
Цитата(Harvester @ Apr 29 2017, 16:00) *
Да и вообще, уже хочется просто понять, что происходит и чего я не понимаю. laughing.gif

По возможности лучше использовать аппаратные ресурсы МК.
Соотношение 168:4 дает всего лишь 42 такта на отсчет. Не понятно, что вы хотите успеть сделать полезного.
12 тактов на вход, 12 на выход, несколько на сброс флага прерывания - остается ничего. При этом других прерываний возникать не должно.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 29 2017, 20:17
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Harvester @ Apr 29 2017, 12:05) *
Делаю сниффер SPI-шины на STM32F427. Частота процессора 168 МГц, частота исследуемого SPI - 4 МГц.
Использую внешнее прерывание по фронту SCK. Для тестирования посылаю известную посылку из 4-х байт (1

Самый главный вопрос - ЗАЧЕМ?
Есть же совсем дешёвые готовые на CY7C68013 и с гораздо лучшими характеристиками.
И непонятно, что за исследуемый SPI? Сколько бит: single? dual? quad? Сколько рабочих перепадов SCLK: обычный? DDR?
А если уж так хочется слепить свой лисапед, то стоит хотя бы выбирать подходящий МК. Взять хотя-бы любой МК с quad-SPI и FIFO, тогда, если нужно захватить single-SPI, то все его сигналы завести на линии D0-D3 этого quad-SPI и при помощи DMA вытянуть их. Даже и с большей частотой.
А ещё лучше - взять LPC43xx - на его SGPIO не проблема захватить даже очень много параллельных битовых потоков без потерь и с большой частотой.
Ну или даже взять тот же CY7C68013 если нужно просто захватить сигнал в комп.

Делать что-то с захватом ногодрыгом по прерыванию - пустая затея. SPI с SCLK=4МГц невозможно программно захватить на МК частотой 168МГц. Нужен МК с частотой в несколько раз выше.

Цитата(adnega @ Apr 29 2017, 18:38) *
Может, проще с частотой 8 МГц по таймеру через DMA складывать значения

Чтобы более-менее посмотреть сигнал с частотой 4МГц, нужно сэмплирование в разы больше. Хотя-бы в 4 раза.
Проц 168МГц на прерывании 4МГц уже захлебнётся - слишком много.
Go to the top of the page
 
+Quote Post
Den64
сообщение Apr 29 2017, 21:21
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 584
Регистрация: 22-11-07
Из: Курская область
Пользователь №: 32 571



Цитата(adnega @ Apr 29 2017, 19:38) *
Соотношение 168:4 дает всего лишь 42 такта на отсчет. Не понятно, что вы хотите успеть сделать полезного.

Меньше 42 тактов. Через 21 такт выход начнёт устанавливать новое состояние. Итого 21 такт + некоторое время пока фронт ползёт.
Можно попробовать либо прерывание настроить не по фронту защёлкивания а по фронту установки бита. Либо как автор писал выше, что заработало в цикле.
Go to the top of the page
 
+Quote Post
Harvester
сообщение Apr 30 2017, 10:15
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(Den64 @ Apr 30 2017, 00:21) *
Меньше 42 тактов. Через 21 такт выход начнёт устанавливать новое состояние. Итого 21 такт + некоторое время пока фронт ползёт.


Всем спасибо, свои заблуждения по поводу внешнего прерывания понял и осознал. smile3046.gif

Отдельное спасибо jcxz за идеи и информацию о SGPIO.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 04:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016