STM32-CAN总线

简介: CAN 是控制器局域网络(Controller Area Network, CAN)的简称, 是由以
研发和生产汽车电子产品著称的德国 BOSCH 公司开发的, 并最终成为国际标准
(ISO 11898) , 是国际上应用最广泛的现场总线之一。 在北美和西欧, CAN 总
线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线, 并且
拥有以 CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。

框图

特点及其优越性

  1. 网络各节点之前的数据通信速率高, 实时性强
  2. 缩短了开发周期
  3. 已形成了国际标准的现场总线

特性
Can 总线有 2 根线, 是半双工通信(差分信号) , 异步(没有时钟线) 收发
数据需要既定的速率收发, 整个相同 LAN 按相同速率收发

隐形电平(1) : CAN_H = CAN_L
显性电平(0) : CAN_H - CAN_L ~=(约等于) |2.0|

单位: 以 Messages(报文) 为单位传输
报文由几种类型的帧组成: 数据帧, 远程帧, 错误帧, 过载帧, 间隔帧。

仲裁方式: 以消息内容 ID 为仲裁。 每个发送节点必须去采集, 如果发现采
集到的数据与自己发送的不同, 就 Loser, 就变成接收者。

ISO11898 及ISO11519 标准化

数据帧

1. 帧起始:1 个位的显性电平表示,标准帧和扩展帧相同
2. 仲裁段:表示数据优先级的段,标准帧和扩展帧格式在本段有所区

3. 控制段:控制段由 6 个位构成,表示数据段的字节数。标准帧和扩展帧的控
制段稍有不同

4. 数据段:该段可包含 0~8 个字节的数据。从MSB(最高位)开始输
出,标准帧和扩展帧此段相同。

5. CRC段:该段用于检查帧传输错误。由 15 个位的 CRC 顺序和 1
个位的 CRC 界定符(用于分隔的位)构成,标准帧和扩展帧此段也是相
同的。

6. ACK段:此段用来确认是否正常接收。由 ACK 槽(ACK Slot)和 ACK
界定符 2 个位构成。标准帧和扩展帧此段也是相同的。

7. 帧结束:它表示该帧的结束的段,由 7 个位的隐性位构成。标准帧
和扩展帧此帧是相同的。

CAN仲裁:
在总线空闲态,最先开始发送消息的单元获得发送权。当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。

位时序,波特率

code:

//CAN初始化
//tsjw:重新同步跳跃时间单元.范围:CAN_SJW_1tq~ CAN_SJW_4tq
//tbs2:时间段2的时间单元.   范围:CAN_BS2_1tq~CAN_BS2_8tq;
//tbs1:时间段1的时间单元.   范围:CAN_BS1_1tq ~CAN_BS1_16tq
//brp :波特率分频器.范围:1~1024; tq=(brp)*tpclk1
//波特率=Fpclk1/((tbs1+1+tbs2+1+1)*brp);
//mode:CAN_Mode_Normal,普通模式;CAN_Mode_LoopBack,回环模式;
//Fpclk1的时钟在初始化的时候设置为42M,如果设置CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_LoopBack);
//则波特率为:42M/((6+7+1)*6)=500Kbps
void CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{GPIO_InitTypeDef GPIO_InitStructure;CAN_InitTypeDef        CAN_InitStructure;CAN_FilterInitTypeDef  CAN_FilterInitStructure;//使能相关时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能PORTA时钟                                                                RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟 //引脚复用映射配置GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1); //GPIOA11复用为CAN1GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1); //GPIOA12复用为CAN1//初始化GPIOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA11,PA12//CAN单元设置CAN_InitStructure.CAN_TTCM=DISABLE;  //非时间触发通信模式   CAN_InitStructure.CAN_ABOM=DISABLE;  //软件自动离线管理    CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)CAN_InitStructure.CAN_NART=ENABLE; //使用报文自动传送 CAN_InitStructure.CAN_RFLM=DISABLE; //报文不锁定,新的覆盖旧的  CAN_InitStructure.CAN_TXFP=DISABLE;    //优先级由报文标识符决定 CAN_InitStructure.CAN_Mode= mode;     //模式设置 CAN_InitStructure.CAN_SJW=tsjw;    //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tqCAN_InitStructure.CAN_BS1=tbs1; //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tqCAN_InitStructure.CAN_BS2=tbs2;//Tbs2范围CAN_BS2_1tq ~    CAN_BS2_8tqCAN_InitStructure.CAN_Prescaler=brp;  //分频系数(Fdiv)为brp+1   CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1//配置过滤器CAN_FilterInitStructure.CAN_FilterNumber=0;   //过滤器0CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位 CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;32位IDCAN_FilterInitStructure.CAN_FilterIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASKCAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化}//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)
//len:数据长度(最大为8)
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
//       其他,失败;
u8 CAN1_Send_Msg(u8* msg,u8 len)
{   u8 mbox;u16 i=0;CanTxMsg TxMessage;TxMessage.StdId=0x12;   // 标准标识符为0TxMessage.ExtId=0x12;    // 设置扩展标示符(29位)TxMessage.IDE=0;       // 使用扩展标识符TxMessage.RTR=0;         // 消息类型为数据帧,一帧8位TxMessage.DLC=len;                             // 发送两帧信息for(i=0;i<len;i++)TxMessage.Data[i]=msg[i];                 // 第一帧信息          mbox= CAN_Transmit(CAN1, &TxMessage);   i=0;while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //等待发送结束if(i>=0XFFF)return 1;return 0;
}//can口接收数据查询
//buf:数据缓存区;
//返回值:0,无数据被收到;
//       其他,接收的数据长度;
u8 CAN1_Receive_Msg(u8 *buf)
{                  u32 i;CanRxMsg RxMessage;if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;       //没有接收到数据,直接退出 CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据  for(i=0;i<RxMessage.DLC;i++)buf[i]=RxMessage.Data[i];  return RxMessage.DLC;
}int main()
{   u8 i=0,j=0;u8 key;u8 mode=0;u8 res;u8 tbuf[8];u8 rbuf[8];SysTick_Init(168);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组LED_Init();USART1_Init(115200);KEY_Init();CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_Normal);//500Kbps波特率while(1){key=KEY_Scan(0);if(key==KEY_UP_PRESS)  //模式切换{mode=!mode;CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,mode);if(mode==0){printf("Normal Mode\r\n");}else{printf("LoopBack Mode\r\n");}}if(key==KEY1_PRESS)  //发送数据{for(j=0;j<8;j++){tbuf[j]=j;}res=CAN1_Send_Msg(tbuf,8);if(res){printf("Send Failed!\r\n");}else{printf("发送数据:");for(j=0;j<8;j++){printf("%X  ",tbuf[j]);}printf("\r\n");}}res=CAN1_Receive_Msg(rbuf);if(res){   printf("接收数据:");for(j=0;j<8;j++){printf("%X  ",rbuf[j]);}printf("\r\n");}i++;if(i%20==0){LED1=!LED1;}delay_ms(10);}
}

STM32-CAN总线相关推荐

  1. STM32 CAN总线通信学习笔记(一)

    STM32 CAN总线通信学习笔记(一) 一.CAN总线简介 CAN 是控制器局域网络(Controller Area Network, CAN)的简称.CAN采用数据块编码的方式,数据块根据帧的类型 ...

  2. 使用STM32Cube MX为STM32 CAN总线快速配置上手教程_HAL库_CAN协议_STM32_附波特率计算工具

    使用STM32Cube MX为STM32 CAN总线快速上手教程_HAL库_CAN协议_STM32 前言 博主也是刚接触CAN协议的新手,如有不对的地方欢迎交流 本文旨在使用STM32Cube MX快 ...

  3. STM32 CAN总线冲突故障的分析和解决

    现场的STM32 CAN总线设置一共有3个:A.B.C.其中A是发送命令者,C是执行命令者,B是分析命令者.A发送命令,C执行命令后输出信号,B通过分析命令的内容切换继电器通道.以上就是设计初衷. 实 ...

  4. STM32的总线AMBA、AHB、APB

    一.总线的简单介绍: 处理器无疑是计算机中最重要的部件,但并不是唯一的部件.一台计算机也需要随机访问存储器(RAM)来存放机器码指令以便让处理器执行.计算机还必须有一些方法使这些指令进入RAM(输入设 ...

  5. STM32 CAN总线故障检测功能的使用

    STM32 中的CAN总线模块是具有故障监测功能的 就是CANx_SCE_IRQHandler 这个用的很少,它叫CAN总线状态改变中断 通过打开这个中断,配合代码可以精确的监测CAN总线的故障情况 ...

  6. STM32/CPU总线的由来和地址映射概念

    目录 1.总线的由来 2.STM32/CPU地址映射 3.STM32的外设地址映射表 很多人对总线和地址映射的概念都是一头雾水,但是我们如果知道为何需要总线和地址映射,他们是在什么背景下被衍化出来的, ...

  7. STM32 CAN总线工作原理

    CAN总线工作原理 CAN是什么? CAN是Controller Area Network的缩写(以下称为CAN),是ISO*1国际标准化的串行通信协议. 在当前的汽车产业中,出于对安全性.舒适性.方 ...

  8. ​​​​​​​简述STM32 CAN总线的设置

    简述CAN总线 最近公司开发CAN总线项目,以前也学习了,没有实际的用于项目制作,现在具体的总结一下,也是借鉴了很多大神的资料,站在巨人的肩膀之上写下来这篇文章 CAN 是 Controller Ar ...

  9. STM32——CAN总线通信

    1.CAN网上没有主机从机之分(当然你主观上可以分),任何节点都随时可以发送,碰撞检测由硬件完成,发生碰撞会自动重发: 2.接收端只要在过滤器中设置自己需要接收的帧ID就可以接收,收到后会自动发送应答 ...

  10. STM32 I2C总线从机发送接收源码下载,有图有真相!

    功能: 1.接收主机发送的数据并储存在内部缓冲区,然后通过串口打印输出: 2.主机读取数据时,将内部缓冲区中的数据返回: 3.发送接收都采用中断方式实现,经验证基本上没什么问题: 串口打印输出的数据: ...

最新文章

  1. synchronized与Lock的区别与使用
  2. 海康sdk返回yv12
  3. mysql 实务操作_mysql多表操作
  4. protobuf扫盲
  5. 初识Mysql(part17)--我需要知道的3条Mysql语句之联结
  6. Swift--基本数据类型(一)
  7. 百度研究院商业智能实验室招聘研究实习生!
  8. 对比学习视角:重新审视推荐系统的召回粗排模型
  9. 如何查看redis占用内存大小
  10. linux安装7z到指定目录,linux下安装7zip
  11. C#获取当前路径的七种方法
  12. 字节跳动“车轮”收割
  13. FMS4.5限制连接数
  14. ADL平台上传数据前的准备工作
  15. 软件开发工具——理论篇
  16. 51单片机c语言试题及答案,单片机C语言期末考试题..
  17. 完成领导交代的任务并及时反馈,才叫真的完成任务
  18. 表达式转换 (中缀转后缀表达式)
  19. python爬取《春风十里不如你》分析
  20. Jlink在ADS下的配置说明及常见问题解决办法 (转载)

热门文章

  1. *** was not found in ‘***‘
  2. Linux的cpufreq(动态变频)技术
  3. 安装micronet遇到的问题及解决
  4. 卡西欧电子表怎么调时间
  5. css 绘制 上,下,右,左箭头
  6. 计算机物理学论文300字,物理考试总结300字
  7. 数字地、模拟地、信号地、交流地、直流地、屏蔽地、浮地基本概念及PCB地线分割的方法
  8. Java 递归数组求和
  9. 10.Unity Zenject高级编程(使用工厂动态创建物体)
  10. 计算机键盘开锁,如何解锁电脑键盘上的某些按键