Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-дек-19 03:02

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: 2018-фев-20 09:21 
Не в сети

Зарегистрирован: 2018-янв-23 21:37
Сообщения: 17
Вопрос по флагам запросов прерываний на передачу сообщений по 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.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-фев-22 12:26 
Не в сети

Зарегистрирован: 2017-июл-14 15:02
Сообщения: 28
Откуда: АО "ПКК Миландр"
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, и пока будет происходить отправка, соответствующий буфер будет занят и прерывание вызываться не будет. Вызов прерывания сразу после отправки сообщения не предусмотрен.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-фев-22 13:49 
Не в сети

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-фев-22 15:06 
Не в сети

Зарегистрирован: 2017-июл-14 15:02
Сообщения: 28
Откуда: АО "ПКК Миландр"
user_1983 писал(а):
Да, похоже, что так и есть. Спасибо!
Правда, на мой взгляд, это не очень логично.
Я именно так и думал, что запрос на прерывание должен возникать один раз после отправки, а не висеть постоянно пока буфер разрешен (и нет запроса на отправку).


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

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-фев-22 15:26 
Не в сети

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-фев-22 16:54 
Не в сети

Зарегистрирован: 2017-июл-14 15:02
Сообщения: 28
Откуда: АО "ПКК Миландр"
user_1983 писал(а):
Но правильно ли я понимаю, что когда не требуется отправка, то флаг запроса на прерывание в MDR_CANx->TX можно сбросить только, если запретить соответствующий буфер?


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

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-фев-22 17:08 
Не в сети

Зарегистрирован: 2018-янв-23 21:37
Сообщения: 17
Всё понятно. Еще раз спасибо.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB