月报最近学习了STM32的CAN总线协议,使用的是野火的开发板

CAN 是Controller Area Network 的缩写(CAN BUS),具有布线简单、典型的总线型结构、可最大限度的节约布线与维护成本、稳定可靠、实时、抗干扰能力强、传输距离远等特点,是一种成功的总线。不仅在汽车行业得到推广与应用,在航天、电力、石化、冶金、纺织、造纸等领域也得到广泛应用。在自动化仪表、工业生产现场、数控机床等系统中也越来越多的使用了CAN总线。
CAN总线采用差分信号传输,通常情况下只需要两根信号线(CAN-H和CAN-L)就可以进行正常的通信。在干扰比较强的场合,还需要用到屏蔽地即CAN-G(主要功能是屏蔽干扰信号),CAN协议推荐用户使用屏蔽双绞线作为CAN总线的传输线。在隐性状态下,CAN-H与CAN-L的输入差分电压为0V(最大不超过0.5V),共模输入电压为2.5V。在显性状态下,CAN-H与CAN-L的输入差分电压为2V(最小不小于0.9V)………
反正就是一堆看着非常让人懵逼的协议啊之类咱们现在暂时就先不去折腾了,遵照基本的电气使用规范来应用即可,这里重点就是说下用stm32f1系列单片机来实现CAN总线通信的基本软件配置。
单片机基本的通信配置好之后,这种通信方式还是非常实用高效的,主要是通信稳定可靠,传输距离远。使用的前提是单片机要带硬件CAN功能,协议还是蛮复杂的,所以需要处理器自带CAN协议功能模块,使用前对相关参数进行配置,如通信速率、数据格式等,再搭配好外围电路,如TJA1050CAN转换器之后,(根据实际的总线网络配好总线的阻抗(也就是总线两端的匹配电阻),避免反射造成通信混乱,硬件部分后面再做补充),就可以接入网络进行通信,CAN通信没有主机从机之分。说的再直白一点,CAN中实际参与通信的只有两条线,CAN_H和CAN_L,他们是差分信号传输,不能和串行口混为一谈,不是一个概念,STM32的CAN只是实现了协议控制器功能,接口还不能直接接入总线,需要一个转换器来实现与总线的物理连接,单片机需要通过CAN转换器,才能接入CAN网络实现双向数据交互,CAN转换器非常多,如TJA1050之类,反正,接入CAN需要两样东西,①单片机带CAN功能 ②CAN转换器,集齐这两样装备后,就可以吃ji了。
//——————————————————————————————————
以上非常非常简单的对一些概念脑补之后,开始详细的软件配置,我们的最终目标是两个甚至多个设备,通过CAN进行通信,交换数据,从而实现多点联机操作。
基本步骤如下(寄存器操作):
1.配置通信端口与CAN基本寄存器配置
2.配置接收中断
3.数据发送处理
4.中断数据接收处理
本次配置的单片机型号是STM32F103VCT6(LQFP100,256K FLASH,48K RAM)
//—————————————————————————————————-
1.配置通信端口与CAN基本寄存器配置(CAN_TX PA12 (71pin) CAN_RX_PA11(70pin))
返回值:初始化状态
参数列表:
//tsjw:重新同步跳跃时间单元.范围:1~3;
//tbs2:时间段2的时间单元.范围:1~8;
//tbs1:时间段1的时间单元.范围:1~16;
//brp :波特率分频器.范围:11024;(实际要加1,也就是11024) tq=(brp)*tpclk1
//注意以上参数任何一个都不能设为0,否则会乱.
//波特率=Fpclk1/((tbs1+tbs2+1)*brp);
//Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_init(1,4,7,6);
//则波特率为:36M/((4+7+1)*6)= 0.5M(500K)
//返回值:0,初始化OK;
CAN总线的通信协议大概就是流程

野火开发板提供的代码如下
void RCC_Config(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE) RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE) }void GPIO_for_can_and_uart_Config(void){ /定义一个GPIO_InitTypeDef类型的结构体/ GPIO_InitTypeDef GPIO_InitStructure; /设置can的RX–pa.11引脚/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); /设置can的TX–pa.12引脚/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /设置usart1 的RX 脚 -PA.10为父浮空输入脚/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); } void Can_Config(void){ CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; CAN_DeInit(CAN1); CAN_StructInit(&CAN_InitStructure); CAN_InitStructure.CAN_TTCM=DISABLE; CAN_InitStructure.CAN_ABOM=DISABLE; CAN_InitStructure.CAN_AWUM=DISABLE; CAN_InitStructure.CAN_NART=DISABLE; CAN_InitStructure.CAN_RFIM=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE; CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=5; CAN_Init(CAN1,&CAN_InitStructure); CAN_FilterInitStructure.CAN_FilterNumber=0; CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh=0x00AA<<3; CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x00FF<<3; CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); } void main(void){ u8 TransmitMailbox=0; CanTxMsg TxMessage; CanRxMsg RxMessage; RCC_Config(); GPIO_for_can_and_uart_Config(); USART_Config(); Can_Config(); TxMessage.ExtId=0x00aa0000; TxMessage.RTR=CAN_RTR_Data; TxMessage.IDE=CAN_ID_EXT; TxMessage.DLC=8; TxMessage.Data[0]=0x00; TxMessage.Data[1]=0x12; TxMessage.Data[2]=0x34; TxMessage.Data[3]=0x56; TxMessage.Data[4]=0x78; TxMessage.Data[5]=0xab; TxMessage.Data[6]=0xcd; TxMessage.Data[7]=0xef; TransmitMailbox=CAN_Transmit(CAN1,&TxMessage); while((CAN_TransmitStatus(CAN1,TransmitMailbox))!=CANTXOK); printf("\r\nThe CAN has send data :0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,\r\n", TxMessage.Data[0],TxMessage.Data[1],TxMessage.Data[2],TxMessage.Data[3], TxMessage.Data[4],TxMessage.Data[5],TxMessage.Data[6],TxMessage.Data[7],); while((CAN_MessagePending(CAN1,CAN_FIFO0)==0)); RxMessage.StdId=0x00; RxMessage.IDE=CAN_ID_EXT; RxMessage.DLC=0; RxMessage.Data[0]=0x00; RxMessage.Data[1]=0x12; RxMessage.Data[2]=0x34; RxMessage.Data[3]=0x56; RxMessage.Data[4]=0x78; RxMessage.Data[5]=0xab; RxMessage.Data[6]=0xcd; RxMessage.Data[7]=0xef; CAN_Receive(CAN1,CAN_FIFO0,&RxMessage); printf("\r\nThe CAN has received data :0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,\r\n", RxMessage.Data[0],RxMessage.Data[1],RxMessage.Data[2],RxMessage.Data[3], RxMessage.Data[4],RxMessage.Data[5],RxMessage.Data[6],RxMessage.Data[7],); while(1); }

STM32CAN总线协议讲解相关推荐

  1. SCCB总线协议的详细讲解与程序实现

    一.SCCB简介 SCCB(Serial Camera Control Bus)是OmniVision公司公布的串行相机总线协议.OV开头的相机模块例如OV7670都使用SCCB协议.鉴于它与I2C协 ...

  2. 一文搞懂CAN FD总线协议帧格式

    目录 1.为什么会出现CAN FD? 2.什么是CAN FD? 3.CAN FD和CAN总线协议帧异同 4.解析CAN FD帧结构 4.1.帧起始 4.2.仲裁段 4.3.控制段 4.4.数据段 4. ...

  3. 三种串行总线协议的区别(SPI、I2C和UART)

    SPI.I2C跟UART三种串行总线协议的区别: (如果想了解SPI和I2C更多详细内容,可看 SPI总线(一):基本原理篇, SPI总线(二):驱动分析篇,SPI总线(三):驱动实例,i2c总线(基 ...

  4. STM32-CAN总线

    STM32-CAN总线 简介: CAN 是控制器局域网络(Controller Area Network, CAN)的简称, 是由以 研发和生产汽车电子产品著称的德国 BOSCH 公司开发的, 并最终 ...

  5. SPI、UART、RS232、RS485、IIC 5种嵌入式经典通信总线协议

    文章目录 一.UART 1.通信基础--并行和串行 并行通信 串行通信 2.通信基础--单工和双工 3.通信基础--比特率 4.通讯基础--异步和同步 5.UART硬件连接 6.UART控制器 串口控 ...

  6. DeviceNet现场总线协议讲解

    DeviceNet现场总线协议讲解 2008-2-28 10:27:00 来源:作者: 网友评论 0条 点击查看 <script src="http://www.ca800.com/a ...

  7. i2c hid 触摸板不能用_I2C 总线协议初探 - STM32 I2C 接口外设学习笔记

    I2C(Inter-Integrated Circuit)总线是由 PHILIPS(飞利浦) 公司开发的两线式串行总线,用于连接微控制器及其外围设备.是微电子通信控制领域广泛采用的一种总线标准.它是同 ...

  8. [I2C]I2C总线协议图解

    转自:http://blog.csdn.net/w89436838/article/details/38660631 1  I2C总线物理拓扑结构       I2C 总线在物理连接上非常简单,分别由 ...

  9. linux 外部协议请求,ARM架构和总线协议如何支持Linux原子操作?

    这篇文章探讨ARM架构和总线协议如何来支持的.对于某款ARM处理器和总线CCI,CCN和CMN产品的具体实现,属于实现层面的微架构,一般需要NDA,这里不予讨论. 顺便提一下,在ARMv8 架构下对应 ...

  10. AXI4总线协议的发展历史

    随着集成电路芯片的规模越来越大,IC的设计开始越来越复杂.基于IP核复用的设计方法因为能有效的降低复杂度,提高设计成功率,目前已成为主流的IC设计方法.而如何解决一个芯片内不同IP核间的通信问题是总体 ...

最新文章

  1. [Bzoj2282]消防(二分答案+树的直径)
  2. JavaScript判断是否是手机mobile登录
  3. 如何编辑Subversion中已提交的日志消息?
  4. linux 移动目录树到子目录中,Linux系统管理员工具包: 移动Linux/UNIX目录
  5. python pdb_python pdb调试方法分享
  6. c:forEach循环的List为String时的写法
  7. 茅塞顿开:Spring Aware原理解析
  8. python如何控制浏览器_控制使用Python浏览器?
  9. 在腾讯云轻量云服务器上搭建mysql数据库
  10. 我一直以为做知识付费的老师是非常赚钱的
  11. Unity3d Vector3
  12. Windows线程生灭 (二)
  13. Atitit  undac网络设备管理法案 (路由器 交换机等)    法案编号USRr101510
  14. objective-c中@autoreleasepool的用法
  15. BooKu手机电子书阅读器,正式推出了
  16. ALDS1_7_C:Tree Walk
  17. alpha在matlab中啥意思,alpha是什么
  18. 《从菜鸟到大师》Python工程师之 Python语言基础 00
  19. 几款JVM图形化监控工具
  20. 解决Vagrant启动虚拟机内存爆满

热门文章

  1. 如何发布谷歌离线地图
  2. ScienceWord控件问题以及IE8对于base64编码图片长度限制的解决方案
  3. Sonix SN9P701 OCR点读笔二维码识别源码
  4. 微软账号登陆不上_微软待办(todo)如何跟Outlook任务同步?
  5. 寻找春天 九宫格日记-2012.09.22
  6. 无积分怎么下载百度文库的文档
  7. 电脑检测工具eve_EVEREST中文版下载
  8. Generative Face Completion
  9. Beego项目打包部署到Linux服务器
  10. 深入贯彻落实 Activity 的四种启动模式