stm32CubeMx CAN 发送数据
平台 STM32F429
软件 STM32CubeMx 5.0.0
固件库 STM32Cube_FW_F4_V1.23.0
目的: 实现 CAN 的发送
一 简介
CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的,并最终成为国际标准(ISO11898)。是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。
由于 CAN 属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯,特别地,CAN 还会使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。
为了实现位同步,CAN 协议把每一个数据位的时序分解成如图 43-5 所示的 SS 段、PTS 段、PBS1 段、PBS2 段,这四段的长度加起来即为一个 CAN 数据位的长度。分解后最小的时间单位是 Tq,而一个完整的位由 8~25 个 Tq 组成。为方便表示,图中的高低电平直接代表信号逻辑 0 或逻辑 1(不是差分信号)。
波特率 = Tq *(SS+PTS+PBS1+PBS2)
=Fpclk1/((tbs1+tbs2+1)*brp)
二 创建工程
波特率 = 45M / 10 / (1+ 5 + 3) = 500k (45MHz为APB1总线频率,在clock中可以查看,10为 分频系数)
生成代码
修改代码
启动 CAN
HAL_CAN_Start(&hcan1);
发送数据
CAN_TxHeaderTypeDef TxHeader; uint8_t TxData[8] = {0x23, 0x81, 0x60, 0x00, 0x55, 0x55, 0x08, 0x00}; uint32_t TxMailbox; uint32_t std_id = 0x601; TxHeader.RTR = CAN_RTR_DATA; TxHeader.IDE = CAN_ID_STD; TxHeader.StdId=std_id; TxHeader.TransmitGlobalTime = DISABLE; TxHeader.DLC = 8; if (HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox) != HAL_OK) { /* Transmission request Error */ Error_Handler(); }
实验结果:
使用USB转CAN盒,打开ecantools软件,波特率为500k
按下按键,收到数据
代码 已上传到gitHub上 https://github.com/itachi1121/stm32-can.git
Talk is cheap, show me the code