求解答:CANopenNode中TPDO通信常见问题解答

问题描述 投票:0回答:0

我目前正在研究一个与使用 CANOpenNode 标准和 STM32 微控制器的 CAN 通信相关的项目。我查阅了各种 GitHub 存储库并观看了视频,但我无法成功传输任何 TPDO 数据包,即使是最简单的数据包。您能检查我的代码并帮助识别任何潜在的错误吗?非常感谢。

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "CO_app_STM32.h"
#include "OD.h"
#include "CANopen.h"
#include "../CANopenNode/301/CO_SDOclient.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 0 */

  /* USER CODE END Callback 0 */
  if (htim->Instance == TIM1)
  {
    HAL_IncTick();
  }
  /* USER CODE BEGIN Callback 1 */
  // Handle CANOpen app interrupts
  if (htim == canopenNodeSTM32->timerHandle) {
      canopen_app_interrupt();
  }
  /* USER CODE END Callback 1 */
}





/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
CAN_HandleTypeDef hcan;

TIM_HandleTypeDef htim1;

UART_HandleTypeDef huart1;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_CAN_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_TIM1_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_CAN_Init();
  MX_USART1_UART_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */


    CANopenNodeSTM32 canOpenNodeSTM32;
    canOpenNodeSTM32.CANHandle = &hcan;
    canOpenNodeSTM32.HWInitFunction = MX_CAN_Init;
    canOpenNodeSTM32.baudrate = 125;
    canOpenNodeSTM32.desiredNodeID = 32;
    canOpenNodeSTM32.timerHandle = &htim1;

    canopen_app_init(&canOpenNodeSTM32);


    OD_PERSIST_COMM.x6000_current_data=0xAB;
    OD_PERSIST_COMM.x6001_voltage_data=0xAB;
    OD_PERSIST_COMM.x6002_charger_mode=0xAB;
    OD_PERSIST_COMM.x6003_timereq_data=0xAB;

CO_TPDOsendRequest(&canOpenNodeSTM32.canOpenStack->TPDO[0]);// this is the TPDO sending funciotn, am i right ?

    /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
      HAL_Delay(100);

      uint8_t receive_data[4];
              receive_data[0]=OD_PERSIST_COMM.x6000_current_data;
              receive_data[1]=OD_PERSIST_COMM.x6001_voltage_data;
              receive_data[2]=OD_PERSIST_COMM.x6002_charger_mode;
              receive_data[3]=OD_PERSIST_COMM.x6003_timereq_data;
      HAL_UART_Transmit(&huart1, receive_data, 4, 100); // transmit data receive from CAN to UART

      canopen_app_process();

  }
  /* USER CODE END 3 */
}

c stm32 can-bus canopen
© www.soinside.com 2019 - 2024. All rights reserved.