任务目标是使用STM32F103C8T6单片机对电机进行控制,电机是CAN通信,只需要发指令。现在测试阶段,用C8T6连接CAN收发器(TJA1050、VP230等TTL转CAN模块都试过),再连接创芯科技的CAN分析仪,进行CAN报文的接收。目前程序用hal库配置编写,在keil下载烧录,可以回环在电脑的串口助手看到数据,但是正常收发模式就调不通无法通信了
3条回答 默认 最新
- hahahaha2023 2023-04-12 17:18关注
首先,您需要确认您的CAN收发器和CAN分析仪的配置是否正确。可以使用示波器或逻辑分析仪来检查CAN总线上的信号是否正确,以及确认CAN收发器和CAN分析仪是否能够正常工作。
其次,您需要确认您的STM32F103C8T6单片机的CAN总线配置是否正确。以下是使用HAL库配置STM32F103C8T6单片机的CAN总线的示例代码:
#include "stm32f1xx_hal.h" CAN_HandleTypeDef hcan; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_CAN_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_CAN_Init(); CAN_TxHeaderTypeDef TxHeader; uint8_t TxData[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; uint32_t TxMailbox; TxHeader.StdId = 0x123; TxHeader.ExtId = 0x01; TxHeader.RTR = CAN_RTR_DATA; TxHeader.IDE = CAN_ID_STD; TxHeader.DLC = 8; while (1) { if (HAL_CAN_GetTxMailboxesFreeLevel(&hcan) != 0) { if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox) == HAL_OK) { // Transmit success } else { // Transmit failed } } } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC _ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); } static void MX_CAN_Init(void) { hcan.Instance = CAN1; hcan.Init.Prescaler = 9; hcan.Init.Mode = CAN_MODE_NORMAL; hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; hcan.Init.TimeSeg1 = CAN_BS1_13TQ; hcan.Init.TimeSeg2 = CAN_BS2_2TQ; hcan.Init.TimeTriggeredMode = DISABLE; hcan.Init.AutoBusOff = ENABLE; hcan.Init.AutoWakeUp = DISABLE; hcan.Init.AutoRetransmission = ENABLE; hcan.Init.ReceiveFifoLocked = DISABLE; hcan.Init.TransmitFifoPriority = DISABLE; if (HAL_CAN_Init(&hcan) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } }
在该示例代码中,我们使用了HAL库来配置CAN总线。首先,我们需要初始化CAN总线的基本参数,如预分频器、同步跳转宽度、时间段1、时间段2等。然后,我们使用CAN_TxHeaderTypeDef结构体定义了CAN报文的头部信息,包括标准ID、扩展ID、数据长度等。在主循环中,我们使用HAL_CAN_AddTxMessage()函数发送CAN报文,并通过HAL_CAN_GetTxMailboxesFreeLevel()函数检查发送
解决 无用评论 打赏 举报
悬赏问题
- ¥30 STM32 INMP441无法读取数据
- ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
- ¥15 用visualstudio2022创建vue项目后无法启动
- ¥15 x趋于0时tanx-sinx极限可以拆开算吗
- ¥500 把面具戴到人脸上,请大家贡献智慧
- ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
- ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
- ¥30 c#打开word开启修订并实时显示批注
- ¥15 如何解决ldsc的这条报错/index error
- ¥15 VS2022+WDK驱动开发环境