工业设计专业是干什么的seo和sem是什么意思
CAN总线简介
硬件电路
CAN 电平标准
CAN 收发器
CAN物理层作用
数据帧
遥控帧
CAN 5种类型帧
位填充
波形实例
接收方数据采样
接收方采样遇到的问题
接收方位时序
硬同步
再同步
波特率计算
资源分配规则
STM32 CAN外设介绍
CAN基本结构
发送过程
接收过程
标识符过滤器
测试模式
工作模式
初始化配置代码
/*** @brief CAN初始化* @param tsjw : 重新同步跳跃时间单元.范围: 1~3;* @param tbs2 : 时间段2的时间单元.范围: 1~8;* @param tbs1 : 时间段1的时间单元.范围: 1~16;* @param brp : 波特率分频器.范围: 1~1024;* @note 以上4个参数, 在函数内部会减1, 所以, 任何一个参数都不能等于0* CAN挂在APB1上面, 其输入时钟频率为 Fpclk1 = PCLK1 = 36Mhz* tq = brp * tpclk1;* 波特率 = Fpclk1 / ((tbs1 + tbs2 + 1) * brp);* 我们设置 can_init(1, 8, 9, 4, 1), 则CAN波特率为:* 36M / ((8 + 9 + 1) * 4) = 500Kbps** @param mode : CAN_MODE_NORMAL, 正常模式;CAN_MODE_LOOPBACK,回环模式;* @retval 0, 初始化成功; 其他, 初始化失败;*/
uint8_t can_init(uint32_t tsjw, uint32_t tbs2, uint32_t tbs1, uint16_t brp, uint32_t mode)
{g_canx_handler.Instance = CAN1;g_canx_handler.Init.Prescaler = brp; /* 分频系数(Fdiv)为brp+1 */g_canx_handler.Init.Mode = mode; /* 模式设置 */g_canx_handler.Init.SyncJumpWidth = tsjw; /* 重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1TQ~CAN_SJW_4TQ */g_canx_handler.Init.TimeSeg1 = tbs1; /* tbs1范围CAN_BS1_1TQ~CAN_BS1_16TQ */g_canx_handler.Init.TimeSeg2 = tbs2; /* tbs2范围CAN_BS2_1TQ~CAN_BS2_8TQ */g_canx_handler.Init.TimeTriggeredMode = DISABLE; /* 非时间触发通信模式 */g_canx_handler.Init.AutoBusOff = DISABLE; /* 软件自动离线管理 */g_canx_handler.Init.AutoWakeUp = DISABLE; /* 睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位) */g_canx_handler.Init.AutoRetransmission = ENABLE; /* 禁止报文自动传送 */g_canx_handler.Init.ReceiveFifoLocked = DISABLE; /* 报文不锁定,新的覆盖旧的 */g_canx_handler.Init.TransmitFifoPriority = DISABLE; /* 优先级由报文标识符决定 */if (HAL_CAN_Init(&g_canx_handler) != HAL_OK){return 1;}#if CAN_RX0_INT_ENABLE/* 使用中断接收 */__HAL_CAN_ENABLE_IT(&g_canx_handler, CAN_IT_RX_FIFO0_MSG_PENDING); /* FIFO0消息挂号中断允许 */HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn); /* 使能CAN中断 */HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 1, 0); /* 抢占优先级1,子优先级0 */
#endifCAN_FilterTypeDef sFilterConfig;/*配置CAN过滤器*/sFilterConfig.FilterBank = 0; /* 过滤器0 */sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; /* 标识符屏蔽位模式 */sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; /* 长度32位位宽*/sFilterConfig.FilterIdHigh = 0x0000; /* 32位ID */sFilterConfig.FilterIdLow = 0x0000;sFilterConfig.FilterMaskIdHigh = 0x0000; /* 32位MASK */sFilterConfig.FilterMaskIdLow = 0x0000;sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; /* 过滤器0关联到FIFO0 */sFilterConfig.FilterActivation = CAN_FILTER_ENABLE; /* 激活滤波器0 */sFilterConfig.SlaveStartFilterBank = 14;/* 过滤器配置 */if (HAL_CAN_ConfigFilter(&g_canx_handler, &sFilterConfig) != HAL_OK){return 2;}/* 启动CAN外围设备 */if (HAL_CAN_Start(&g_canx_handler) != HAL_OK){return 3;}return 0;
}/*** @brief CAN底层驱动,引脚配置,时钟配置,中断配置此函数会被HAL_CAN_Init()调用* @param hcan:CAN句柄* @retval 无*/
void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan)
{if (CAN1 == hcan->Instance){CAN_RX_GPIO_CLK_ENABLE(); /* CAN_RX脚时钟使能 */CAN_TX_GPIO_CLK_ENABLE(); /* CAN_TX脚时钟使能 */__HAL_RCC_CAN1_CLK_ENABLE(); /* 使能CAN1时钟 */GPIO_InitTypeDef gpio_initure;gpio_initure.Pin = CAN_TX_GPIO_PIN;gpio_initure.Mode = GPIO_MODE_AF_PP;gpio_initure.Pull = GPIO_PULLUP;gpio_initure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(CAN_TX_GPIO_PORT, &gpio_initure); /* CAN_TX脚 模式设置 */gpio_initure.Pin = CAN_RX_GPIO_PIN;gpio_initure.Mode = GPIO_MODE_AF_INPUT;HAL_GPIO_Init(CAN_RX_GPIO_PORT, &gpio_initure); /* CAN_RX脚 必须设置成输入模式 */}
}