lons83 0 26 ноября, 2012 Опубликовано 26 ноября, 2012 · Жалоба Простите если глупый вопрос... Но что-то уже пол-дня не разобраться... В какой момент микроконтроллер (at90can128) начинает передачу данных (Отправляет данные из Moba настроенного на передачу)??? в USART все просто UDR0=0x01 и передача начилась.... А вот в CAN'е не понятно)))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 26 ноября, 2012 Опубликовано 26 ноября, 2012 · Жалоба Вариантов реализации CAN-контроллера много. Но все они сперва слушают шину, если на ней нет активности, то начинают передавать свои данные. Если в процессе передачи идентификатора пакета проигрывается арбитраж, то контроллер может ждать очередной паузы на шине для повтора сообщения или сообщить приложению о факте проигрыша, Уже зависит от настроек и конкретной реализации. Именнос этой микросхемой не работал. Пользовал SiLabs C8051F040 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 26 ноября, 2012 Опубликовано 26 ноября, 2012 · Жалоба А вот в CAN'е не понятно)))) Еще нужно отметить, что приемник выдает ACK как в I2C, т.е. передатчик никогда не завершит передачу успешно без приемника на линии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lons83 0 26 ноября, 2012 Опубликовано 26 ноября, 2012 · Жалоба Вариантов реализации CAN-контроллера много. Но все они сперва слушают шину, если на ней нет активности, то начинают передавать свои данные. Если в процессе передачи идентификатора пакета проигрывается арбитраж, то контроллер может ждать очередной паузы на шине для повтора сообщения или сообщить приложению о факте проигрыша, Уже зависит от настроек и конкретной реализации. Именнос этой микросхемой не работал. Пользовал SiLabs C8051F040 то есть если на шине сидит энное количество устройств и каждое настроено на прием и передачу. И если приема нет все начинают передавать (учитывая арбитраж) даже когда от них это не нужно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 26 ноября, 2012 Опубликовано 26 ноября, 2012 · Жалоба все начинают передавать (учитывая арбитраж) даже когда от них это не нужно? Что значит "не нужно"? "Если кто-то зажигает звезды ..." Вы же сами "звезды зажигаете" = систему проектируете, вы должны заложить такие принципы обмена, чтобы шина была достаточно свободной, приоритеты соблюдались и проч. Начало передачи инициализируется программой, при превышении количества неудачных попыток передачи устанавливается флаг, по которому можно отменить передачу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lons83 0 26 ноября, 2012 Опубликовано 26 ноября, 2012 (изменено) · Жалоба Начало передачи инициализируется программой,. Тогда я так и не получил ответа на свой вопрос: В какой момент микроконтроллер (at90can128) начинает передачу данных (Отправляет данные из Moba настроенного на передачу)??? в USART все просто UDR0=0x01 и передача началась.... редактор написал:Но все они сперва слушают шину, если на ней нет активности, то начинают передавать свои данные. На что я и спросил: И если приема нет все начинают передавать (учитывая арбитраж) даже когда от них это не нужно? Простите, что может я что-то не понимаю. (Хотя я прекрасно понимаю что передачу я должен сам задать), но мне до сих пор не ясно ПОСЛЕ КАКОЙ КОМАНДЫ (после всех настроек) непосредственно начинается передача)))))... то есть: это после того как настроил MOB на передачу и после этого включил CAN.... или как по аналогии с USART -> в регистр данных записал инфу -> CANMSG(или как там его) -> и пошла передача??? P.S. можно привести в пример другие микроконтроллеры если с данным, не довелось поработать. Изменено 26 ноября, 2012 пользователем lons83 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 27 ноября, 2012 Опубликовано 27 ноября, 2012 · Жалоба Само по себе заполнение данными не вызывает передачу, специальный битик должен быть для установки передачи. Например в популярном внешнем контроллере 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 ); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lons83 0 27 ноября, 2012 Опубликовано 27 ноября, 2012 · Жалоба Само по себе заполнение данными не вызывает передачу, специальный битик должен быть для установки передачи. Например в популярном внешнем контроллере 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 ); } спасибо) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PheeL 0 27 ноября, 2012 Опубликовано 27 ноября, 2012 · Жалоба Это код как раз для 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 */ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lons83 0 27 ноября, 2012 Опубликовано 27 ноября, 2012 (изменено) · Жалоба Это код как раз для AT90CAN128 на передачу данных в настроенный канал(в данном случае первый). Вас непосредственно интересуют две последние строчки. CANEN2 |= (1 << 1); /* channel 1 enable */ CANCDMOB |= CH_TxENA; /* emission enabled */ Спасибо большое))) а в регистр CANEN2 разве можно записывать? у меня в документации сказано что только Read. и CH_TxENA это аналог 1<<CONMOB0 ? Изменено 27 ноября, 2012 пользователем lons83 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PheeL 0 27 ноября, 2012 Опубликовано 27 ноября, 2012 · Жалоба Спасибо большое))) а в регистр CANEN2 разве можно записывать? у меня в документации сказано что только Read. Да, действительно, он только Read. Значит эту команду можно игнорировать. Код частично достался в наследство, я не сильно вчитывался ) и CH_TxENA это аналог 1<<CONMOB0 ? Прошу прощения, забыл #define указать. #define CH_TxENA 0x40 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lons83 0 27 ноября, 2012 Опубликовано 27 ноября, 2012 · Жалоба Да, действительно, он только Read. Значит эту команду можно игнорировать. Код частично достался в наследство, я не сильно вчитывался ) Прошу прощения, забыл #define указать. #define CH_TxENA 0x40 В целом разобрался. остался только такой момент. может сможете подсказать. передаю MOB0 (с индефикатором = 0 то есть наивысший приоритет) 1 байт. но идет бесконечная передача одного байта. это что то в настройках? или нужно отключать передачу? и чтобы закончить передачу нужно MOB запретить или на прием настроить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PheeL 0 27 ноября, 2012 Опубликовано 27 ноября, 2012 · Жалоба передаю MOB0 (с индефикатором = 0 то есть наивысший приоритет) 1 байт. но идет бесконечная передача одного байта. это что то в настройках? или нужно отключать передачу? и чтобы закончить передачу нужно MOB запретить или на прием настроить? Не уверен в деталях, это лучше написано в документации, но насколько помню, передача автоматически заканчивается с отправкой последнего байта из CANMSG заданного значением в CANCDMOB. Посмотрите, пожалуйста, описание. Насчёт сценария с бесконечной отправкой подсказать не могу. Возможно вы ставите в тупик контроллер шины который не получает подтверждение о доставке пакета и повторяет посылку? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lons83 0 27 ноября, 2012 Опубликовано 27 ноября, 2012 · Жалоба Не уверен в деталях, это лучше написано в документации, но насколько помню, передача автоматически заканчивается с отправкой последнего байта из CANMSG заданного значением в CANCDMOB. Посмотрите, пожалуйста, описание. Насчёт сценария с бесконечной отправкой подсказать не могу. Возможно вы ставите в тупик контроллер шины который не получает подтверждение о доставке пакета и повторяет посылку? Всем спасибо. буду разбираться))))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PheeL 0 27 ноября, 2012 Опубликовано 27 ноября, 2012 · Жалоба Всем спасибо. буду разбираться))))) Не за что ) Могу только посоветовать подключить на шину какое-либо из доступных устройств с которым бы можно было вести пакетный обмен по известному формату идентификаторов и команд. Ещё лучше, если существует финансовая возможность приобретения CAN-сниффера, который позволяет мониторить состояние и обмен по шине. Поищите в интернете, есть много вариантов. Будет в разы проще отлаживаться пока нет чёткого понимания ситуации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться