Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: CAN...не понятно((((
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
lons83
Простите если глупый вопрос...
Но что-то уже пол-дня не разобраться...

В какой момент микроконтроллер (at90can128) начинает передачу данных (Отправляет данные из Moba настроенного на передачу)???
в USART все просто UDR0=0x01 и передача начилась....
А вот в CAN'е не понятно))))
редактор
Вариантов реализации CAN-контроллера много. Но все они сперва слушают шину, если на ней нет активности, то начинают передавать свои данные. Если в процессе передачи идентификатора пакета проигрывается арбитраж, то контроллер может ждать очередной паузы на шине для повтора сообщения или сообщить приложению о факте проигрыша, Уже зависит от настроек и конкретной реализации.
Именнос этой микросхемой не работал. Пользовал SiLabs C8051F040

Dog Pawlowa
Цитата(lons83 @ Nov 26 2012, 13:10) *
А вот в CAN'е не понятно))))

Еще нужно отметить, что приемник выдает ACK как в I2C, т.е. передатчик никогда не завершит передачу успешно без приемника на линии.
lons83
Цитата(редактор @ Nov 26 2012, 15:09) *
Вариантов реализации CAN-контроллера много. Но все они сперва слушают шину, если на ней нет активности, то начинают передавать свои данные. Если в процессе передачи идентификатора пакета проигрывается арбитраж, то контроллер может ждать очередной паузы на шине для повтора сообщения или сообщить приложению о факте проигрыша, Уже зависит от настроек и конкретной реализации.
Именнос этой микросхемой не работал. Пользовал SiLabs C8051F040


то есть если на шине сидит энное количество устройств и каждое настроено на прием и передачу.
И если приема нет все начинают передавать (учитывая арбитраж) даже когда от них это не нужно?
Dog Pawlowa
Цитата(lons83 @ Nov 26 2012, 20:27) *
все начинают передавать (учитывая арбитраж) даже когда от них это не нужно?

Что значит "не нужно"? "Если кто-то зажигает звезды ..."
Вы же сами "звезды зажигаете" = систему проектируете, вы должны заложить такие принципы обмена, чтобы шина была достаточно свободной, приоритеты соблюдались и проч.
Начало передачи инициализируется программой, при превышении количества неудачных попыток передачи устанавливается флаг, по которому можно отменить передачу.
lons83

Цитата(Dog Pawlowa @ Nov 26 2012, 23:25) *
Начало передачи инициализируется программой,.


Тогда я так и не получил ответа на свой вопрос:
В какой момент микроконтроллер (at90can128) начинает передачу данных (Отправляет данные из Moba настроенного на передачу)???
в USART все просто UDR0=0x01 и передача началась....


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

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


Простите, что может я что-то не понимаю. (Хотя я прекрасно понимаю что передачу я должен сам задать), но мне до
сих пор не ясно ПОСЛЕ КАКОЙ КОМАНДЫ (после всех настроек) непосредственно начинается передача)))))...
то есть: это после того как настроил MOB на передачу и после этого включил CAN.... или как по аналогии с USART -> в регистр данных записал инфу -> CANMSG(или как там его) -> и пошла передача???

P.S. можно привести в пример другие микроконтроллеры если с данным, не довелось поработать.
Dog Pawlowa
Само по себе заполнение данными не вызывает передачу, специальный битик должен быть для установки передачи.
Например в популярном внешнем контроллере 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
Цитата(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 );
}


спасибо)
PheeL
Это код как раз для 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 */
lons83
Цитата(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 ?
PheeL
Цитата(lons83 @ Nov 27 2012, 12:21) *
Спасибо большое)))
а в регистр CANEN2 разве можно записывать? у меня в документации сказано что только Read.

Да, действительно, он только Read. Значит эту команду можно игнорировать. Код частично достался в наследство, я не сильно вчитывался )
Цитата(lons83 @ Nov 27 2012, 12:21) *
и CH_TxENA это аналог 1<<CONMOB0 ?

Прошу прощения, забыл #define указать.
#define CH_TxENA 0x40
lons83
Цитата(PheeL @ Nov 27 2012, 11:38) *
Да, действительно, он только Read. Значит эту команду можно игнорировать. Код частично достался в наследство, я не сильно вчитывался )

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


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

передаю MOB0 (с индефикатором = 0 то есть наивысший приоритет) 1 байт.
но идет бесконечная передача одного байта.
это что то в настройках?
или нужно отключать передачу?
и чтобы закончить передачу нужно MOB запретить или на прием настроить?
PheeL
Цитата(lons83 @ Nov 27 2012, 13:13) *
передаю MOB0 (с индефикатором = 0 то есть наивысший приоритет) 1 байт.
но идет бесконечная передача одного байта.
это что то в настройках?
или нужно отключать передачу?
и чтобы закончить передачу нужно MOB запретить или на прием настроить?

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


Всем спасибо. буду разбираться)))))
PheeL
Цитата(lons83 @ Nov 27 2012, 13:48) *
Всем спасибо. буду разбираться)))))

Не за что ) Могу только посоветовать подключить на шину какое-либо из доступных устройств с которым бы можно было вести пакетный обмен по известному формату идентификаторов и команд. Ещё лучше, если существует финансовая возможность приобретения CAN-сниффера, который позволяет мониторить состояние и обмен по шине. Поищите в интернете, есть много вариантов. Будет в разы проще отлаживаться пока нет чёткого понимания ситуации.
редактор
С вероятностью 99% что у вас на шине CAN нет другого устройства. Поэтому, как правильно заметил Pheel, контроллер передает сообщение до получения подтверждения. Скорее всего в слове статуса у вас стоит соответствующий флаг. Эта ошибка (отсутствие подтверждения) должна определяться CAN-контроллером.
После подключения второго CAN-устройства (не забудте про терминаторы), сообщение должно отправляться 1 раз.
lons83
C передачей вроде разобрался.
Но беспокоит момент с прерываниями:

Код
ISR(CANIT_vect)
{

PORTC|=(1<<PC4);  // зажигаю лампочку
    
}



настройка прерываний

Код
    CANGIT=0x00;
    
    CANGIE=0xFE;
    
    CANIE1=0xFF;
    CANIE2=0xFF;
    
sei();



--------------------------------------------

так вот... в функцию ISR - попадаю не всегда... через раз или через два а может и реже.

1.что может быть не так?

2. в библиотеке atmel пишет.
Код
#define CANIT_vect_num        18
#define CANIT_vect            _VECTOR(18)
#define SIG_CAN_INTERRUPT1        _VECTOR(18)


для чего тогда остальные варианты когда я подставляю CANIT_vect ??

3. в даташите вектор прерывания по шине у at90can128 -- имеет номер 19
здесь же -- 18 ..??? не понятно(((

заранее спасибо)))
Vlad1977
Подскажите плииз, кто с CAN-ом разбирался, 2ой декнь туплю сижу sad.gif. Для начала хочется увидеть передачу на шине, те на ножке TXCAN свою посылку. Частота настроена, начинаю передавать. Вижу импульсы на TX и каким то боком на RX, это разве нормально? Меняю значения адреса в посылке CANIDT2 и CANIDT1 ничего схожего почему то на осцилографе не вижу? Подключать второй контроллер пока с передачей первого не рахзобрался как то особо не хочется. В прерывание попадаю с флагами CANSTMOB (BERR и SERR), после несокльких неудачных передач, я так понимаю потому что АСК не получена, шина входит в BOFF, это так и должно быть? Пробовал подключить второй контроллер ничгео не именилось, те передача не проходит, АСК не возвращается (
Vlad1977
Разобрался с соединением опторазвязка сделана, поставил резистор 120Ом и заработала, хотя фронты все равно завалины идут. Скорость стоит на 8Мгц 500Kbps.
Vlad1977
Может у кого естьобработчик ошибок от CAN, в интернете много всякой информации, но как конкретно надо обрабаотывать ошибки представление как то не сложилось sad.gif
Vlad1977
Люди есь кто живой? Что может быть такое, на подтверждение отправки приходит TXOK, на приемной стороне тоже все получается, только почему то при чтении регистра CANMSG, там одни нули записаны sad.gif.
=GM=
Цитата(PheeL @ Nov 27 2012, 09:25) *
Ещё лучше, если существует финансовая возможность приобретения CAN-сниффера, который позволяет мониторить состояние и обмен по шине. Поищите в интернете, есть много вариантов.

Не надо сниффера. В AT90CAN32 есть возможность аппаратно подключить внутренний передатчик на внутренний приёмник, только почтовые ящики правильно настроить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.