CAN通信(STM32)
1.CAN是控制器局域网络(Controller Area Network, CAN)的简称
(理论知识不做讲解了,太多了)
2.芯片选用:TJA1050

差分信号输入,
这里的显性电平CANH和CANL压差是2V左右,逻辑上表示“0”
两线之间没有压差CANH和CANL都是2.5V左右,表示逻辑“1”
(二)实现代码
1.
/* 配置CAN模块*/
CAN_Config();
void CAN_Config(void)
{
①CAN_GPIO_Config(); //此处用PB8/PB9
CAN_NVIC_Config();
CAN_Mode_Config();
CAN_Filter_Config();
}
②对于CAN_NVIC_Config();
看下CAN 的中断分类

static void CAN_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/*中断设置*/
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; //CAN1 RX0中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
③CAN_Mode_Config(); //CAN不像I2C那样有片选,他背身有许多协议,也要进行选择,所以对应代码的结构体也多(集体可看CAN手册)
④CAN_Filter_Config(); 过滤器程序
看下CAN的主要框图(M3里面的CAN)

M3里面有三个发送邮箱,把要发送的数据打包成报文,然后把它发送到CAN网络总线上;
接收器 先经过滤器,M3里面有14个过滤器,过滤的时候是根据报文的ID来过滤的,ID相同的话,才能过去(相当于一个闸门)
接收到数据后(这里有两个FIFO ,0、1 ),我们的实验用的是 放到FIFO 的Mailbox 0;
代码写法根基三部分:
1.Tx Mailboxes 2.Acceptance Filters 3.Receive FIFO

STM32 的 ID 过滤方式有两种,一种为标识符列表模式,它把要接收报文
的 ID 列成一个表,要求报文 ID 与列表中的某一个标识符完全相同才可以接
收,可以理解为白名单管理。(说白了就是有一个标志位相同,然后就联通了)
另一种称为标识符屏蔽模式,它把可接收报文 ID 的某几位作为列表,这几
位被称为屏蔽位,可以把它理解成关键字搜索,只要屏蔽位(关键字)相同,就
符合要求。即这种模式只要求报文 ID 的屏蔽位与列表中标识符相应屏蔽位相
同 ,报文就被保存到接收 FIFO。(标志位的某几位检验,相同的话就通过了)
2.什么叫做报文(就是帧)
在原始数据段的前面加上传输起始标签、片选(识别)标签、控制标签,在
数据的尾段加上 CRC 校验标签、应答标签和传输结束标签。把这些内容按特定
的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签就如同
SPI 中各种通道上的信号,起到了协同传输的作用。当整个数据包被传输到其
它设备时,只要这些设备按格式去解读,就能还原出原始数据。类似这样的数
据包就被称为 CAN的数据帧。

看下数据帧

扩展与标准 仲裁段不一样,扩展11+18 = 29位
仲裁段:告诉是发还是收(几个同时通信的时候,那那根的信号,拉低了就是谁的了)如:

总电平接收了节点2的^_^(can的神奇之处)
CRC:发送与接收的对应
IDE:用于区分标准帧与扩展帧
r0、r1 都是显性位
3.CAN通信报文内容设置
void CAN_SetMsg(void)
4.发送消息,“ABCD”
CAN_Transmit(CAN1, &TxMessage);
总体流程图(例程对应):

while( flag == 0xff ); //flag =0 ,success ,此时产生一个中断(CAN中断)
对于从机的CAN_Config(); 是一模一样
不一样的是从机先上电
中断函数时一样的
CAN线接的时候 CANH接CANH, CANL接CANL, 不能对接
CAN通信(STM32)的更多相关文章
- STM32硬件IIC驱动设计(转)
源: STM32硬件IIC驱动设计 参考: STM32—硬件IIC主机通信 STM32’s I2C 硬件BUG引发的血案(qzm) 解决STM32 I2C接口死锁在BUSY状态的方法讨论
- FPGA作为从机与STM32进行SPI协议通信---Verilog实现 [转]
一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...
- (三)stm32之串口通信DMA传输完成中断
一.DMA功能简介 首先唠叨一下DMA的基本概念,DMA的出现大大减轻了CPU的工作量.在硬件系统中,主要由CPU(内核).外设.内存(SRAM).总线等结构组成,数据经常要在内存和外设之间,外设和外 ...
- STM32 USB-HID通信移植步骤
大家可以使用压缩包中的UsbApp.exe调试本软件idVendor为:0483 idProduct为5750. 今天太晚了,明天还要上半天班,上位机软件找个时间在写一篇文章.请关注我的博客.压缩包 ...
- FreeModbus 移植于STM32 实现Modbus RTU通信
http://ntn314.blog.163.com/blog/static/161743584201233084434579/ 毕业设计自己要做个基于STM32的PLC能直接跑语句表的,现在看来好像 ...
- 树莓派使用modbus与stm32通信
树莓派+stm32开发板通信树莓派上使用java+jamod实现.jamod官网stm32使用freemodbus实现
- STM32学习笔记:【004】USART串口通信
版本:STM32F429 Hal库v1.10 串口通信能够实现两块电路之间不同的通信,在开发中作为打印调试也是一门利器(printf重定向). 补充一点小知识: 1. weak修饰符修饰的函数,说明这 ...
- Stm32串口通信(USART)
Stm32串口通信(UART) 串口通信的分类 串口通信三种传递方式 串口通信的通信方式 串行通信的方式: 异步通信:它用一个起始位表示字符的开始,用停止位表示字符的结束.其每帧的格式如下: 在一帧格 ...
- 实现Python与STM32通信
断断续续学了几周Stm32后,突然想实现上位机和下位机的通信,恰好自己学过一点python,便想通过python实现通信. 在网上看见python库pyserial可以实现此功能,便去官网找了一下 , ...
- STM32 串口通信使用奇偶校验
STM32串口通信如果使用奇偶校验,需要设置数据位长度为9bit USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USAR ...
随机推荐
- pyAudio介绍
概要 pyaudio有这么几个功能: - 提取特征 - 训练并且使用分类器 - 语音分割功能 - 内容关系可视化 python实现,好处有这么几个 - 适合做计算分析类型操作(编码少,效率不低) - ...
- cordova-ios 升级到4.4.0 无法真机跑iOS8 报错: dyld`dyld_fatal_error: -> 0x120085088 <+0>: brk #0x3
项目进入测试阶段,马上要上线了,同事拿了自己的iOS8系统5s跑真机,无缘无故报错,之前跑她的手机完全没有问题的.Xcode 8.x中最低部署版本是iOS8.0,按理说完全能够跑真机的. 但是报了一个 ...
- kubernetes实战(十三):k8s使用helm持久化部署harbor集成openLDAP登录
1.基本概念 上节在k8s中部署了harbor和ldap,本节将部署harbor使用openLDAP验证,部署方式与之前相同,只是改了adminserver-cm.yaml的AUTH_MODE: &q ...
- 前端(以Vue为例)webpack打包后dist文件包如何部署到django后台中
由于现在前端使用的三大框架配合webpack可以实现快速打包,为部署到服务端提供了非常大的便利,那么在前端打包后,应该做些什么可以部署到django的后台中呢? 1.打包后文件包dist 进入到 di ...
- INT_MAX和INT_MIN注意事项
版权声明:转载请注明出处 http://blog.csdn.net/TwT520Ly https://blog.csdn.net/TwT520Ly/article/details/53038345 I ...
- col-md-1
.col-md-12 { width: 100%; } .col-md-11 { width: 91.66666666666666%; } .col-md-10 { widt ...
- 怎么申请 bing api key
1:打开网址 https://login.live.com/ 注册帐号并登录(点击上图中的登录按钮即可),在新窗口点击下方的“立即注册”(有帐号的可以直接登录) 2:填写相关信息(推荐使用hotmai ...
- TFS修改映射路径办法
如果你之前配置好了TFS项目的映射路径.然后每次下载项目都会在你配置的路径,但我们可以修改 方法一:我们可以在 "工作区" 中修改路径
- TCP状态转换图、滑动窗口、半连接状态、2MSL
一.TCP状态转换图 下图对排除和定位网络或系统故障时大有帮助,也帮助我们更好的编写Linux程序,对嵌入式开发也有指导意义. 先回顾一下TCP建立连接的三次握手过程,以及关闭连接的四次握手过程 ...
- 第七章之main函数和启动例程
main函数和启动例程 为什么汇编程序的入口是_start,而C程序的入口是main函数呢?本节就来解释这个问题.在讲例 18.1 “最简单的汇编程序”时,我们的汇编和链接步骤是: $ as hell ...