STM32F4 Время простоя SPI между каждым кадром данных, почему оно слишком велико?

Я пытаюсь прочитать 256 бит менее чем за 32 мс из SPI, кадр данных составляет 16 бит. Моя проблема в том, что драйвер SPI имеет большое время простоя между каждыми 16 битами. Посмотрите на эту картинку, как вы можете видеть, я читаю 64 бита (выделено красным прямоугольником), и есть длинные паузы между каждым кадром. Я ничего не нашел в спецификации SPI по этому поводу.

Я тестирую плату STM32F407 от Keil, и SPI инициализируется драйвером Keil CMSIS по умолчанию.

Есть ли способ уменьшить это время простоя?


person Keivan    schedule 15.06.2018    source источник
comment
Почему тег m4?   -  person uzsolt    schedule 15.06.2018
comment
Как вы передаете данные? Завершить опрос tx и отправить больше, получить прерывание и отправить больше или использовать DMA? Вы мастер SPI?   -  person Colin    schedule 18.06.2018
comment
SPI работает в ведущем режиме. Я использую драйвер CMSIS, поэтому я не уверен, как этот драйвер отправляет. Я делаю следующее: uint16_t rx_buffer[4]; uint16_t read_command[4] = {0x8000,0x0000,0x0000,0x0000}; SPIdrv-›Transfer(read_command, rx_buffer, 4); Проверьте документы здесь: ссылка проблема заключается в долгое время простоя между передачей этих 4-х полуслов. Нет, я не использую DMA (я планирую это реализовать), но в любом случае DMA не изменит время простоя SPI между каждым кадром.   -  person Keivan    schedule 19.06.2018
comment
Пожалуйста, покажите полный код вашего драйвера CMSIS. Кроме того, какова тактовая частота ядра и периферийной шины?   -  person Alexey Esaulenko    schedule 19.06.2018


Ответы (1)


Вы можете показать фрагмент кода для остальных людей, чтобы они могли помочь, но в любом случае я помню, что столкнулся с той же проблемой. Вот как я уменьшаю этот дополнительный временной разрыв;

Используйте прямой доступ к регистру вместо функций, как для отправки, так и для проверки флагов.

Если это также не сработает, вместо проверки флага вы можете использовать простой цикл for с некоторой задержкой, чтобы поддерживать тактовый сигнал достаточно низким, но не слишком большим, проверьте с помощью осциллографа, чтобы найти точное число итераций.

Также убедитесь, что во время отправки сообщения не обслуживается прерывание, может быть прерывание ISR между концом передачи и кодом, который устанавливает высокий уровень сигнала CLK. Если у вас есть ISR, которые происходят асинхронно и имеют большой размер, это, вероятно, так.

SPI1->DR = (uint16_t)Data; while(!(SPI1->SR & SPI_SR_TXE));

PS: я сделал это на Cortex-M3, без RTOS, с периферийной библиотекой STD.

Изменить: также попробуйте только с флагом занятости, таким образом проверяя только EOC while(SPI1->SR & SPI_SR_BSY);

person İlkerK    schedule 10.08.2018