F429—CAN协议

Can物理

      高可靠性和良好的错误检测能力 广泛应用于汽车计算控制系统和环境恶劣、电磁辐射强及震动大的工业环境

     是一种异步通信 2条信号线,组成一组差分信号线,以差分信号的形式进行通信

     物理层:主要分为 闭环总线 , 开环总线网络,一个使用于高速通信,一个适用于远距离通信

开环总线网络:

闭环总线网络:

can收发器(将普通信号转成差分信号,将差分信号转成普通信号) 接收到 can控制器 信号后,将信号差分分别发送到两根总线上 , 所以不能同时收发

 

CAN协议

         属于异步通信,没有时钟信号线,链接在同一个总线网络中的各个节点会想串口异步通信那样,

         节点间使用约定好的波特率进行通信,

          位同步 增强抗干扰性

每个电平被分解为19格:时间为1/19Tq    CAN将其划分成SS PTS PBS1 PBS2四个段,而数据采样时在PBS1 PBS2之间的时刻

防止:因为波特率产生误差 会做自我调节(偏移Tq达到准确)

当时序提前一个SS ,PBS2会调整-1个Tq 当时序滞后一个SS PBS1会调整+1个Tq

注意:

      CAN通信需要双发约定好PTS PBS1 PBS2的Tq

 

 

CAN报文

数据结构图

遥控(请求)帧

 

 

### 关于STM32F429 CAN总线的使用教程与示例代码 #### STM32F429 CAN总线简介 CAN(Controller Area Network)是一种用于实时应用的串行通信协议,在汽车工业和其他领域广泛应用。STM32F4系列微控制器内置了多个CAN接口,支持标准和扩展帧格式的数据传输。 对于STM32F429而言,其具备强大的处理能力和丰富的外设资源,非常适合用来实现复杂的嵌入式系统设计中的节点间通讯功能[^1]。 #### 实际运用程序参考代码案例及其要点解读 ##### 案例一:基本发送接收消息 此例子展示了如何初始化CAN模块并设置过滤器来匹配特定ID的消息。通过该实例可了解基础收发机制以及错误检测方法。 ```c // 初始化CAN滤波器以便只接受指定ID的信息 void MX_CAN_Init(void){ hcan.Instance = CAN1; hcan.Init.Prescaler = 8; // 设置波特率预分频值 hcan.Init.Mode = CAN_MODE_NORMAL; hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; hcan.Init.TimeSeg1 = CAN_BS1_13TQ; hcan.Init.TimeSeg2 = CAN_BS2_2TQ; if (HAL_CAN_Init(&hcan) != HAL_OK){ Error_Handler(); } /* 配置过滤器 */ CanFilterConfig.FilterBank = 0; CanFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; CanFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; CanFilterConfig.FilterIdHigh = 0x0000; CanFilterConfig.FilterIdLow = 0x0000; CanFilterConfig.FilterMaskIdHigh = 0x0000; CanFilterConfig.FilterMaskIdLow = 0x0000; CanFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; CanFilterConfig.FilterActivation = ENABLE; if(HAL_CAN_ConfigFilter(&hcan, &CanFilterConfig)!= HAL_OK){ Error_Handler(); } } ``` ##### 案例二:循环冗余校验(CRC)验证 本段代码实现了利用CRC算法对接收到的数据包进行完整性检验的功能。这对于提高数据交换过程的安全性和可靠性至关重要。 ```c uint8_t Check_CRC(uint8_t *data,uint8_t length,uint16_t crc){ uint16_t i,j,tmpcrc=0xFFFF; for(i=0;i<length;i++){ tmpcrc ^= data[i]; for(j=0;j<8;j++){ if(tmpcrc&0x0001){ tmpcrc>>=1; tmpcrc^=0xA001; }else{ tmpcrc>>=1; } } } return ((tmpcrc==crc)?TRUE:FALSE); } if(!Check_CRC(rxData,RX_DATA_LENGTH,received_crc)){ // CRC check failed handle error here... } ``` ##### 案例三:多主机模式下的优先级仲裁 当存在多个设备尝试同时访问共享介质时,则需采用某种形式的竞争解决策略——即所谓的“仲裁”。下面这段源码片段演示了一个简单的基于标识符高低位比较的方法来进行冲突消解的过程。 ```c while(1){ if(/*条件满足*/ && !bTransmitting){ // 当前无其他任务正在执行且允许发送新请求 bTransmitting = TRUE; // 构造报文结构体 TxHeader.StdId = MY_NODE_ID << 5 | MSG_PRIORITY_LEVEL; ... // 尝试发起一次新的传输操作 if(HAL_CAN_AddTxMessage(&hcan,&TxHeader,TxMailbox,(uint8_t*)&txMsg,DLC)==HAL_OK){ // 成功加入队列等待发送完成中断通知 }else{/*失败后的重试逻辑*/} } } ``` 以上就是针对STM32F429上运行MicroPython环境并通过CAN总线与其他节点交互的一些典型应用场景及其实现方式概述[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值