Миландр

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

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 4 сообщения ] 
Автор Сообщение
 Заголовок сообщения: Передача сообщений по RTR в CAN
СообщениеДобавлено: 2014-авг-21 13:48 
Не в сети

Зарегистрирован: 2013-сен-10 08:02
Сообщения: 16
Откуда: Арзамас
Суть вопроса в следующем - необходимо отвечать на RTR запрос двумя массивами, написал такой код
//Частота 80МГц
//1986ВЕ91Т (1010)

void CAN_init(void) {
  UINT i;

  MDR_RST_CLK->PER_CLOCK |= (1U << 1);
  MDR_RST_CLK->CAN_CLOCK &= ~(RST_CLK_CAN_CLOCK_CAN2_BRG_Msk);
  MDR_RST_CLK->CAN_CLOCK |= (1U << RST_CLK_CAN_CLOCK_CAN2_CLK_EN_Pos) |
          (0U << RST_CLK_CAN_CLOCK_CAN2_BRG_Pos);

  PORT_D_init(MDR_PORTD, PORT_PIN15, PORT_FUNC_MAIN, PORT_DIR_IN, PORT_F_NDOWN, PORT_F_NUP, PORT_F_NPD, PORT_F_NSHM, PORT_F_NGF, PORT_PWR_3, PORT_0); //RX
  PORT_D_init(MDR_PORTD, PORT_PIN9, PORT_FUNC_MAIN, PORT_DIR_OUT, PORT_F_NDOWN, PORT_F_NUP, PORT_F_NPD, PORT_F_NSHM, PORT_F_NGF, PORT_PWR_3, PORT_0); //TX

  MDR_CAN2->BITTMNG |= (1U << CAN_BITTMNG_SB_Pos) |
          (0U << CAN_BITTMNG_SJW_Pos) |
          (1U << CAN_BITTMNG_SEG2_Pos) |
          (2U << CAN_BITTMNG_SEG1_Pos) |
          (1U << CAN_BITTMNG_PSEG_Pos) |
          (9U << CAN_BITTMNG_BRP_Pos);

  MDR_CAN2->CONTROL = (0U << CAN_CONTROL_CAN_EN_Pos) |
          (0U << CAN_CONTROL_ROM_Pos) |
          (0U << CAN_CONTROL_STM_Pos) |
          (0U << CAN_CONTROL_SAP_Pos) |
          (0U << CAN_CONTROL_ROP_Pos);

  MDR_CAN2->OVER = 255;

  MDR_CAN2->STATUS = 0x00000000;
  MDR_CAN2->INT_TX = 0x00000000;
  for (i = 0; i < 32; i++) {
    MDR_CAN2->BUF_CON[i] = 0x0000;
    MDR_CAN2->CAN_BUF_FILTER[0].FILTER = (0x0000U << CAN_ID_SID_Pos) & CAN_ID_SID_Msk;
    MDR_CAN2->CAN_BUF_FILTER[0].MASK = (0x0000U << CAN_ID_SID_Pos) & CAN_ID_SID_Msk;
  }

  i = 0;
  MDR_CAN2->CAN_BUF_FILTER[i].FILTER = (0x0055U << CAN_ID_SID_Pos) & CAN_ID_SID_Msk;
  MDR_CAN2->CAN_BUF_FILTER[i].MASK = (0x07ffU << CAN_ID_SID_Pos) & CAN_ID_SID_Msk;
  MDR_CAN2->BUF_CON[i] = (1U << CAN_BUF_CON_EN_Pos) |
          (0U << CAN_BUF_CON_RX_TXN_Pos) |
          (0U << CAN_BUF_CON_OVER_EN_Pos) |
          (1U << CAN_BUF_CON_RTR_EN_Pos) |
          (0U << CAN_BUF_CON_PRIOR_0_Pos) |
          (0U << CAN_BUF_CON_TX_REQ_Pos) |
          (0U << CAN_BUF_CON_RX_FULL_Pos) |
          (0U << CAN_BUF_CON_OVER_WR_Pos);
  MDR_CAN2->CAN_BUF[i].ID = (0x00aaU << CAN_ID_SID_Pos) & CAN_ID_SID_Msk;
  MDR_CAN2->CAN_BUF[i].DLC = 0x0a08;
  MDR_CAN2->CAN_BUF[i].DATAL = 0x11223344;
  MDR_CAN2->CAN_BUF[i].DATAH = 0x55667788;
  MDR_CAN2->INT_TX |= (1U << i);

  i = 1;
  MDR_CAN2->CAN_BUF_FILTER[i].FILTER = (0x0055U << CAN_ID_SID_Pos) & CAN_ID_SID_Msk;
  MDR_CAN2->CAN_BUF_FILTER[i].MASK = (0x07ffU << CAN_ID_SID_Pos) & CAN_ID_SID_Msk;
  MDR_CAN2->BUF_CON[i] = (1U << CAN_BUF_CON_EN_Pos) |
          (0U << CAN_BUF_CON_RX_TXN_Pos) |
          (0U << CAN_BUF_CON_OVER_EN_Pos) |
          (1U << CAN_BUF_CON_RTR_EN_Pos) |
          (0U << CAN_BUF_CON_PRIOR_0_Pos) |
          (0U << CAN_BUF_CON_TX_REQ_Pos) |
          (0U << CAN_BUF_CON_RX_FULL_Pos) |
          (0U << CAN_BUF_CON_OVER_WR_Pos);
  MDR_CAN2->CAN_BUF[i].ID = (0x00bbU << CAN_ID_SID_Pos) & CAN_ID_SID_Msk;
  MDR_CAN2->CAN_BUF[i].DLC = 0x0a08;
  MDR_CAN2->CAN_BUF[i].DATAL = 0x12345678;
  MDR_CAN2->CAN_BUF[i].DATAH = 0x9abcdef0;
  MDR_CAN2->INT_TX |= (1U << i);

  MDR_CAN2->CONTROL |= (1U << CAN_CONTROL_CAN_EN_Pos);
}
если оставить один буфер - то работает, а если по полной (как в примере) то после приема ID=0x55 постоянно на шине попеременно выдаются массивы с ID=0xaa и ID=0xbb

Если так нельзя делать с двумя буферами настроенными на один тот же ID, то как можно организовать ответ двумя массивами на один запрос RTR?


Вернуться к началу
 Заголовок сообщения: Re: Передача сообщений по RTR в CAN
СообщениеДобавлено: 2014-авг-21 15:08 
Не в сети

Зарегистрирован: 2013-сен-10 08:02
Сообщения: 16
Откуда: Арзамас
Победил данную проблему установкой бита ROP :mrgreen:


Вернуться к началу
 Заголовок сообщения: Re: Передача сообщений по RTR в CAN
СообщениеДобавлено: 2014-авг-21 15:14 
Не в сети

Зарегистрирован: 2013-сен-10 08:02
Сообщения: 16
Откуда: Арзамас
Спасибо ошибке 029 свежей errate :lol:


Вернуться к началу
 Заголовок сообщения: Re: Передача сообщений по RTR в CAN
СообщениеДобавлено: 2020-мар-24 10:07 
Не в сети

Зарегистрирован: 2015-май-25 13:52
Сообщения: 23
Добрый день. Вопрос про перезапись данных заготовленных для RTR буфера. Вот есть у меня буфер настроенный на RTR запросы. Я постоянно хочу обновлять DATA этого буфера.
Что будет если события принятия запроса и обновления совпадут? Есть ли какой-то механизм защиты? Или достаточно смотреть на бит TX_REQ, но тут вопрос как он работает в RTR. Если я записал данные в буфер, то пока не придет RTR запрос TX_REQ=1? А я же хочу обновлять данные даже если запроса не было.
Судя по ДШ TX_REQ работает также как при обычной передаче, хотим отправить данные, смотрим TX_REQ=0 (предыдущие ушли), пишем данные, ставим бит TX_REQ=1.

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

Спасибо.


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

Часовой пояс: UTC+03:00


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

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


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

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB