реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> CAN...не понятно((((, как начинается передача?
lons83
сообщение Nov 26 2012, 10:10
Сообщение #1


Участник
*

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



Простите если глупый вопрос...
Но что-то уже пол-дня не разобраться...

В какой момент микроконтроллер (at90can128) начинает передачу данных (Отправляет данные из Moba настроенного на передачу)???
в USART все просто UDR0=0x01 и передача начилась....
А вот в CAN'е не понятно))))
Go to the top of the page
 
+Quote Post
редактор
сообщение Nov 26 2012, 12:09
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



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



--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 26 2012, 12:31
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



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

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
lons83
сообщение Nov 26 2012, 17:27
Сообщение #4


Участник
*

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



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


то есть если на шине сидит энное количество устройств и каждое настроено на прием и передачу.
И если приема нет все начинают передавать (учитывая арбитраж) даже когда от них это не нужно?
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 26 2012, 19:25
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



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

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
lons83
сообщение Nov 26 2012, 19:46
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 27 2012, 04:22
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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 );
}


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
lons83
сообщение Nov 27 2012, 04:53
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 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 );
}


спасибо)
Go to the top of the page
 
+Quote Post
PheeL
сообщение Nov 27 2012, 08:20
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
lons83
сообщение Nov 27 2012, 08:21
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
PheeL
сообщение Nov 27 2012, 08:38
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
lons83
сообщение Nov 27 2012, 09:13
Сообщение #12


Участник
*

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



Цитата(PheeL @ Nov 27 2012, 11:38) *
Да, действительно, он только Read. Значит эту команду можно игнорировать. Код частично достался в наследство, я не сильно вчитывался )

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


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

передаю MOB0 (с индефикатором = 0 то есть наивысший приоритет) 1 байт.
но идет бесконечная передача одного байта.
это что то в настройках?
или нужно отключать передачу?
и чтобы закончить передачу нужно MOB запретить или на прием настроить?
Go to the top of the page
 
+Quote Post
PheeL
сообщение Nov 27 2012, 09:37
Сообщение #13


Участник
*

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



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

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


--------------------
Если друг оказался вдруг и не друг и не враг, а - JTAG.
Go to the top of the page
 
+Quote Post
lons83
сообщение Nov 27 2012, 09:48
Сообщение #14


Участник
*

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



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


Всем спасибо. буду разбираться)))))
Go to the top of the page
 
+Quote Post
PheeL
сообщение Nov 27 2012, 10:25
Сообщение #15


Участник
*

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



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

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


--------------------
Если друг оказался вдруг и не друг и не враг, а - JTAG.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 19:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.0206 секунд с 7
ELECTRONIX ©2004-2016