Миландр
http://forum.milandr.ru/

Флаги запросов прерываний “MDR_CANx->TX”
http://forum.milandr.ru/viewtopic.php?f=33&t=3832
Страница 1 из 1

Автор:  user_1983 [ 2018-фев-20 09:21 ]
Заголовок сообщения:  Флаги запросов прерываний “MDR_CANx->TX”

Вопрос по флагам запросов прерываний на передачу сообщений по CAN в регистре “MDR_CANx->TX”.

Если подобная тема уже существует, то перенаправьте меня туда, так как я не нашел.

Почему, при разрешении буфера на передачу
(т.е. MDR_CANx->BUF_CON[x] = CAN_BUF_CON_EN) сразу же выставляется соответствующий флаг в “MDR_CANx->TX”, который я могу сбросить только, если запретить этот буфер.
Просто, я хочу использовать прерывание на передачу сообщения по CAN, а из-за этой проблемы моя программа сразу после инициализации зависает в обработчике прерывания.
Я думал, что смогу один раз (при инициализации) разрешить буфер на передачу, а потом по мере необходимости выполнять передачу (MDR_CANx->BUF_CON[x] |= CAN_BUF_CON_TX_REQ).
А получается, что для правильной работы необходимо каждый раз в обработчике прерывания запрещать соответствующий буфер, а потом при необходимости передачи устанавливать в MDR_CANx->BUF_CON[x] и CAN_BUF_CON_TX_REQ, и CAN_BUF_CON_EN.

Автор:  Vladimir_K [ 2018-фев-22 12:26 ]
Заголовок сообщения:  Re: Флаги запросов прерываний “MDR_CANx->TX”

user_1983 писал(а):
Вопрос по флагам запросов прерываний на передачу сообщений по CAN в регистре “MDR_CANx->TX”.

Если подобная тема уже существует, то перенаправьте меня туда, так как я не нашел.

Почему, при разрешении буфера на передачу
(т.е. MDR_CANx->BUF_CON[x] = CAN_BUF_CON_EN) сразу же выставляется соответствующий флаг в “MDR_CANx->TX”, который я могу сбросить только, если запретить этот буфер.
Просто, я хочу использовать прерывание на передачу сообщения по CAN, а из-за этой проблемы моя программа сразу после инициализации зависает в обработчике прерывания.
Я думал, что смогу один раз (при инициализации) разрешить буфер на передачу, а потом по мере необходимости выполнять передачу (MDR_CANx->BUF_CON[x] |= CAN_BUF_CON_TX_REQ).
А получается, что для правильной работы необходимо каждый раз в обработчике прерывания запрещать соответствующий буфер, а потом при необходимости передачи устанавливать в MDR_CANx->BUF_CON[x] и CAN_BUF_CON_TX_REQ, и CAN_BUF_CON_EN.


Возможно Вы не совсем правильно поняли работу прерывания передачи. Запрос на прерывание передачи (флаг CAN_TX[x] в регистре MDR_CANx->TX) происходит, когда разрешенный буфер на передачу не имеет запроса на отправку сообщения (когда TX_REQ = 0, регистр MDR_CANx->BUF_CON[x]), т.е. буфер свободен и может быть использован для отправки сообщения. Для передачи сообщения необходимо установить бит TX_REQ, и пока будет происходить отправка, соответствующий буфер будет занят и прерывание вызываться не будет. Вызов прерывания сразу после отправки сообщения не предусмотрен.

Автор:  user_1983 [ 2018-фев-22 13:49 ]
Заголовок сообщения:  Re: Флаги запросов прерываний “MDR_CANx->TX”

Да, похоже, что так и есть. Спасибо!
Правда, на мой взгляд, это не очень логично.
Я именно так и думал, что запрос на прерывание должен возникать один раз после отправки, а не висеть постоянно пока буфер разрешен (и нет запроса на отправку).

Автор:  Vladimir_K [ 2018-фев-22 15:06 ]
Заголовок сообщения:  Re: Флаги запросов прерываний “MDR_CANx->TX”

user_1983 писал(а):
Да, похоже, что так и есть. Спасибо!
Правда, на мой взгляд, это не очень логично.
Я именно так и думал, что запрос на прерывание должен возникать один раз после отправки, а не висеть постоянно пока буфер разрешен (и нет запроса на отправку).


Такая логика вызова прерывания передачи сделана для обеспечения постоянной отправки сообщений без необходимости отслеживать флаг выполнения текущей передачи (TX_REQ) для отправки следующего сообщения, тратя на это процессорное время. Пока сообщение находится в состоянии передачи, процессор занимается выполнением других задач. Как только отправка завершена, вызывается прерывание, процессор отправляет следующий кадр и возвращается к выполнению задач.

Автор:  user_1983 [ 2018-фев-22 15:26 ]
Заголовок сообщения:  Re: Флаги запросов прерываний “MDR_CANx->TX”

Но правильно ли я понимаю, что когда не требуется отправка, то флаг запроса на прерывание в MDR_CANx->TX можно сбросить только, если запретить соответствующий буфер?

Автор:  Vladimir_K [ 2018-фев-22 16:54 ]
Заголовок сообщения:  Re: Флаги запросов прерываний “MDR_CANx->TX”

user_1983 писал(а):
Но правильно ли я понимаю, что когда не требуется отправка, то флаг запроса на прерывание в MDR_CANx->TX можно сбросить только, если запретить соответствующий буфер?


Правильно. Если работа буфера х разрешена на передачу, то флаг запроса на прерывание CAN_TX[х] равен ~TX_REQ. Если работу буфера х запретить, то флаг CAN_TX[х] примет значение логического нуля. Но если отправка не требуется, то можно запретить прерывание CAN_INT_TX[х].

Автор:  user_1983 [ 2018-фев-22 17:08 ]
Заголовок сообщения:  Re: Флаги запросов прерываний “MDR_CANx->TX”

Всё понятно. Еще раз спасибо.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/