STM32——CAN通讯实现
CAN通讯的实现步骤:
1.CAN初始化,其中包括:a.配置CAN时钟,配置IO;
b.使能CAN中断向量;
c.CAN硬件寄存器配置初始化;
d.过滤器初始化;
e.打开CAN中断。
2.CAN发送函数
3.CAN接收函数
4.中断函数
依据上面的CAN通讯的实现步骤,开始编写代码,注意,我使用的是库函数。
一.CAN初始化
void CAN_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
//a.1.配置CAN时钟和对应的IO时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE); //使能CAN1的时钟,注意:CAN1是挂载在APB1上,不要用错函数!
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); //使能GPIO
//a.2.初始化CAN1_Tx(PA12)和CAN1_Rx(PA11)的IO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PA12 —>CAN1_Tx
GIOP_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA12
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PA11 -> CAN1_RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入,注意:Rx必须使用上拉输入模式
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA11
//b.使能中断向量
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; //我这使用的是CAN1的接收中断,实际上,CAN1还有发送中断:USB_HP_CAN1_TX_IRQn。注意,CAN1中断是和USB是共用的,所以如果你打开了CAN1中断,就不能再用USB中断了。
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ; //抢占优先级 = 0
NVIC_InitStructure.NVIC_IRQChannelPreemPreemptionPriority = ; //子优先级 = 3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//c.CAN硬件寄存器配置初始化
CAN_DeInit(CAN1);
CAN_InitStructure.CAN_TTCM = DISABLE;//失能时间触发通讯模式
CAN_InitStructure.CAN_ABOM = DISABLE;//失能自动离线管理模式
CAN_InitStructure.CAN_AWUM = DISABLE;//失能自动唤醒模式
CAN_InitStructure.CAN_NART = DISABLE;//失能非自动重传输模式
CAN_InitStructure.CAN_RFLM = DISABLE;//失能接收FIFO锁定模式
CAN_InitStructure.CAN_TXFP = DISABLE;//失能发送FIFO优先级
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;//CAN硬件工作在正常模式;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;//重新同步跳跃宽度1个时间单位;
CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;//时间段1为9个时间单位;
CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;//时间段2为8个时间单位;
CAN_InitStructure.CAN_Prescaler = ;//1个时间单位的长度为3
CAN_Init(CAN1&CAN_InitStructure);
//d.过滤器初始化
CAN_FIlterInitStructure.CAN_FilterNumber = ;//制订带初始化的过滤器为0
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;//标识符列表模式,该模式下屏蔽寄存器也被当作标识符寄存器使用,接收报文标识符的每一位都必须跟过滤器标识符相同
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;//32位过滤器
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;//过滤器标识符高段位:0x0000;
CAN_FilterInitStructure.CAN_FIlterIdLow = 0x0000;//过滤器标识符低段位:0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;//过滤器标识符高段位
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;//过滤器屏蔽标识符低段位
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;//使能过滤器
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIlterFIFO0;//指向过滤器的FIFO0;
CAN_FilterInit(&CAN_FilterInitStructe);
//e.打开CAN中断
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE)//FIFO0消息挂号中断屏蔽
}
二.CAN发送函数
void can_SendData(CanTxMsg* TxMessage)
{
unsigned char i = ;
unsigned char TransmitMailbox;
TransmitMailbox = CAN_Transmit(CAN1,TxMessage);//发送数据,返回邮箱号
while((CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK)&&(i != 0xff))
{//查看是否发送完成
i++;
}
i = ;
while((CAN_MessagePendding(CAN1,CAN_FIFO0)<)&&(i != 0xff))
{//查看被挂起的报文是否为0
i++;
}
}
三.接收数据
今天不想写。。。。迟点补上蛤~~~~
四.中断函数
CanRxMsg RxMessage;
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);//接收数据,存储到RxMessage中
。。。。。//自行脑补
}
因为我这篇文章是自己一个一个字敲进去的,可能会出现单词拼写错误~~~~~
欢迎指错蛤~~~~~~
STM32——CAN通讯实现的更多相关文章
- stm32串口通讯问题
stm32串口通讯问题 在串口试验中,串口通讯不正常,则可能会出现以下问题: 1. 配置完成后,串口没有任何消息打印. 原因:1,端口配置有问题,需要重新检查I/O口的配置 2,接线有问题,检查接线是 ...
- STM32应用实例十:简析STM32 I2C通讯死锁问题
I2C接口是一种使用非常普遍的MCU与外部设备的接口方式,在STM32中也集成了I2C接口,我们也常常使用它来与外围的传感器等设备通讯. 最近在我们使用STM32F1VET6读取压力和温湿度传感器数据 ...
- STM32—串口通讯详解
串口通讯目录 物理层 协议层 USART简介 开发板与上位机的连接 代码讲解: 一.初始化结构体 二.NVIC配置中断优先级 三.USART配置函数讲解 四.传输数据的函数: 1.发送一个字节 2.发 ...
- STM32 i2c通讯失败复位方法
最近在调研STM32 F10X,准备把公司AVR的MCU项目迁移到STM32上.在调研STM32 i2c这一部分时,在与i2c slave硬件连接断开后,这时再去读/写 i2c slave需要STM3 ...
- 基于STM32和W5500的Modbus TCP通讯
在最近的一个项目中需要实现Modbus TCP通讯,而选用的硬件平台则是STM32F103和W5500,软件平台则选用IAR EWAR6.4来实现. 1.移植千的准备工作 为了实现Modbus TCP ...
- STM32学习笔记(十) CAN通讯测试(环回模式)
1.CAN通讯的理解 想学习CAN通讯,那么要对通讯协议有一定的认知.通讯协议是指通信双方对数据传送控制的一种约定.约定中包括对数据格式,同步方式,传输速度,传送步骤,检纠错方式以及控制字符定义等问题 ...
- STM32学习笔记——SPI串行通讯(向原子哥学习)
一.SPI 简介 SPI是 Serial Peripheral interface 的缩写,就是串行外围设备接口.SPI 接口主要应用在 EEPROM, FLASH,实时时钟,AD 转换器,还有数 ...
- STM32菜鸟成长记录---RS485通讯协议的应用
写作原因:近来蛋闲?非也 ! 昨天一同事合作的项目代码出现的bug-----他的上位机每200ms给我发送命令向我这边下位机读取一些数据,在此过程会按下按键做一些另外操作并给他返回数据:(通信是通 ...
- STM32作为主设备,Arduino作为从设备进行IIC通讯的注意要点
近日公司的项目重心要往米思齐的Arduino图形化编程上转移了,需要我将STM32和Arduino的IIC通讯调通.之前Arduino并没怎么使用过,仅仅是将超声波的代码移植成TOF激光测距而已.网上 ...
随机推荐
- language model —— basic model 语言模型之基础模型
一.发展 起源:统计语言模型起源于 Ponte 和 Croft 在 1998年的 SIGIR上发表的论文 应用:语言模型的应用很多: corsslingual retrieval distribute ...
- 各种文件的mime类型
扩展名:abs MIME类型:audio/x-mpeg 扩展名:ai MIME类型:application/postscript 扩展名:aif MIME类型:audio/x-aiff 扩展名:aif ...
- Deep Learning 26:读论文“Maxout Networks”——ICML 2013
论文Maxout Networks实际上非常简单,只是发现一种新的激活函数(叫maxout)而已,跟relu有点类似,relu使用的max(x,0)是对每个通道的特征图的每一个单元执行的与0比较最大化 ...
- 弹层组件-layer
layer是Layui的一个弹层组建,功能强大,总之我很喜欢,下面介绍这个组件的基本用法. 首先如果只需要使用layer而不想使用Layui可以单独下载layer组件包,页面引入jquery1.8以上 ...
- [HTML/HTML5]3 页面结构
在HTML5之前,主要的容器元素是div元素,但在HTML5中提供了数种其它容器元素供我们使用. 因此,当组织Web页面结构时,首先使用HTML将内容分成多部分,然后在对其使用CSS应用样式和格式. ...
- WPF 数据绑定Binding
什么是数据绑定? Windows Presentation Foundation (WPF) 数据绑定为应用程序提供了一种简单而一致的方法来显示数据以及与数据交互. 通过数据绑定,您可以对两个不同对象 ...
- .net 项目 调用webservice 出错,异常信息:对操作“xxx”的回复消息正文进行反序列化时出错。解决方案。
项目运行好好的,增加并更新WebService后,出错,捕获异常信息为:对操作“xxx”的回复消息正文进行反序列化时出错.解决方案. 认真分析异常信息后,得到关键提醒: {"读取 XML 数 ...
- 《精通C#》十四章-.NET程序集入门
在书中,这一章节的开头说的是自定义命名空间和使用命名空间,在以我目前有限的经验来说,程序集就是一个类库经过编译之后,所生成的一个在引用命名空间,进而使用该文件中已经定义好的字段,属性以及方法的文件,以 ...
- TcpListener 类
构造函数 名称 说明 TcpListener(IPAddress, Int32) 新实例初始化 TcpListener 类用于侦听传入的连接尝试在指定的本地 IP 地址和端口号. TcpL ...
- smartform
SMARTFORMS中一般对于固定样式,格式的某一块会选择使用TEMPLATE或者TABLE. 表:上下高度不限,以窗口高度为限.循环输出表数据,每次循环都会按照表行输出,表头和表尾可控制输出.表行中 ...