Передача CAN STM32F446 завершена, прерывание не сработало :( - PullRequest
0 голосов
/ 20 января 2020

Я работаю с CAN-модулем с платы STM32F446RE, в которой MCU указан в названии. Я пытаюсь передать некоторые данные по UART через терминал Tera Term, взять эти данные, отправить их в режиме Loopback и прочитать их обратно. Для начала я сгенерировал конфигурацию из CubeMx и написал некоторый код для передачи числового значения, которое пользователь вводит в «сеть» банок, и когда это произойдет, я хочу go в ISR завершения банок и распечатать некоторое сообщение на Оттуда UART указывает, что передача была завершена.

В CubeMx я настроил прерывания CAN следующим образом:

Прерывание CAN1 TX включено

Прерывание CAN1 RX включено ( потому что я также хочу вызвать прерывание получения после того, как я исправлю эту проблему)

Это часть кода (я не могу скопировать, вставить все, так как это сообщение станет слишком длинным, просто спросите меня, нужно ли мне чтобы предоставить больше моего кода):

while (1)
  {
      /*keep getting what the user enters on the UART untill enter is pressed*/
      while(received_data != '\r')
      {
          HAL_UART_Receive(&huart2,&received_data,1,HAL_MAX_DELAY);
          recvd_buffer[buf_indx] = received_data;
          buf_indx++;
          if(buf_indx > 1)
          {
              buf_indx = 0;
          }
      }

      if( recvd_buffer[0] == '1' || recvd_buffer[0] == '0')
      {
          received_data = 0;
          buf_indx = 0;

          user_data = "\n\rOK. Starting CAN transmission in interrupt mode\n\r";
          len_of_data = strlen(user_data);
          HAL_UART_Transmit( &huart2, (uint8_t*)user_data, len_of_data, HAL_MAX_DELAY );
          //CAN will start sending data in non-blocking mode
          CAN_Tx(recvd_buffer[0]);
          recvd_buffer[0] = 0;
          recvd_buffer[1] = 1;
      }
      else
      {
          recvd_buffer[0] = 0;
          recvd_buffer[1] = 1;
          received_data = 0;
          user_data = "\n\rInvalid value. Please enter either 1 or 2\n\r";
          len_of_data = strlen(user_data);
          HAL_UART_Transmit( &huart2, (uint8_t*)user_data, len_of_data, HAL_MAX_DELAY );
      }
  }
}

Ниже я также реализовал функции полного обратного вызова для передачи 3 Tx mailbox:

void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan)
{
    uint16_t user_data = "\n\rTransmission completed mailbox_0\n\r";
    uint16_t len_of_data = strlen(user_data);
    HAL_UART_Transmit( &huart2, (uint8_t*)user_data, len_of_data, HAL_MAX_DELAY );
}

void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan)
{
    user_data = "\n\rTransmission completed mailbox_1\n\r";
    uint16_t len_of_data = strlen(user_data);
    HAL_UART_Transmit( &huart2, (uint8_t*)user_data, len_of_data, HAL_MAX_DELAY );
}

void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan)
{
    user_data = "\n\rTransmission completed mailbox_2\n\r";
    uint16_t len_of_data = strlen(user_data);
    HAL_UART_Transmit( &huart2, (uint8_t*)user_data, len_of_data, HAL_MAX_DELAY );
}

Это функция CAN_Tx, которая использует МОЖЕТ остановить драйвер для отправки данных:

void CAN_Tx(uint8_t value)
{
  uint8_t mailbox_no;
  CAN_TxHeaderTypeDef can_header;
  can_header.StdId = 0;
  can_header.ExtId = 0;
  can_header.IDE = CAN_ID_STD;
  can_header.RTR = CAN_RTR_DATA;
  can_header.DLC = 1;
  can_header.TransmitGlobalTime = DISABLE;
  HAL_CAN_AddTxMessage(&hcan1, &can_header, value, &mailbox_no);
}

Я отладил код в основном и, кажется, работает нормально. Я не получил ошибку в функции Can_Tx, она возвращается с успехом. Насколько я понимаю из таблицы данных микроконтроллера (раздел 30.8 - прерывания bxCAN), если включено прерывание передачи timer1, чем в зависимости от того, какой почтовый ящик использовался для передачи, должен выполняться один из этих обратных вызовов. Однако этого не происходит, код внутри них не будет выполнен. Пожалуйста, помогите мне понять, что я делаю неправильно. Спасибо!

...