LAS9891 0 30 июня, 2023 Опубликовано 30 июня, 2023 · Жалоба Имеется контроллер от GigaDevice GD32F103R. В контроллере имеется аппаратный модуль CAN. Этот модуль настроил согласно UserManual и успешно использовал это ПО сначала в отладчике, а затем и в целевом устройстве. Всё было замечательно до тех пор, пока не пришлось прошить очередной образец устройства уже отлаженным ПО. В этом конкретном образце устройства обнаружился баг в работе CAN. Баг проявляется, когда устройству необходимо направить в шину помимо ID ещё и байты с данными. В моём проекте устройство отправляет в шину за раз до 8 байт данных. В случае если устройство отправляет от 0 до 6 байт включительно, багов не возникает. В случае если устройство отправляет 7 байт, то последний байт данных представляет случайное значение, хотя при формировании посылки байт имеет определённое значение. В случае если устройство отправляет 8 байт, то уже последние два байта представляют случайные значения. Что было сделано: 1) Естественно, сначала проверил, что я записываю в почтовый ящик для отправки. Оказалось что записываю я всё верно. 2) Проверил работу внешнего преобразователя TTL->CAN на плате и даже заменил его - не помогло. 3) Проверил посылку осциллографом прямо на ноге микроконтроллера: 7й и 8й байт - всегда случайные значения. 4) Проверил ещё раз ПО на отладчике и ещё раз на другом образце целевого устройства - всё работает правильно, никаких случайных значений в 7м и 8м байтах. 5) На косячном образце стёр всю FLASH и заново записал ПО - не помогло. 6) Заменил на косячном образце микроконтроллер на новый, записал ПО, и....... БАГ ПРОПАЛ! Всё стало работать правильно. Что это было? Кто сталкивался? Есть ли какие-то особенности в использовании/настройке CAN, которые могут влиять подобным образом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 30 июня, 2023 Опубликовано 30 июня, 2023 · Жалоба 1 час назад, LAS9891 сказал: Что это было? Скорее всего где-то в программе портите память. Скорее всего - память, используемую "почтовым ящиком". Или связанную с его работой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 30 июня, 2023 Опубликовано 30 июня, 2023 · Жалоба 1 hour ago, jcxz said: Скорее всего - память, используемую "почтовым ящиком" И один и тот же проект будет работать по разному на разных экземплярах микроконтроллера одной и той же модели ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 30 июня, 2023 Опубликовано 30 июня, 2023 · Жалоба 27 минут назад, LAS9891 сказал: И один и тот же проект будет работать по разному на разных экземплярах микроконтроллера одной и той же модели ? Запросто. Так как могут быть разные настройки, работать разные процессы с разными временнЫми характеристиками, а также разное состояние неинициализированных областей памяти. Кроме того: Возможны ошибки в конфигурировании mailbox-ов (может у вас 2 разных mailbox-а есть, сконфигурированные на передачу с одним и тем же ID?). Или например: этот же "почтовый ящик" каким-либо образом оказывается сконфигурированным на приём, а в него успевают прилететь данные, которые и видите потом как мусор. И ещё 100500+ других возможных программных багов. PS: Искать проблему нужно в первую очередь - в своём коде. Да и во 2-ю и в 3-ю ... - тоже. И только в 100-ю - катить бочку на процессор. А вы начали поиск проблемы сразу не у себя... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 30 июня, 2023 Опубликовано 30 июня, 2023 · Жалоба 2 minutes ago, jcxz said: А вы начали поиск проблемы сразу не у себя... Что было сделано: 1) Естественно, сначала проверил, что я записываю в почтовый ящик для отправки. Оказалось что записываю я всё верно. 2) Проверил работу внешнего преобразователя TTL->CAN на плате и даже заменил его - не помогло. 5 minutes ago, jcxz said: Возможны ошибки в конфигурировании mailbox-ов маилбокс всегда один. 6 minutes ago, jcxz said: этот же "почтовый ящик" каким-либо образом оказывается сконфигурированным на приём ящик в проекте настроен всегда на передачу 6 minutes ago, jcxz said: а в него успевают прилететь данные не успевают. я отслеживаю состояние шины, на ней только 2 устройства, которыми я сам управляю 7 minutes ago, jcxz said: И ещё 100500+ других возможных программных багов накиньте ещё вариантов 8 minutes ago, jcxz said: Так как могут быть разные настройки, работать разные процессы с разными временнЫми характеристиками Проект один и тот же во всех контроллерах, контроллеры одинаковые, платы одинаковые! Для каждого экземпляра контроллера и платы делать свой проект? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 30 июня, 2023 Опубликовано 30 июня, 2023 · Жалоба 13 минут назад, LAS9891 сказал: 1) Естественно, сначала проверил, что я записываю в почтовый ящик для отправки. Оказалось что записываю я всё верно. ... накиньте ещё вариантов Я бы проверил не "что записывается", а "что в ящике после завершения отправки". Если конечно этот МК позволяет прочитать ящик после отправки. 13 минут назад, LAS9891 сказал: накиньте ещё вариантов N: Отправка стартует раньше, чем завершена запись всех байт в ящик. ... 13 минут назад, LAS9891 сказал: Проект один и тот же во всех контроллерах, контроллеры одинаковые, платы одинаковые! Для каждого экземпляра контроллера и платы делать свой проект? То, что контроллеры одинаковые и прошивка одна, ещё не обязательно гарантирует, что все процессы работают там с одинаковыми временнЫми характеристиками. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 30 июня, 2023 Опубликовано 30 июня, 2023 · Жалоба Выкладывайте функцию отправки, что ли... У меня, вроде, проблем с CAN в GD32F103 не наблюдалось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 3 июля, 2023 Опубликовано 3 июля, 2023 · Жалоба On 6/30/2023 at 3:24 PM, Arlleex said: Выкладывайте функцию отправки, что ли... Вот, пожалуйста, сама функция: CAN_TxStatus CAN_Driver_TX (canTxMsgBuf_struct *TxBufElement) { uint8_t mailbox_number = CAN_MAILBOX0; // CAN_MAILBOX0 = ((uint8_t)0x00U) /*!< mailbox0 */ if(CAN_TSTAT(CAN0) & CAN_TSTAT_TME0) // If transmit mailbox0 empty. { CAN_TMI(CAN0, mailbox_number) &= CAN_TMI_TEN; // Transmit disable. //---Set transmit mailbox extended identifier---// CAN_TMI(CAN0, mailbox_number) |= (uint32_t)(TMI_EFID(TxBufElement->EFID) | // The frame identifier. CAN_FF_EXTENDED | // CAN frame format. CAN_FT_DATA); // Frame type. CAN_TMP(CAN0, mailbox_number) &= ~CAN_TMP_DLENC; // Clear. CAN_TMP(CAN0, mailbox_number) |= TxBufElement->NumOfData; // Set the data length. //---Set the data---// CAN_TMDATA0(CAN0, mailbox_number) = *(uint32_t*)&(TxBufElement->Data[0]); CAN_TMDATA1(CAN0, mailbox_number) = *(uint32_t*)&(TxBufElement->Data[4]); CAN_TMI(CAN0, mailbox_number) |= CAN_TMI_TEN; // Transmit enable. return CAN_TX_OK; } else { return CAN_TX_BUSY; } } //------------------------------------------------------------------------------// А так я объявляю тип структуры canTxMsgBuf_struct: /** @brief Структура - буфер для хранения кадров, предназначенных для отправки по CAN. */ typedef struct { uint32_t EFID; // Extended format frame identifier. uint8_t NumOfData; // Number of data. uint8_t Data[8]; // Array of data. } canTxMsgBuf_struct; Сразу говорю, баг проявляется даже когда на шине только два устройства, и оба устройства я контролирую. Я отслеживаю, что происходит на шине, и без моего ведома никто ничего в шину не запишет. On 6/30/2023 at 3:24 PM, Arlleex said: У меня, вроде, проблем с CAN в GD32F103 не наблюдалось. У меня в 10 случаях тоже не наблюдалось, а на 11й случилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 3 июля, 2023 Опубликовано 3 июля, 2023 · Жалоба 21 минуту назад, LAS9891 сказал: Вот, пожалуйста, сама функция: CAN_TxStatus CAN_Driver_TX (canTxMsgBuf_struct *TxBufElement) { ... CAN_TMI(CAN0, mailbox_number) &= CAN_TMI_TEN; // Transmit disable. ... } Во-первых, строчка косячная. Во-вторых, несколько бесполезная, ибо Цитата 0 TEN Transmit enable This bit is set by the software when one frame will be transmitted and reset by the hardware when the transmit mailbox is empty. 0: Transmit disable 1: Transmit enable Попробуйте стабильно поймать баг, когда он 100% проявляется. А потом, когда в функцию попадает структура с 7 или 8 байтами данных, берите эти данные не из этой структуры, а, например, заранее заготовленную статическую строчку 1, 2, 3, 4, 5, 6, 7, 8. И DLC тоже не из структуры берите, а руками забивайте ровно 8. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 3 июля, 2023 Опубликовано 3 июля, 2023 · Жалоба 7 minutes ago, Arlleex said: Во-первых, строчка косячная. Заменил на: CAN_TMI(CAN0, mailbox_number) &= (~CAN_TMI_TEN); // Transmit disable. Скомпилил -> перешил -> попробовал -> не помогло. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 3 июля, 2023 Опубликовано 3 июля, 2023 · Жалоба 8 минут назад, Arlleex сказал: Во-вторых, несколько бесполезная, ибо Там 3/4 кода - такие же, бесполезные. Если не больше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 3 июля, 2023 Опубликовано 3 июля, 2023 · Жалоба 9 minutes ago, Arlleex said: Во-вторых, несколько бесполезная, ибо Согласен. Но вот выше утверждают про ошибки в конфигурировании меилбоксов, так что пока оставлю на всякий случай, так чтоб перебдеть. 1 minute ago, jcxz said: Там 3/4 кода - такие же, бесполезные. Допускаю. Предложите свой вариант, удалив всё лишнее, а я проверю в железке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 3 июля, 2023 Опубликовано 3 июля, 2023 · Жалоба Сделайте простейший проект, где поднят только CAN. Отправляйте в бесконечном цикле 7-8 байтные посылки, смотрите анализатором. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 3 июля, 2023 Опубликовано 3 июля, 2023 · Жалоба 14 minutes ago, Arlleex said: Попробуйте стабильно поймать баг, когда он 100% проявляется. Баг в данном экземпляре проявляется стабильно. 15 minutes ago, Arlleex said: А потом, когда в функцию попадает структура с 7 или 8 байтами данных, берите эти данные не из этой структуры, а, например, заранее заготовленную статическую строчку 1, 2, 3, 4, 5, 6, 7, 8. Делал так, стабильно 2 последних байта - рандомные! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 3 июля, 2023 Опубликовано 3 июля, 2023 · Жалоба Тогда я и говорю - простейший проект только с CAN. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться