Связь по CAN не работает

Я сделал следующую схему. STM32 — это STM32F103C8T6 (Blue Pills). Я пропустил очевидные провода:

  • Все четыре компонента заземлены вместе
  • Подается 5В на RX TJA 1050 от RX STM32
  • Подается 5В на TX TJA 1050 от TX STM32

схематический

смоделируйте эту схему - схема, созданная с помощью CircuitLab

TJA это:

введите описание изображения здесь

Самое важное программное обеспечение, работающее на TX STM32:

/* CAN init function */
static void MX_CAN_Init(void)
{

  static CanRxMsgTypeDef CanRX;
  static CanTxMsgTypeDef CanTX;
  CAN_FilterConfTypeDef sFilterConfig;

  hcan.Instance = CAN1;

  hcan.pRxMsg = &CanRX;
  hcan.pTxMsg = &CanTX;

  hcan.Init.Prescaler = 8;
  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.SJW = CAN_SJW_1TQ;
  hcan.Init.BS1 = CAN_BS1_12TQ;
  hcan.Init.BS2 = CAN_BS2_5TQ;
  hcan.Init.TTCM = DISABLE;
  hcan.Init.ABOM = DISABLE;
  hcan.Init.AWUM = DISABLE;
  hcan.Init.NART = DISABLE;
  hcan.Init.RFLM = DISABLE;
  hcan.Init.TXFP = DISABLE;
  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }


  sFilterConfig.FilterNumber = 0;
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  sFilterConfig.FilterIdHigh = 0x07ff;
  sFilterConfig.FilterIdLow = 0x0000;
  sFilterConfig.FilterMaskIdHigh = 0x07ff;
  sFilterConfig.FilterMaskIdLow = 0x0000;
  sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
  sFilterConfig.FilterActivation = ENABLE;
  sFilterConfig.BankNumber = 14;

  if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
  {
      Error_Handler();
  }
}

В основном:

..
hcan.pTxMsg->StdId = 0x100;
hcan.pTxMsg->ExtId = 0x01;
hcan.pTxMsg->IDE = CAN_RTR_DATA;
hcan.pTxMsg->IDE = CAN_ID_STD;
hcan.pTxMsg->DLC = 2;

while (1)
{
  hcan.pTxMsg->Data[0] = 0x10;
  hcan.pTxMsg->Data[1] = 0x1;

      HAL_CAN_Transmit(&hcan, 10)
  HAL_Delay(1000);
 }

А на TX STM32 тот же код для инициализации CAN и следующий код в main:

if (HAL_CAN_Receive_IT(&hcan, CAN_FIFO0) != HAL_OK)
{
  Error_Handler();
}


void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* CanHandle)
{
if ((CanHandle->pRxMsg->StdId == 0x100) &&
    (CanHandle->pRxMsg->IDE   == CAN_ID_STD) &&
    (CanHandle->pRxMsg->DLC   == 2))
{
    printf("1");
}

Однако обратный вызов никогда не вызывается.

Что я вижу с помощью логического анализатора:

  • CANH (канал 2) и CANL (канал 0) получают информацию
  • Канал 4 подключен к RX STM32, CAN RX и ничего не получает

Я вижу X на скриншоте ниже, не уверен, что это проблема.

введите описание изображения здесь

Что я сделал

  • Заменил TJA, без разницы
  • Ставил брейкпоинты в разных местах, вроде все ок, кроме обратного вызова

Вопрос:

  • Что мне нужно изменить, чтобы иметь возможность получать информацию на RX STM32, CAN RX?

Обновлять

Я обнаружил, что есть некоторые проблемы с передачей:

в пределах

HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout)

происходит тайм-аут (последняя строка):

while(!(__HAL_CAN_TRANSMIT_STATUS(hcan, transmitmailbox)))
{
  /* Check for the Timeout */
  if(Timeout != HAL_MAX_DELAY)
  {
    if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout))
    {
      hcan->State = HAL_CAN_STATE_TIMEOUT;

      /* Cancel transmission */
      __HAL_CAN_CANCEL_TRANSMIT(hcan, transmitmailbox);

      /* Process unlocked */
      __HAL_UNLOCK(hcan);
      return HAL_TIMEOUT;
    }
  }
}

Я не нашел, откуда эта ошибка.

Также из-за ошибки после этого ничего не отправляется.

Сейчас нет больше времени, я проверю больше завтра или во вторник вечером.

Другие проверки:

  • Осциллограф: еще не проверял
  • Сопротивление между CANL и CANH: 61,4 Ом (без передачи), при передаче чуть меньше.
  • Напряжение при отсутствии отправки между CANL и CANH равно 0 В.
  • Добавление резистора 120 Ом между CANL и CANH не имеет никакого значения (все еще HAL_TIMEOUT).

Обновлять

Время пока ограничено, но я провел тест без использования трансиверов, а напрямую с простой схемой, как описано в этом документе (спасибо Maple). Соответствующая часть:

введите описание изображения здесь

Однако результат все еще не работает. Стороны приемника ПОЧТИ равны, но передатчик почти ничего не передает

  • Канал 1: передатчик TX
  • Канал 2: передатчик RX
  • Канал 3: приемник TX
  • Канал 4: приемник RX

введите описание изображения здесь

На детали (ниже) в выбранной рампе видна небольшая разница (их больше). Поскольку они соединены вместе, я бы не ожидал этого, но, возможно, мой дешевый логический анализатор (5 $) может вызвать это.

введите описание изображения здесь

Я бы начал с удаления «очевидного» провода заземления между частями Tx и Rx. Затем я бы убедился, что оконечные резисторы установлены правильно. Наконец, я бы измерил напряжение между CANL и CANH с помощью осциллографа, потому что то, что я вижу на CANH, выглядит неправильно.
Кроме того, что вы пытаетесь сделать с двойным повторением hcan.pTxMsg->IDE?
@Maple спасибо за все эти советы. Я всегда думал, что устройства, соединенные вместе, должны быть максимально заземлены вместе? Я делал это через SPI. Так что теперь я в замешательстве, когда это нужно делать, а когда нет. Я также думаю, что резисторы на 120 Ом уже есть на плате, но я могу проверить их мультиметром (наверное, между CANL и CANH?). Мой осциллограф очень плохой, он едва ли полезен для просмотра реальных графиков. И двойное назначение IDE - действительно глупая ошибка (наверное, дважды проглядел). Вечером позже я смогу снова проверить схему и код.
CAN использует дифференциальную сигнализацию, поэтому ему не нужна общая земля. На самом деле, он может выдерживать довольно большое напряжение CN. Диагностику лучше проводить в ожидаемых условиях эксплуатации. 120 Ом требуется только для кабелей длиннее нескольких футов, поэтому некоторые люди вместо этого используют один 60 Ом. Убедитесь, что это не относится к вашим модулям.
Вам не нужен очень хороший осциллограф - вам нужно, чтобы напряжение между CANL и CANH оставалось равным 0, когда нет связи, и пульсировало в правильном направлении, когда есть. Если осциллограф у вас не работает, вы можете измерить обе линии на землю каждого модуля. Согласно техническому описанию TJA1050, они должны были подавать напряжение CN 0,5 В в состоянии покоя. Это трудно увидеть на логическом анализаторе для провода CANL. Если у вас действительно есть CANH на канале 2 и CANL на канале 0 на скриншоте, то похоже, что ваши CANL и CANH пересеклись.
@Maple Хорошо, может быть, это проблема (тоже), до сих пор я всегда использовал его (и никогда не заставлял CAN работать). Мне, вероятно, нужно 120 Ом, для большинства моих запланированных устройств расстояние будет рядом друг с другом, но одно будет на расстоянии около 3 футов. А осциллографом могу проверить на 0,5В (особенно в простое). Вечером попробую все варианты и отчитаюсь. Большое спасибо за ваши объяснения.
С такими короткими проводами основная функция резистора(ов) состоит в том, чтобы действовать как согласующий(е) резистор(ы) . Таким образом, значение не критично, но важно, чтобы оно было на самом деле!
Какова предполагаемая скорость передачи данных и какова фактическая скорость передачи данных, измеренная логическим анализатором.
@PeterMortensen Если бы я хотел использовать 7 устройств, все рядом друг с другом (разъем последовательного DB9 к разъему последовательного DB9 без кабеля), за исключением одного устройства, которое находится примерно на 3 фута дальше, какие резисторы я должен добавить и где? Плата TJA1050 также имеет резисторы на 120 Ом (но неизвестно, как они используются, поскольку они уже размещены на печатной плате, см. рисунок выше).
Битрейт шины CAN составляет 250 000 бод, а частота логического анализатора — 24 МГц. В конце концов я хочу использовать более высокую скорость передачи данных (предпочтительно 1 Мбит/с или выше, но я думаю, что CAN не поддерживает больше).
Какую скорость передачи данных по шине CAN вы измеряете с помощью логического анализатора (самая короткая длительность импульса в данных)?
Достаточно одного резистора на 60 Ом, хотя для соответствия стандарту шины CAN необходимо два резистора на 120 Ом, по одному на каждом конце шины. Я видел систему, работающую с 3 резисторами, эффективным сопротивлением 40 Ом (ошибка, допущенная при производстве системы) в реальном мире. Были проблемы, но не из-за 3-х резисторов.
@Maple Извините, но часть о том, что не нужна земля, - это фигня. Приемопередатчики CAN могут выдерживать разность потенциалов до 40 В, если вам повезет, но на самом деле нет никаких гарантий, что что-то будет работать, если вы не подключите сигнальную землю. Это фундаментально для любой электроники передачи данных, которая не имеет гальванической развязки.
@Maple В качестве примера из реальной жизни, только вчера я помогал устранять неполадки в CAN-шине, где связь между ПК и устройством была полностью отключена. Причина: случайно потерян сигнальный провод заземления. Это естественно, потому что потенциал земли ПК, исходящий от линии 230 В переменного тока, может быть буквально любым по сравнению с устройством, питаемым от другого источника. Как только сигнальная земля была восстановлена, все заработало как часы.
@Lundin Спасибо за это объяснение; Я верну заземляющий провод между двумя STM (и идущий к обоим трансиверам CAN), хотя у меня все еще есть та же проблема, надеюсь, в эти выходные я смогу подробнее изучить ее.
@Lundin Итак, вы предлагаете проложить провод между двумя точками с разницей в 230 В? Да, общее основание может уменьшить количество ошибок и обычно рекомендуется. Но это не так просто, как «всегда подключать заземление». Я предлагаю взглянуть на 4.4 . ОП заявил, что все его узлы, кроме одного, будут рядом друг с другом, поэтому я предположил, что у них уже есть общий источник питания. Добавление еще одного заземляющего провода — это рецепт контура заземления, который часто очень трудно диагностировать.
@Maple, если вы имеете в виду под источником питания одну и ту же «группу» в электрической цепи: да. Я даже подумываю использовать один адаптер (5В, 6А или около того) и питать все устройства от одного адаптера. Один включает в себя светодиодную ленту, которая будет потреблять больше энергии, следовательно, 6А). И каждый разъем DB9 будет подавать +5 В и GND на следующее устройство.
@Maple Вот почему человек, который сделал печатную плату CAN, должен быть кем-то, кто знает, что они делают, когда делают макеты земли. Это действительно так же просто, как всегда добавлять сигнальную землю, иначе вы можете получить всевозможные периодические ошибки, особенно в автомобильных приложениях с большими токами питания. Я вижу этот сбой снова и снова на шинах CAN, и это происходит в течение последних 10 лет или около того.
Чтобы объяснить проблему заземления далее, в такой системе, как автомобиль, все заземления должны быть подобны «звезде», восходящей к одному единственному источнику, поскольку через это заземление будут протекать большие токи. Если вы затем соедините два узла на краях этой звезды вместе без заземления сигнала, то грязный центр звезды со всеми токами заземления на всем транспортном средстве будет действовать как эталон для всех сигналов. Однако, если они подключены к сигнальной земле, то грязная земля питания вообще не будет задействована.
Теперь, если вы получаете огромные токи, протекающие через сигнальную землю и тем самым вызывающие контуры заземления, то разводка печатной платы - это дерьмо. При изготовлении печатной платы необходимо подумать, вы не можете просто бросить провод на землю питания после того, как CAD уже сделан, и назвать его «сигнальной землей»: это действительно может вызвать проблемы с контурами заземления.
Логический анализатор, вероятно, не способен непосредственно исследовать шину CAN. Используйте RX/TX на любом трансивере.
@ Jeroen3 Я сделаю это (тоже), у меня 8 каналов, поэтому я могу выполнять RX/TX как с приемника, так и с передатчика, а также CANL/CANH... логический анализатор может использовать CAN в качестве декодера, поэтому я предположил, что это будет также способен обрабатывать сообщения CAN.
@MichelKeijzers Может быть, предполагается, что он будет использоваться для линий RX / TX за трансивером? Потому что у вас там будет тот же самый бинарный поток, но на ваших обычных логических уровнях (3,3В/5В). Я мало использовал логические анализаторы, так что тут я не сильно помогу.
@Lundin Я проверю это, спасибо ... Логический анализатор очень дешевый, но до сих пор мне очень помог (хотя, возможно, качество того же качества). Мой осциллограф действительно плохой, его практически невозможно использовать (старый аналоговый тип с некоторыми проблемами обновления).
@MichelKeijzers из вашего обновления это действительно похоже на проблему с программным обеспечением. Я не знаком с этой библиотекой, и когда я искал в Интернете примеры, я не видел ничего, кроме разочарованных людей, которые дергали себя за волосы. Даже низкоуровневый код, который я нашел здесь, выглядит намного проще, чем эта библиотека. Теперь (говоря без каких-либо знаний) кажется, что для использования библиотеки требуется больше, чем в вашем примере кода, например, настройки часов, конфигурация ввода-вывода и т. д. Тайм-аут часто указывает на пропущенные шаги конфигурации или неправильную обработку EOT.
@Maple У меня действительно есть некоторые проблемы с Cube / Hal, но, похоже, это способ по умолчанию, и предполагается, что он должен быть исправлен / поддерживаться ST. Я совсем новичок, поэтому погружение во все регистры и соответствующие таблицы данных также несколько утомительно. Я надеялся, что CubeMX сделает свою работу. Хотя у меня все равно не работала светодиодная лента, поэтому я решил использовать программное обеспечение Arduino для STM32, но не смог найти программное обеспечение Arduino для STM32 для CAN.
Что касается KEIL, я пытался установить его один раз, но одному из моих устройств, вероятно, понадобится большая программа, поэтому, вероятно, я все равно рано или поздно превысю лимит свободного места KEIL, и мне снова придется искать другое решение.
Вы настроили GPIO с альтернативными функциями? F103 нужно это
Да пробовал, улучшений нет.

Ответы (4)

CANH (канал 2) и CANL (канал 0) получают информацию

Если канал 2 действительно CANH с той же временной базой, что и CANL на канале 0, то это, очевидно, ваша проблема. Он совсем не выглядит здоровым, он должен выглядеть как дифференциальное зеркало CANL.

  • Я подозреваю, что что-то вроде замыкания CANH на другой сигнал или что-то в цепи приемопередатчика CAN работает неправильно (плохая пайка?).

  • Также убедитесь, что между MCU и приемопередатчиком или внутри MCU в регистрах портов нет подтягивающих резисторов. Хотя по логике вещей, если бы это было проблемой, то это также привело бы к сбою CANL.

  • Всегда добавляйте 2 согласующих резистора на 120 Ом, по одному на каждом конце шины, даже если вы работаете с низкой скоростью передачи данных и на коротких расстояниях. Определенная разница импеданса примерно в 60 Ом между CANH и CANL часто необходима для того, чтобы схема CAN оставалась работоспособной.

  • Очевидно, подключите сигнальную землю между каждым узлом в соответствии с требованиями и требованиями стандарта CAN. В противном случае вы окажетесь во власти любого потенциала земли, который есть у ваших узлов, и если на земле питания есть высокие токи заземления, это может повлиять на связь CAN, если она не использует выделенную сигнальную землю.

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

Красный крестик на вашем прицеле — это не ошибка, а битовая начинка. Ваша область добавляет их туда, чтобы указать, что они не являются частью фактических данных. Как и ожидалось, у вас всегда должен быть бит заполнения после 5 последовательных старших/младших битов в кадре CAN.

Это может быть плохая пайка, я новичок в пайке, но я также пробовал разные трансиверы CAN (одного и того же типа), и у меня была такая же проблема. Я надеюсь, что мои навыки пайки настолько плохи (мои STM32 работают нормально). Я сам не использовал никаких резисторов, но они есть на платах трансивера CAN (не уверен, как они в схеме, это технология SMD). Я уже измерил мультиметром (и иногда посылал 1 секунду) сопротивление около 60-120 Ом между CANL и CANH, поэтому я думаю, что встроенные резисторы позаботятся об этом. Так что я думаю, это нормально.
«Он совсем не выглядит здоровым, он должен выглядеть как дифференциальное зеркало CANL». Это был мой первый комментарий в этой теме. Потом я понял, что он использует логический анализатор, поэтому он вообще не должен видеть CANL без настройки логических уровней. Тот факт, что он это видит, скорее всего означает, что строки поменялись местами.
@Maple Я проверю строки как можно скорее.
Хм, хорошо, вы можете измерить с помощью области и убедиться, что у вас есть 2,5 В +/- 1 В на обеих линиях? CANL переходит от 2,5 В к 1,5 В = доминирует, CANH делает прямо противоположное.
«полная противоположность» будет варьироваться от 1,5 до 2,5 В. CANH меняется между 2,5 и 3,6В, что позволяет увидеть на логическом анализаторе. Но все это расщепление волос. Самый простой тест сравнения контакта TX на одном модуле и RX на другом сразу покажет, работают ли линии CAN. А если и делают, то проблема в софте.

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

Если это на одной плате, вам может сойти с рук установка около 60 Ом между CANL и CANH. Если шина CAN является настоящим кабелем, установите сопротивление 120 Ом между CANL и CANH на каждом конце. В этом случае кабель также должен иметь заземление, чтобы оба устройства использовали одно и то же заземление.

Спасибо.. Попробую в эти выходные; Мне все еще интересно, что делают резисторы 120R на плате ... Я бы предположил, что это те резисторы, о которых вы пишете. Я буду использовать 120R, так как со временем это будут настоящие кабели, правда в основном короткие.
@Michel: Если эти вещи TJA1050 являются модулями, когда на них уже есть резисторы, тогда вам не следует добавлять свои собственные. Вероятно, есть какая-то возможность включить или отключить их. Обычно вы не хотите, чтобы узлы пытались терминировать шину. Вы хотите завершить шину на каждом конце. По этой причине я бы не ожидал, что модули будут включать согласующие резисторы, если они не будут включены дополнительно.
Отключить их невозможно (по крайней мере, без выпайки/царапания на печатной плате)... в любом случае будет легко проверить, решит ли это проблему (если есть хотя бы одна).
Я нашел эту ссылку: sparks.gogo.co.nz/… , в которой говорится: «Обратите внимание, что в этом приемопередатчике установлен согласующий резистор 120 Ом (маркировка 121). Если у вас более 2 приемопередатчиков на шине, вам может потребоваться удалить этот резистор. для всех приемопередатчиков, кроме первого и последнего, ваш пробег может отличаться».
@MichelKeijzers Это действительно странно; поскольку Олин говорит, что такие согласующие резисторы не должны быть включены в качестве настройки по умолчанию. Кроме того, эти резисторы выглядят как 0603 или 0805, что, возможно, слишком слабо для правильной терминации CAN. Вы должны использовать резистор, который может выдержать пару 100 мВт. Я использую 400 мВт в качестве эмпирического правила, но я не помню, откуда я взял это число.
@Lundin, что я могу сделать, это оторвать резистор, припаять два конца снятого резистора вместе и использовать свои собственные резисторы. Некоторое время назад я сделал терминатор DMX, в котором используются резисторы 120 Ом 0,5 Вт, так что 400 мВт звучит знакомо.
Когда вы говорите «припаяйте два конца удаленного резистора вместе», я надеюсь, вы не имеете в виду замыкание контактных площадок там, где он был. Это сократит ваши линии L и H.
@Maple Первоначально я имел в виду это, но это не очень хорошая идея, я проверил, и сопротивление между CANL и CANH в настоящее время составляет 61,4 Ом, так что все в порядке.

Я просмотрел здесь огромное количество предложений, аргументов и контраргументов и думаю, что все это оказало вам скорее медвежью услугу. В CAN нет никакой магии, и вот доказательство:

введите описание изображения здесь

Этот ужасный беспорядок на моем столе — быстро и грязно испытательный стенд для некоторого программного обеспечения, над которым я работаю в данный момент. Он имеет два двойных контроллера двигателей с интерфейсами CAN и AVR, подключенный к CAN через контроллер MCP2515 + трансивер TJA1050 (точно такой же, как у вас!).

Контроллеры моторов подключены 3-мя проводами (включая землю), а у ресивера их только 2. У меня даже нет прямой шины - все подключено звездой к неиспользуемому (на данный момент там был другой контроллер) штекеру DB15, который я обвел На фото. Вы можете видеть один резистор на 100 Ом, соединяющий все CANL и CANH вместе. И все это прекрасно работает на скорости 500 кбит/с.

Я не утверждаю, что это правильный способ делать вещи. Я лишь к тому, что на этих дистанциях и скоростях, без помех и со стабильной мощностью все эти мелкие детали и ноу-хау просто не имеют значения.

Итак, вот что я предлагаю.

  1. Ваши схемы в порядке. Убедитесь, что все RX, TX, CANL, CANH подключены в соответствии с ним (даже если вы знаете, что они в порядке, проверить никогда не помешает).

  2. Оставьте эти резисторы на 120 Ом на модулях.

  3. Вы можете соединить земли двух TJA1050 вместе, если хотите, но если ваша установка похожа на мою, это абсолютно не имеет значения, поскольку все они питаются от одного источника, а расстояние незначительно.

  4. Подключите логический анализатор для измерения TX (к земле) на передающей стороне и RX (к земле) на принимающей стороне. Я считаю, что это было предложено по крайней мере 3 раза уже, но я никогда не видел результатов.

  5. Запустите свои программы. Вы должны увидеть точно такой же сигнал на RX, как и на TX. Если нет, то проблема где-то в CAN соединении. Но если вы это сделаете, проблема в программном обеспечении, скорее всего, в настройке фильтра или маски.

ОБНОВЛЯТЬ

Весь смысл прямого подключения контроллеров заключался в том, чтобы исключить (насколько это возможно) физический аспект. Если провода короткие, диоды работают быстро и подтяжка правильная, на контактах RX не должно быть никакой разницы. Убедитесь, что вы подключаете подтяжку к вашему фактическому Vcc (этот документ был написан для системы 5V).

Я предлагаю проверить ваши соединения один раз и отложить вопрос о проводке в сторону. Давайте сосредоточимся на программной части. Вот как бы я поставил диагноз.

  1. Минимизируйте свой код. Единственное, что вы должны иметь на стороне TX, это достаточно, чтобы отправлять один кадр базовых данных один раз в секунду в цикле. Я предлагаю передавать простой однобайтовый циклический порядковый номер. Единственное, что должно быть у вашей стороны RX, - это достаточно, чтобы прочитать этот байт и, возможно, распечатать его в отладке. Он не должен ничего возвращать, чтобы не загрязнить тест.

  2. Сначала отладьте TX. Вы упомянули, что в какой-то момент получили только одно сообщение. Итак, цель №1 — убедиться, что TX отправляет эти сообщения каждую секунду. И вы должны увидеть их своим логическим анализатором на этой однопроводной шине.

Общие проблемы здесь: неправильное использование буферов передачи, неправильная обработка EOT, искаженный кадр данных (ID, контрольные биты и т. д.). Также проверьте, как ваша библиотека/контроллер обрабатывает бит ACK. Технически это не требуется, но некоторые реализации могут пытаться повторно передавать одно и то же сообщение снова и снова, пока не будет получен ACK, тем самым блокируя буферы Tx от получения новых данных.

  1. С этой работой перейдите на сторону RX и посмотрите, правильно ли он получает этот порядковый номер.

Общие проблемы здесь: разная скорость передачи данных, неправильное использование буферов RX, неправильная обработка прерываний, неправильный фильтр или маска фильтра. Это может помочь настроить ваши фильтры так, чтобы они принимали любое сообщение в начале.

  1. Только когда и TX, и RX работают правильно, вы можете перекрестно скопировать код передачи и приема и начать работу над двунаправленной связью запрос-ответ.
Я скоро прокомментирую это ... Я обнаружил проблему, если я выключаю один STM, на другом все еще горит индикатор питания, поэтому я думаю, что есть какая-то проблема с напряжением (или где-то короткое замыкание). Что касается 4, я все еще пытаюсь, каждый раз получаю разные результаты, а RX / TX все еще разные, поэтому я действительно думаю, что проблема в соединении CAN. Как вы думаете, могу ли я обойти TJA и просто для проверки соединить RX и TX обоих STM вместе? (STM_Receiver_CAN_RX в STM_Transmitter_CAN_TX и STM_Receiver_CAN_TX в STM_Transmitter_CAN_RX?
Классная идея, но нет, она (немного) сложнее. Глянь сюда
это кажется довольно простым, чтобы попробовать .. Надеюсь, я сделаю это сегодня, если у меня останется время. Спасибо за помощь.
Привет, Maple, я пробовал без трансивера, и все равно это не работает, также есть небольшие различия в RX приемника / передатчика STM, хотя я не ожидал этого, так как они связаны. См. обновленный вопрос для логического анализатора (внизу: см. обновление).
Я добавил несколько предложений к ответу.
спасибо ... я проверю это после выходных, когда у меня будет больше времени. Я очень ценю ваши усилия по оказанию мне помощи (и для меня это будет действительно стимулом, если я заставлю CAN работать). с UART и SPI у меня было меньше проблем.

Хотя я еще не пробовал (в конце концов, CAN мне не нужен), решение состоит в том, чтобы обновить в STM32CubeMX библиотеку HAL F1 до версии 1.7 (или выше), где реализация CAN была исправлена/изменена.