|
CAN...не понятно((((, как начинается передача? |
|
|
|
Nov 26 2012, 10:10
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 9-11-12
Пользователь №: 74 296

|
Простите если глупый вопрос... Но что-то уже пол-дня не разобраться...
В какой момент микроконтроллер (at90can128) начинает передачу данных (Отправляет данные из Moba настроенного на передачу)??? в USART все просто UDR0=0x01 и передача начилась.... А вот в CAN'е не понятно))))
|
|
|
|
|
Nov 26 2012, 17:27
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 9-11-12
Пользователь №: 74 296

|
Цитата(редактор @ Nov 26 2012, 15:09)  Вариантов реализации CAN-контроллера много. Но все они сперва слушают шину, если на ней нет активности, то начинают передавать свои данные. Если в процессе передачи идентификатора пакета проигрывается арбитраж, то контроллер может ждать очередной паузы на шине для повтора сообщения или сообщить приложению о факте проигрыша, Уже зависит от настроек и конкретной реализации. Именнос этой микросхемой не работал. Пользовал SiLabs C8051F040 то есть если на шине сидит энное количество устройств и каждое настроено на прием и передачу. И если приема нет все начинают передавать (учитывая арбитраж) даже когда от них это не нужно?
|
|
|
|
|
Nov 26 2012, 19:25
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(lons83 @ Nov 26 2012, 20:27)  все начинают передавать (учитывая арбитраж) даже когда от них это не нужно? Что значит "не нужно"? "Если кто-то зажигает звезды ..." Вы же сами "звезды зажигаете" = систему проектируете, вы должны заложить такие принципы обмена, чтобы шина была достаточно свободной, приоритеты соблюдались и проч. Начало передачи инициализируется программой, при превышении количества неудачных попыток передачи устанавливается флаг, по которому можно отменить передачу.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Nov 26 2012, 19:46
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 9-11-12
Пользователь №: 74 296

|
Цитата(Dog Pawlowa @ Nov 26 2012, 23:25)  Начало передачи инициализируется программой,. Тогда я так и не получил ответа на свой вопрос: В какой момент микроконтроллер (at90can128) начинает передачу данных (Отправляет данные из Moba настроенного на передачу)??? в USART все просто UDR0=0x01 и передача началась.... редактор написал:Но все они сперва слушают шину, если на ней нет активности, то начинают передавать свои данные. На что я и спросил: И если приема нет все начинают передавать (учитывая арбитраж) даже когда от них это не нужно? Простите, что может я что-то не понимаю. (Хотя я прекрасно понимаю что передачу я должен сам задать), но мне до сих пор не ясно ПОСЛЕ КАКОЙ КОМАНДЫ (после всех настроек) непосредственно начинается передача)))))... то есть: это после того как настроил MOB на передачу и после этого включил CAN.... или как по аналогии с USART -> в регистр данных записал инфу -> CANMSG(или как там его) -> и пошла передача??? P.S. можно привести в пример другие микроконтроллеры если с данным, не довелось поработать.
Сообщение отредактировал lons83 - Nov 26 2012, 19:47
|
|
|
|
|
Nov 27 2012, 04:22
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Само по себе заполнение данными не вызывает передачу, специальный битик должен быть для установки передачи. Например в популярном внешнем контроллере 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 ); }
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Nov 27 2012, 04:53
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 9-11-12
Пользователь №: 74 296

|
Цитата(Dog Pawlowa @ Nov 27 2012, 07:22)  Само по себе заполнение данными не вызывает передачу, специальный битик должен быть для установки передачи. Например в популярном внешнем контроллере 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 ); } спасибо)
|
|
|
|
|
Nov 27 2012, 08:20
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 24-11-07
Пользователь №: 32 633

|
Это код как раз для AT90CAN128 на передачу данных в настроенный канал(в данном случае первый). Вас непосредственно интересуют две последние строчки. CODE 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 */
--------------------
Если друг оказался вдруг и не друг и не враг, а - JTAG.
|
|
|
|
|
Nov 27 2012, 08:21
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 9-11-12
Пользователь №: 74 296

|
Цитата(PheeL @ Nov 27 2012, 11:20)  Это код как раз для AT90CAN128 на передачу данных в настроенный канал(в данном случае первый). Вас непосредственно интересуют две последние строчки. CODE CANEN2 |= (1 << 1); /* channel 1 enable */ CANCDMOB |= CH_TxENA; /* emission enabled */
Спасибо большое))) а в регистр CANEN2 разве можно записывать? у меня в документации сказано что только Read. и CH_TxENA это аналог 1<<CONMOB0 ?
Сообщение отредактировал lons83 - Nov 27 2012, 08:25
|
|
|
|
|
Nov 27 2012, 08:38
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 24-11-07
Пользователь №: 32 633

|
Цитата(lons83 @ Nov 27 2012, 12:21)  Спасибо большое))) а в регистр CANEN2 разве можно записывать? у меня в документации сказано что только Read. Да, действительно, он только Read. Значит эту команду можно игнорировать. Код частично достался в наследство, я не сильно вчитывался ) Цитата(lons83 @ Nov 27 2012, 12:21)  и CH_TxENA это аналог 1<<CONMOB0 ? Прошу прощения, забыл #define указать. #define CH_TxENA 0x40
--------------------
Если друг оказался вдруг и не друг и не враг, а - JTAG.
|
|
|
|
|
Nov 27 2012, 09:13
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 9-11-12
Пользователь №: 74 296

|
Цитата(PheeL @ Nov 27 2012, 11:38)  Да, действительно, он только Read. Значит эту команду можно игнорировать. Код частично достался в наследство, я не сильно вчитывался )
Прошу прощения, забыл #define указать. #define CH_TxENA 0x40 В целом разобрался. остался только такой момент. может сможете подсказать. передаю MOB0 (с индефикатором = 0 то есть наивысший приоритет) 1 байт. но идет бесконечная передача одного байта. это что то в настройках? или нужно отключать передачу? и чтобы закончить передачу нужно MOB запретить или на прием настроить?
|
|
|
|
|
Nov 27 2012, 09:37
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 24-11-07
Пользователь №: 32 633

|
Цитата(lons83 @ Nov 27 2012, 13:13)  передаю MOB0 (с индефикатором = 0 то есть наивысший приоритет) 1 байт. но идет бесконечная передача одного байта. это что то в настройках? или нужно отключать передачу? и чтобы закончить передачу нужно MOB запретить или на прием настроить? Не уверен в деталях, это лучше написано в документации, но насколько помню, передача автоматически заканчивается с отправкой последнего байта из CANMSG заданного значением в CANCDMOB. Посмотрите, пожалуйста, описание. Насчёт сценария с бесконечной отправкой подсказать не могу. Возможно вы ставите в тупик контроллер шины который не получает подтверждение о доставке пакета и повторяет посылку?
--------------------
Если друг оказался вдруг и не друг и не враг, а - JTAG.
|
|
|
|
|
Nov 27 2012, 09:48
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 9-11-12
Пользователь №: 74 296

|
Цитата(PheeL @ Nov 27 2012, 12:37)  Не уверен в деталях, это лучше написано в документации, но насколько помню, передача автоматически заканчивается с отправкой последнего байта из CANMSG заданного значением в CANCDMOB. Посмотрите, пожалуйста, описание. Насчёт сценария с бесконечной отправкой подсказать не могу. Возможно вы ставите в тупик контроллер шины который не получает подтверждение о доставке пакета и повторяет посылку? Всем спасибо. буду разбираться)))))
|
|
|
|
|
Nov 27 2012, 10:25
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 24-11-07
Пользователь №: 32 633

|
Цитата(lons83 @ Nov 27 2012, 13:48)  Всем спасибо. буду разбираться))))) Не за что ) Могу только посоветовать подключить на шину какое-либо из доступных устройств с которым бы можно было вести пакетный обмен по известному формату идентификаторов и команд. Ещё лучше, если существует финансовая возможность приобретения CAN-сниффера, который позволяет мониторить состояние и обмен по шине. Поищите в интернете, есть много вариантов. Будет в разы проще отлаживаться пока нет чёткого понимания ситуации.
--------------------
Если друг оказался вдруг и не друг и не враг, а - JTAG.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|