Перейти к содержанию
    

Баг или фича при работе с CAN в GD32F103R ?

Имеется контроллер от 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, которые могут влиять подобным образом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, LAS9891 сказал:

Что это было?

Скорее всего где-то в программе портите память. Скорее всего - память, используемую "почтовым ящиком". Или связанную с его работой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

Скорее всего - память, используемую "почтовым ящиком"

И один и тот же проект будет работать по разному на разных экземплярах микроконтроллера одной и той же модели ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 минут назад, LAS9891 сказал:

И один и тот же проект будет работать по разному на разных экземплярах микроконтроллера одной и той же модели ?

Запросто. Так как могут быть разные настройки, работать разные процессы с разными временнЫми характеристиками, а также разное состояние неинициализированных областей памяти.

Кроме того: Возможны ошибки в конфигурировании mailbox-ов (может у вас 2 разных mailbox-а есть, сконфигурированные на передачу с одним и тем же ID?). Или например: этот же "почтовый ящик" каким-либо образом оказывается сконфигурированным на приём, а в него успевают прилететь данные, которые и видите потом как мусор.

И ещё 100500+ других возможных программных багов.

 

PS: Искать проблему нужно в первую очередь -  в своём коде. Да и во 2-ю и в 3-ю ... - тоже. И только в 100-ю - катить бочку на процессор. А вы начали поиск проблемы сразу не у себя...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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:

Так как могут быть разные настройки, работать разные процессы с разными временнЫми характеристиками

Проект один и тот же во всех контроллерах, контроллеры одинаковые, платы одинаковые! Для каждого экземпляра контроллера и платы делать свой проект?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, LAS9891 сказал:

1) Естественно, сначала проверил, что я записываю в почтовый ящик для отправки. Оказалось что записываю я всё верно.

...

накиньте ещё вариантов

Я бы проверил не "что записывается", а "что в ящике после завершения отправки". Если конечно этот МК позволяет прочитать ящик после отправки.

13 минут назад, LAS9891 сказал:

накиньте ещё вариантов

N: Отправка стартует раньше, чем завершена запись всех байт в ящик.

...

13 минут назад, LAS9891 сказал:

Проект один и тот же во всех контроллерах, контроллеры одинаковые, платы одинаковые! Для каждого экземпляра контроллера и платы делать свой проект?

То, что контроллеры одинаковые и прошивка одна, ещё не обязательно гарантирует, что все процессы работают там с одинаковыми временнЫми характеристиками.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выкладывайте функцию отправки, что ли...

У меня, вроде, проблем с CAN в GD32F103 не наблюдалось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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й случилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, Arlleex said:

Во-первых, строчка косячная.

Заменил на:

CAN_TMI(CAN0, mailbox_number) &= (~CAN_TMI_TEN); // Transmit disable.

Скомпилил -> перешил -> попробовал -> не помогло.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, Arlleex сказал:

Во-вторых, несколько бесполезная, ибо

Там 3/4 кода - такие же, бесполезные. Если не больше.  :mosking:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, Arlleex said:

Во-вторых, несколько бесполезная, ибо

Согласен. Но вот выше утверждают про ошибки в конфигурировании меилбоксов, так что пока оставлю на всякий случай, так чтоб перебдеть.

1 minute ago, jcxz said:

Там 3/4 кода - такие же, бесполезные.

Допускаю. Предложите свой вариант, удалив всё лишнее, а я проверю в железке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделайте простейший проект, где поднят только CAN. Отправляйте в бесконечном цикле 7-8 байтные посылки, смотрите анализатором.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, Arlleex said:

Попробуйте стабильно поймать баг, когда он 100% проявляется.

Баг в данном экземпляре проявляется стабильно.

15 minutes ago, Arlleex said:

А потом, когда в функцию попадает структура с 7 или 8 байтами данных, берите эти данные не из этой структуры, а, например, заранее заготовленную статическую строчку 1, 2, 3, 4, 5, 6, 7, 8.

Делал так, стабильно 2 последних байта - рандомные!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...