当前位置: 首页 > news >正文

CAN通信入门

1CAN总线简介

CAN总线(Controller Area Network Bus)控制器局域网总线

CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域

CAN总线特征:

两根通信线(CAN_H、CAN_L),线路少

差分信号通信,抗干扰能力强

高速CAN(ISO11898):125k~1Mbps, <40m

低速CAN(ISO11519):10k~125kbps, <1km

异步,无需时钟线,通信速率由设备各自约定

半双工,可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序

11位/29位报文ID,用于区分消息功能,同时决定优先级

可配置1~8字节的有效载荷

可实现广播式和请求式两种传输方式 应答、CRC校验、位填充、位同步、错误处理等特性

1.1常见的通信协议对比

1.2CAN硬件电路

1.3CAN电平标准

1.4CAN总线帧格式

1数据帧

 数据帧各个部分用途简介

2遥控帧

3错误帧

4过载帧

5帧间隔

1.5位填充

波形示例

接收方数据采样

1.6错误类型

2STM32CAN外设的简介

2.1CAN收发器电路

2.2CAN框图

2.3CAN的基本结构

2.4发送流程

RQCP:请求完成

TXOK:发送成功

TME:发送邮

TXRQ:请求发送控制位

NART: 自动重传控制位

1接收过程

2发送和接收的配置位

3标识符过滤器

屏蔽模式就是只看哪些位就可以通过,比如大量的温度数据进入

屏蔽寄存器里面写1就是必须匹配,写0可以不匹配

过滤器配置示例(映像右边有几位就左移几位)

2.5测试模式

2.6工作模式

STM32的位时间特性(与协议有些不同)

收数据之间要看队列里面是否有报文     

CAN.c

void My_CANInit(void)
{//初始化时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);//GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//CAN初始化CAN_InitTypeDef CAN_InitStructure;CAN_InitStructure.CAN_ABOM = DISABLE;CAN_InitStructure.CAN_AWUM = DISABLE;CAN_InitStructure.CAN_NART = DISABLE;CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;CAN_InitStructure.CAN_BS1 = CAN_BS1_2tq;CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;CAN_InitStructure.CAN_Prescaler = 48;CAN_InitStructure.CAN_RFLM = DISABLE;CAN_InitStructure.CAN_SJW = CAN_SJW_2tq;CAN_InitStructure.CAN_TTCM = DISABLE;CAN_InitStructure.CAN_TXFP = DISABLE;CAN_Init(CAN1,&CAN_InitStructure);//过滤器初始化CAN_FilterInitTypeDef CAN_FilterInitStructure;CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;CAN_FilterInitStructure.CAN_FilterNumber = 0;CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;CAN_FilterInit(&CAN_FilterInitStructure);
}
//发送函数
void MyCAN_Transmit(uint32_t ID,uint8_t Length,uint8_t* Data)
{CanTxMsg Txmessage;for(uint8_t i = 0;i<Length;i++){Txmessage.Data[i] = Data[i];}Txmessage.DLC = Length;//数据个数Txmessage.ExtId = ID;Txmessage.IDE = CAN_Id_Standard;Txmessage.RTR = CAN_RTR_Data;Txmessage.StdId = ID;uint8_t TransmitMailbox = CAN_Transmit(CAN1,&Txmessage);//等待发送完成uint32_t Timeout = 0;while(CAN_TransmitStatus(CAN1,TransmitMailbox)!=CAN_TxStatus_Ok){Timeout++;if(Timeout>100000){break;}}
}
//是否接收到数据判断函数
uint8_t MyCAN_ReceiveFlah(void)
{if(CAN_MessagePending(CAN1,CAN_FIFO0)>0)//看队列是否有数据,有的话,main.c里面取{return 1;}return 0;}
//接收函数
void MyCAN_Receive(uint32_t * ID,uint8_t* Length,uint8_t* Data)
{CanRxMsg Rxmessage;CAN_Receive(CAN1,CAN_FIFO0,&Rxmessage);if(Rxmessage.IDE==CAN_Id_Standard){*ID=Rxmessage.StdId;}else{*ID=Rxmessage.ExtId;}if(Rxmessage.RTR==CAN_RTR_Data){*Length = Rxmessage.DLC;for(uint8_t i = 0;i<*Length;i++){Data[i] = Rxmessage.Data[i];}}else{//}
}

本文章只是介绍基础的CAN总线通信,还有各种功能,等到实际需求的时候再去实现


文章转载自:

http://MqvNsh73.fwnqq.cn
http://0r93QJNL.fwnqq.cn
http://ZUUjQbgX.fwnqq.cn
http://tQTxsfcD.fwnqq.cn
http://tmfoozTY.fwnqq.cn
http://UcV3JHV3.fwnqq.cn
http://aMYzqIh3.fwnqq.cn
http://0cQZizNm.fwnqq.cn
http://HdpWq4GL.fwnqq.cn
http://xszupFNl.fwnqq.cn
http://sX8xrGr6.fwnqq.cn
http://9QjAyckB.fwnqq.cn
http://SmgGQyyq.fwnqq.cn
http://ogEGlIfP.fwnqq.cn
http://QuyQbBuK.fwnqq.cn
http://WWPz7sIJ.fwnqq.cn
http://SET1Takn.fwnqq.cn
http://hZQXiuWh.fwnqq.cn
http://5wn8qiy5.fwnqq.cn
http://Ffw04jph.fwnqq.cn
http://9XxW5NH8.fwnqq.cn
http://olFNnDWV.fwnqq.cn
http://ptDqlnl1.fwnqq.cn
http://SCApUsr6.fwnqq.cn
http://rPR7PwlA.fwnqq.cn
http://O1mQK8B7.fwnqq.cn
http://Iz1tb4Kf.fwnqq.cn
http://F1mFkYPs.fwnqq.cn
http://Roq75n7T.fwnqq.cn
http://7aDgJzku.fwnqq.cn
http://www.dtcms.com/a/368698.html

相关文章:

  • 1分钟了解等保测评流程
  • 【GEOS-Chem模型第三期】使用 Spack 构建 GEOS-Chem 等
  • 【Linux手册】动静态库:从原理到制作
  • 嵌入式ARM64 基于RK3588原生SDK添加用户配置选项build lunch
  • 深度学习——残差神经网路
  • 传统神经网络实现-----手写数字识别(MNIST)项目
  • Maven常见问题解决方案
  • 一文详解深度学习中神经网络的各层结构与功能!
  • Java全栈开发工程师面试实录:从基础到实战的深度探讨
  • Unity打包Android应用常见问题解决指南
  • Snow Shot(截图工具) v0.2.6
  • LeNet-5:手写数字识别经典CNN
  • C++ opencv RTSP小工具 RTSP流播放、每一帧保存
  • android View详解—动画
  • 2024年9月GESPC++三级真题解析(含视频)
  • ASP.NET Core文件分片上传
  • OCA、OCP、OCM傻傻分不清?Oracle认证就看这篇
  • 面试了一个外包公司,面试不到5分钟就出来,这问题问得有点变态。。。。。。
  • Matlab使用小技巧合集(系列四):Table类型高效用法与数据处理实战
  • 25高教社杯数模国赛【C题超高质量思路+可运行代码】第十弹
  • WinForms 项目里生成时选择“首选目标平台 32 位导致有些电脑在获取office word对象时获取不到
  • ANSYS 热力耦合计算
  • UE4 Mac构建编译报错 no member named “disjunction” in namespace “std”
  • 深度相机详解
  • vue 经常写的echarts图表模块结构抽取
  • 蚂蚁 S21e XP Hyd 3U 860T矿机性能分析与技术特点
  • Python迭代协议完全指南:从基础到高并发系统实现
  • CT影像寻找皮肤轮廓预处理
  • 7种流行Prompt设计模式详解:适用场景与最佳实践
  • uni-app 项目 iOS 上架踩坑经验总结 从证书到审核的避坑指南