Перейти к содержанию
    

Простите если глупый вопрос...

Но что-то уже пол-дня не разобраться...

 

В какой момент микроконтроллер (at90can128) начинает передачу данных (Отправляет данные из Moba настроенного на передачу)???

в USART все просто UDR0=0x01 и передача начилась....

А вот в CAN'е не понятно))))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вариантов реализации CAN-контроллера много. Но все они сперва слушают шину, если на ней нет активности, то начинают передавать свои данные. Если в процессе передачи идентификатора пакета проигрывается арбитраж, то контроллер может ждать очередной паузы на шине для повтора сообщения или сообщить приложению о факте проигрыша, Уже зависит от настроек и конкретной реализации.

Именнос этой микросхемой не работал. Пользовал SiLabs C8051F040

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот в CAN'е не понятно))))

Еще нужно отметить, что приемник выдает ACK как в I2C, т.е. передатчик никогда не завершит передачу успешно без приемника на линии.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вариантов реализации CAN-контроллера много. Но все они сперва слушают шину, если на ней нет активности, то начинают передавать свои данные. Если в процессе передачи идентификатора пакета проигрывается арбитраж, то контроллер может ждать очередной паузы на шине для повтора сообщения или сообщить приложению о факте проигрыша, Уже зависит от настроек и конкретной реализации.

Именнос этой микросхемой не работал. Пользовал SiLabs C8051F040

 

то есть если на шине сидит энное количество устройств и каждое настроено на прием и передачу.

И если приема нет все начинают передавать (учитывая арбитраж) даже когда от них это не нужно?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

все начинают передавать (учитывая арбитраж) даже когда от них это не нужно?

Что значит "не нужно"? "Если кто-то зажигает звезды ..."

Вы же сами "звезды зажигаете" = систему проектируете, вы должны заложить такие принципы обмена, чтобы шина была достаточно свободной, приоритеты соблюдались и проч.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Начало передачи инициализируется программой,.

 

Тогда я так и не получил ответа на свой вопрос:

В какой момент микроконтроллер (at90can128) начинает передачу данных (Отправляет данные из Moba настроенного на передачу)???

в USART все просто UDR0=0x01 и передача началась....

 

 

редактор написал:Но все они сперва слушают шину, если на ней нет активности, то начинают передавать свои данные.

 

На что я и спросил: И если приема нет все начинают передавать (учитывая арбитраж) даже когда от них это не нужно?

 

 

Простите, что может я что-то не понимаю. (Хотя я прекрасно понимаю что передачу я должен сам задать), но мне до

сих пор не ясно ПОСЛЕ КАКОЙ КОМАНДЫ (после всех настроек) непосредственно начинается передача)))))...

то есть: это после того как настроил MOB на передачу и после этого включил CAN.... или как по аналогии с USART -> в регистр данных записал инфу -> CANMSG(или как там его) -> и пошла передача???

 

P.S. можно привести в пример другие микроконтроллеры если с данным, не довелось поработать.

Изменено пользователем lons83

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Само по себе заполнение данными не вызывает передачу, специальный битик должен быть для установки передачи.

Например в популярном внешнем контроллере MCP2515 это бит MCP_TXB_TXREQ_M в регистре TXBnCTRL

 

void mcp2515_start_transmit(uchar buffer_sidh_addr)
{    mcp2515_modifyRegister( buffer_sidh_addr-1 , MCP_TXB_TXREQ_M,    MCP_TXB_TXREQ_M );
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Само по себе заполнение данными не вызывает передачу, специальный битик должен быть для установки передачи.

Например в популярном внешнем контроллере MCP2515 это бит MCP_TXB_TXREQ_M в регистре TXBnCTRL

 

void mcp2515_start_transmit(uchar buffer_sidh_addr)
{    mcp2515_modifyRegister( buffer_sidh_addr-1 , MCP_TXB_TXREQ_M,    MCP_TXB_TXREQ_M );
}

 

спасибо)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это код как раз для AT90CAN128 на передачу данных в настроенный канал(в данном случае первый). Вас непосредственно интересуют две последние строчки.

   CANPAGE     = (1 << 4);
   CANIDT2     = (U8)(msg_id << 5);
   CANIDT1     = (U8)(msg_id >> 3);
   CANCDMOB    = size;
   if (NULL != data_p) {
       if (DLC_MAX >= size) {
           while (size--) {
               CANMSG = *data_p++;
           }
       } else {
           D_LOG_MDL(D_LOG_WARNING, "data overflow!");
           return ERR_OVERFLOW;
       }
   }

   CANSTMOB = 0;
   while (HAL_BIT_CHECK(CANGSTA, TXBSY));
   CANEN2   |= (1 << 1);                             /* channel 1 enable */
   CANCDMOB |= CH_TxENA;                       /* emission enabled */

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это код как раз для AT90CAN128 на передачу данных в настроенный канал(в данном случае первый). Вас непосредственно интересуют две последние строчки.

   CANEN2   |= (1 << 1);                             /* channel 1 enable */
   CANCDMOB |= CH_TxENA;                       /* emission enabled */

 

Спасибо большое)))

а в регистр CANEN2 разве можно записывать? у меня в документации сказано что только Read.

и CH_TxENA это аналог 1<<CONMOB0 ?

Изменено пользователем lons83

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо большое)))

а в регистр CANEN2 разве можно записывать? у меня в документации сказано что только Read.

Да, действительно, он только Read. Значит эту команду можно игнорировать. Код частично достался в наследство, я не сильно вчитывался )

и CH_TxENA это аналог 1<<CONMOB0 ?

Прошу прощения, забыл #define указать.

#define CH_TxENA 0x40

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, действительно, он только Read. Значит эту команду можно игнорировать. Код частично достался в наследство, я не сильно вчитывался )

 

Прошу прощения, забыл #define указать.

#define CH_TxENA 0x40

 

В целом разобрался. остался только такой момент. может сможете подсказать.

 

передаю MOB0 (с индефикатором = 0 то есть наивысший приоритет) 1 байт.

но идет бесконечная передача одного байта.

это что то в настройках?

или нужно отключать передачу?

и чтобы закончить передачу нужно MOB запретить или на прием настроить?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

передаю MOB0 (с индефикатором = 0 то есть наивысший приоритет) 1 байт.

но идет бесконечная передача одного байта.

это что то в настройках?

или нужно отключать передачу?

и чтобы закончить передачу нужно MOB запретить или на прием настроить?

Не уверен в деталях, это лучше написано в документации, но насколько помню, передача автоматически заканчивается с отправкой последнего байта из CANMSG заданного значением в CANCDMOB. Посмотрите, пожалуйста, описание.

Насчёт сценария с бесконечной отправкой подсказать не могу. Возможно вы ставите в тупик контроллер шины который не получает подтверждение о доставке пакета и повторяет посылку?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не уверен в деталях, это лучше написано в документации, но насколько помню, передача автоматически заканчивается с отправкой последнего байта из CANMSG заданного значением в CANCDMOB. Посмотрите, пожалуйста, описание.

Насчёт сценария с бесконечной отправкой подсказать не могу. Возможно вы ставите в тупик контроллер шины который не получает подтверждение о доставке пакета и повторяет посылку?

 

Всем спасибо. буду разбираться)))))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо. буду разбираться)))))

Не за что ) Могу только посоветовать подключить на шину какое-либо из доступных устройств с которым бы можно было вести пакетный обмен по известному формату идентификаторов и команд. Ещё лучше, если существует финансовая возможность приобретения CAN-сниффера, который позволяет мониторить состояние и обмен по шине. Поищите в интернете, есть много вариантов. Будет в разы проще отлаживаться пока нет чёткого понимания ситуации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...