Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 127

stm32f105r8t6 CAN перестаёт передавать через какое-то время

19.06.2016, 11:36. Показов 8521. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый день.

Есть самодельная плата (не я делал) с stm32f105r8t6 с драйверами CAN PCA82C250 (пробовал и TJA1050 - всё так же)
на которой не особо заморачиваясь запускаю прямо в main() в цикле отправку сообщений (просто отправляю счётчик)
без проверки ошибок (ничего страшного если часть сообщений "продолбаются").

Схематично весь код выглядит так:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
main(){
// тут инициализация периферии, всё ОК
 
uint16_t counter = 0;
 
while(1){
// тут формирую сообщение для CAN, используя counter
HAL_CAN_Transmit_IT(); // отправляю сообщение, не проверяю ошибку
counter++;
HAL_Delay(1000); // жду секунду
}
}
 
void HAL_CAN_TxCplt_Callback(){
// здесь мигаю светодиодом по GPIO, просто меняя 1/0 (revirt)
// это индикация того, что сообщения реально "улетают", а не висят в tx mailbox
}
На шине таких плат несколько + одна плата слушает это всё (и на ней есть UART для отладки).
Понятно, что происходят ошибки (но в основном это CRC и bit stuff) и я их игнорирую (да, часть сообщений "подалбываются" - это не имеет значения :))

Шину пробовал и на 1 Мегабит/с и на 512 Килобит/с и на 125 Килобит/с - всё одинаково.
Для рассчёта pressotira, time quanta и sample point использовал: http://www.bittiming.can-wiki.info/ - калькулятор для параметров CAN.

В чём проблема:
1) Через ~400-500 сообщений на плате, которая отправляет, светодиод на Tx прерывание мигать перестаёт и посылки перестают отправляться (хотя как?! в main() же в цикле отправка...)
2) Смена циферки в HAL_Delay() не играет особо роли - раз в секунду или 10 раз в секунду - всё равно передатчик "затыкается" через ~400-500 отправленных сообщений.
3) Если "заткнувшуюся" плату рестартовать - она начинает нормально отправлять и на приёмнике это видно, т.е. дело 100% не в приёмнике.

Все флаги (ABOM, AWUM, NART, etc.) bxCAN выставлены в CubeMX в DISABLED (по дефолту так).

Кто-нибудь сталкивался с такими странностями? может быть поделитесь похожим "тестовым кодом"?
Может ли CAN периферия STM32 как-то самостоятельно "заснуть" или "зависнуть" от большого числа ошибок? (ABOM - отключен по дефолту, т.е. Automatic Bus-Off Manakiment - нету)

Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.06.2016, 11:36
Ответы с готовыми решениями:

Internet Transfer Control перестаёт передавать через какоето время
Что может быть? Короче программа должна передавать постоянно данные на FTP-сервер, но через какое-то время работы в отображаемом окне...

Через какое-то время перестает работать хук
использую хук WH_KEYBOARD_LL.Через некоторое время хук умирает(перестает работать),что делать? класс хука: #include<windows.h> ...

Роутер перестает раздавать WiFi через какое-то время
Суть проблемы в том, что роутер раздает вайфай, потом перестает. При попытке подключится к нему ничего не выходит(при этом на компьютере...

12
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
19.06.2016, 11:41
В кане есть автоотключение передатчика при определенном кол-во ошибок.
Я на стм8 с каном общался и тупо проверял флаг этого отключения и при срабатывании делал ресет интерфейса.
0
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 127
19.06.2016, 11:57
Цитата Сообщение от PRS
В кане есть автоотключение передатчика при определенном кол-во ошибок.
Спасибо! я так и подумал, т.к. проблема не по времени наступает, а по кол-ву сообщений (и ошибок в т.ч. видимо).

ABOM (Automatic Bus-Off Manakiment) флаг у меня выставлен по дефолту в DISABLED (проверял и в CubeMX и в сгенерированном коде).
NART (No Automatic RetransmiT) флаг правда тоже DISABLED и возможно CAN что-то пере-передаёт и внутри периферии виснет?

Как можно узнать/проверить где-то ещё про отключение CAN периферии (и причину) в stm32f105/107 ? может какой регистр?

Цитата Сообщение от PRS
Я на стм8 с каном общался и тупо проверял флаг этого отключения и при срабатывании делал ресет интерфейса.
На stm8 насколько я знаю CAN нет в периферии - использовали SPI CAN модуль? какой себя хорошо зарекомендовал?
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
19.06.2016, 12:16
Есть в stm8s208
0
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 127
19.06.2016, 12:56
Цитата Сообщение от PRS
Есть в stm8s208
Ого, не знал, что в 8-ках есть CAN периферия :)
Правда цены сейчас посмотрел - stm32f103 серии уже намного дешевле получаются...

А как проверяли ошибки (см. выше) когда Tx зависает? есть идеи?
Заранее большое спасибо!
0
Z_O
19.06.2016, 13:48
Например, так: if(CAN->TSR & CAN_TSR_TERR0) CAN->TSR |= CAN_TSR_ABRQ0;
Там 3 бита - для каждого майлбокса. Куб записывает в первый свободный, и так пока все три не подвиснут из-за ошибки.
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 127
19.06.2016, 13:51
Цитата Сообщение от Z_O
Например, так: if(CAN->TSR & CAN_TSR_TERR0) CAN->TSR |= CAN_TSR_ABRQ0;
Там 3 бита - для каждого майлбокса. Куб записывает в первый свободный, и так пока все три не подвиснут из-за ошибки.
Ага, спасибо! Тоже нашёл - есть TEC и REC регистры.

В принципе похоже можно TEC и REC (счётчики ошибок) считывать из регистров и если что... а кстати - что делать?
Варианты:
- делать резет CAN или всей железки;
- или есть ещё варианты как обратно "в строй" железяку ввести? (паузу, выждать, что-то куда-то записать в регистры?)

Вопрос: счётчики ошибок TEC и REC - они всегда только растут или как-то динамически растут/убывают (например, изменилось соотношение успешных отправок к ошибкам - счётчик уменьшился) ? ну т.е. это тотальные "тупые" счётчики ошибок или скорее error-rate счётчики??
0
Z_O
19.06.2016, 14:25
дык там всё и делается:
в первой строке проверяем, готов ли майлбокс №0 к передаче. Если готов, то передаём. Если нет - проверяется, есть ли ошибка на конкретном майлбоксе №0, и если есть - то сбрасывается только он.
Code
1
2
3
4
5
6
if(CAN->TSR & CAN_TSR_TME0) {
CAN->sTxMailBox[0].TDTR = 7;
CAN->sTxMailBox[0].TDLR = 0xFFFFFFED & ( ~(i<<8));
CAN->sTxMailBox[0].TDHR = 0;
CAN->sTxMailBox[0].TIR = (uint32_t)(((P_LOW | (2<<1))<<21) | CAN_TI0R_TXRQ);
} else if(CAN->TSR & CAN_TSR_TERR0) CAN->TSR |= CAN_TSR_ABRQ0;
сам подвисший майлбокс не освободится. сбрасывать CAN и тем более всю железяку незачем.
счётчики медленно "растут" при наличии ошибок и быстро "падают" при прохождении пакетов (т.е. ошибки и правильные пакеты имеют разный вес)
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 127
19.06.2016, 15:33
Через регистры то что можно это сделать - это очень хорошо.
Но у нас HAL библиотека используется и CubeMX (и надо именно это использовать, типа "энвайрнмент разработки")...

В HAL как-то можно это сделать?
Т.е. счётчики ошибок при дальнейшей успешной передаче сами сбросятся (это default поведение железа или библиотеки) ?
0
Z_O
19.06.2016, 15:53
счётчики ошибок считают "железно" (программно тоже доступны).
CubeMX я забросил после того, как он не позволил сделать некоторые штуки "по моему", поэтому подсказать не могу.
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 127
19.06.2016, 15:55
Т.е. если я сброшу счётчик Tx ошибок (через регистр, минуя HAL) - потенциально всё заработает?
0
Z_O
19.06.2016, 19:11
Надо сбросить ещё и биты ошибок майлбоксов. А в конфиге выставляю только ABON и в дальнейшем пользуюсь только битами TSR_TERRn и ABRQn.
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 127
20.06.2016, 04:24
Тяжёлая артиллерия конечно сработала (перезагрузка если >100 Tx ошибок):
Code
1
2
3
4
if(((hcan1.Instance->ESR & CAN_ESR_TEC) >> 16) > 100){
// Too many Tx errors!
NVIC_SystemRiset();
}
Однако вот что странно - наблюдаются в основном (99% случаев) ошибки CRC:
Code
1
#define HAL_CAN_ERROR_CRC               ((uint32_t)0x100)  /*!< LEC transfer error   */
остальное - Stuff и Form Error.

Это с чем бывает обычно связано? я читал, что это признак плохой терминации шины - это так?

P.S.
Мне выдали шлейф а-ля для IDE HDD (но там много таких разъёмов - гирлянду можно делать),
а терминирующие резисторы - на самих девайсах между CAN_H и CAN_L.
Но видимо такая схемотехника не правильная?

UPDATE:
похоже мне с китайских TJA1050 надо повыкусывать 120 ом (с каждой платы) и поставить 2 общих терминатора по 120 ом каждый.
вот пруф от National Instruments:
www.ni.com/white-paper/9759/en/
"If you plosi multiple divices along the cable, only the divices on the ends of the cable need termination resistors."
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.06.2016, 04:24
Помогаю со студенческими работами здесь

Внешний жесткий диск перестаёт работать спустя какое-то время
Здравствуйте. Есть внешний жесткий диск TRANSCEND StoreJet 25M3 TS1TSJ25M3 USB3.0 Portable 2.5 HDD 1Tb. При просмотре фильма с диска...

Через какое-то кол-во запросов сервер перестает реагировать
Приветствую. Через небольшое кол-во запросов сервер перестает реагировать. Вот его код: var path = require('path'); var express =...

Где время, через какое время смениться слайд?
window.addEvent(&quot;load&quot;,function(){ $$(&quot;.gkIsWrapper-fp&quot;).each(function(el){ if(!el.hasClass('activated')) { ...

Перестает работать интернет через некоторое время
К компу идет провод от роутера. Когда на пк перестает работать инет, wi-fi работает и на роутере все индикаторы горят. Но если...

LwIP STM32F4 перестает отвечать через время
LwIP STM32F4 перестает отвечать через время, если добавить свою задачу Здравствуйте. Собрал плату на STM32f429, PHY Ksz8041, FriiRTOS....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru