Это вообще не обрабатывается программным обеспечением, а встроенным оборудованием CAN-контроллера. Вы не сможете добавлять такие вещи, как заполнение или ошибки CRC, только с помощью программного обеспечения, хотя это может быть достигнуто различными аппаратными приемами.
Один простой способ генерировать множество ошибок - это иметь только один узел на шине или короткое замыкание CAN High / Low. Если вы сделаете это, вы быстро перейдете к активной ошибке, а затем к пассивной ошибке.
Более тонкий путь - перевести линии Tx / Rx между MCU и трансивером на неправильный уровень. Если вы подключите один из них к внешнему выводу GPIO, а затем выберете импульс непосредственно после сохранения сообщения в буфере CAN, это вызовет ошибки. Особенно если длиннее 6 битов = ошибка материала. Скорее всего, они будут хорошо синхронизированы с протоколом, так что это, вероятно, то, что вы хотите. Возможно, вам придется добавить 10k последовательно к фактическим выводам tx / rx, чтобы они стали слабее, чем GPIO.
Другой метод состоит в том, чтобы 2 узла одновременно отправляли идентичные арбитражные поля (ID, RTR + разное), но разные данные. Это достижимо только с помощью программного обеспечения, но это означает, что вам нужно, чтобы 2 тупых узла ничего не делали, а отправляли одни и те же сообщения снова и снова при 100% загрузке шины.