STM32 HAL CAN TX почтовые ящики

Я работаю над проектом, который использует драйверы STM32 HAL, и в частности драйвер CAN в режиме прерывания. Я понимаю, что микроконтроллер STM32F407xx имеет три возможности передачи почтовых ящиков, что позволяет пользователям «запрашивать» три сообщения для передачи одновременно.
Драйвер HAL CAN, однако, кажется, возвращает HAL_BUSY, когда HAL_CAN_Transmit_IT() вызывается быстро, при втором вызове; взглянув на исходный код, похоже, что функция не проверяет, пусты ли какие-либо другие почтовые ящики, прежде чем установить статус дескриптора в BUSY_TX (даже если другой почтовый ящик может использоваться для следующего сообщения), предотвращая последовательный вызов от добавления сообщения в другой почтовый ящик.

Я упускаю что-то о том, как работает этот водитель? Кто-нибудь сталкивался с этим в прошлом? Любые мысли будут оценены.

Спасибо!

1 ответ

  1. Большая часть моей работы STM32 является голым металлом или с открытой библиотекой, поэтому я не знаком с официальными наборами инструментов STM32, такими как cube, которые я предполагаю, что вы используете.

    С этой оговоркой из пути, я думаю, что это связано с тем, как почтовые ящики используются.

    В документах для STM32F413 / 423 (раздел 32.3.3) говорится::
    Three transmit mailboxes are provided to the software for setting up messages. The transmission Scheduler decides which mailbox has to be transmitted first.

    В разделе 32.7.1 говорится, что отправляется приоритет почтового ящика

    По идентификатору: когда несколько почтовых ящиков передачи находятся в ожидании, порядок передачи задается идентификатором сообщения, хранящегося в почтовом ящике. Сообщение с наименьшим значением идентификатора имеет наивысший приоритет в соответствии с арбитражем протокола CAN. Если значения идентификаторов равны, сначала будет назначен Нижний номер почтового ящика.

    По порядку запроса передачи: почтовые ящики передачи могут быть настроены как передача FIFO, установив бит TXFP в регистре CAN_MCR. В этом режиме порядок приоритета задается порядком запроса передачи.

    Эффект заключается в том, что при загрузке почтового ящика 0, затем 1, затем 2, они могут завершаться в любом порядке в зависимости от идентификатора CAN сообщения. Это связано с тем, что идентификаторы CAN вытягивают двойной рулон как «адрес» и как маркер приоритета сообщения. Такое поведение почтового ящика позволяет автоматически устанавливать приоритеты для программиста.

    Однако для большинства типов трафика сообщения должны отправляться в том порядке, в котором они были поставлены в очередь. Использование одного почтового ящика предотвращает скремблирование порядка сообщений.

    Так, может быть, это то, что вы видите.