STM32F1 HAL CAN2 не получает

Я использую нестандартную плату с контроллером STM32F107VCT6. Основная цель этой платы - соединить две сети, выполнить некоторые вычисления и передать некоторые данные через SPI другому контроллеру, а некоторые - в другую сеть CAN и наоборот.

Я имею сеть CAN1, получающую и передающую точно, как я хотел бы это выполнить; однако сеть CAN2 может только передавать (таким образом, это не аппаратная ошибка)

После копирования кода, все же изменив банк фильтров на значение больше 14, как предлагали многие другие форумы; а также установка других требований для изменения на CAN2, он все еще не получает ни в режиме прерывания, ни в режиме опроса.

Я использовал STM32Cube MX для генерации того же кода инициализации, что и для CAN1, хотя и на другой шине с разными приоритетами прерываний.

Но код не работает, как будто на шине нет сообщений. Я использую анализатор шины Microchip CAN для отправки и получения тестовых сообщений.

Еще одна деталь: у меня все еще работает CAN1, просто без данных; как таковые все его часы все еще работают.

Вот мой тестовый код:

Основной цикл

int main(void)
{
  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  MX_CAN1_Init();
  MX_CAN2_Init();
  MX_RTC_Init();
  MX_SPI1_Init();
  MX_USART1_UART_Init();

  CAN_FilterConfTypeDef  sFilterConfig2;

  sFilterConfig2.FilterNumber = 0;
  sFilterConfig2.FilterMode = CAN_FILTERMODE_IDMASK;
  sFilterConfig2.FilterScale = CAN_FILTERSCALE_32BIT;
  sFilterConfig2.FilterIdHigh = 0x0000;
  sFilterConfig2.FilterIdLow = 0x0000;
  sFilterConfig2.FilterMaskIdHigh = 0x0000;
  sFilterConfig2.FilterMaskIdLow = 0x0000;
  sFilterConfig2.FilterFIFOAssignment = CAN_FILTER_FIFO1;
  sFilterConfig2.FilterActivation = ENABLE;
  sFilterConfig2.BankNumber = 20;

  HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig2);

  hcan2.pRxMsg = &RxMessage2;


    while (1)
    {

        HAL_CAN_Receive (&hcan2, CAN_FIFO1, 1000);

        {
            uint8_t buf[100], l = sprintf(buf, " ID: %d DLC: %d Data: %d %d %d %d %d %d %d %d \n\r", RxMessage2.StdId, RxMessage2.DLC, RxMessage2.Data[0], RxMessage2.Data[1], RxMessage2.Data[2], RxMessage2.Data[3], RxMessage2.Data[4], RxMessage2.Data[5], RxMessage2.Data[6], RxMessage2.Data[7]);
            HAL_UART_Transmit(&huart1, buf, l, 1000);
        }

        if (RxMessage2.StdId !=0) {
            while(1);
        }
    }
}

Любой вклад с благодарностью, ура, Том

0 ответов

В настройках фильтра добавьте дополнительную строку с указанием начального номера ведомых банков фильтров.

sFilterConfig2.SlaveStartBankNumber = 14;

При этом банки фильтров CAN определенно разделены на две части. Затем вы можете использовать номера банков фильтров от 14 до 28 для CAN2.

Другие вопросы по тегам