双CAN通讯模板
本文中CAN1采用16位掩码,CAN2只能使用大于等于14的筛选器组,根据手册只能使用32位的掩码(因为大于14的筛选器没有说明)。
经测试,STM32手册中的筛选器配置图错误,库函数的命名正确。参考STM32手册中的CAN过滤器16位标识符屏蔽配置错误说明 - smilingfrog - 博客园 (cnblogs.com)。
另外,2个掩码条件满足任意一个即可被读取。
CanTxMsg CAN1_Message;
CanTxMsg CAN2_Message;
CanRxMsg CAN1_RecData;
CanRxMsg CAN2_RecData;
void MyCAN_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//----------DATA Init----------
CAN1_Message.StdId = 0xAA;
CAN1_Message.IDE = 0;
CAN1_Message.RTR = 0;
CAN2_Message.StdId = 0xBB;
CAN2_Message.IDE = 0;
CAN2_Message.RTR = 0;
//----------GPIO Init----------
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
//CAN1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource11, GPIO_AF_CAN1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource12, GPIO_AF_CAN1);
//CAN2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_6;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource5 , GPIO_AF_CAN2);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource6 , GPIO_AF_CAN2);
//----------CAN Init----------
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = ENABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW = MyCAN_SJW;
CAN_InitStructure.CAN_BS1 = MyCAN_BS1;
CAN_InitStructure.CAN_BS2 = MyCAN_BS2;
CAN_InitStructure.CAN_Prescaler = MyCAN_PRE;
CAN_Init(CAN1, &CAN_InitStructure);
CAN_Init(CAN2, &CAN_InitStructure);
//----------Filter Init----------
//CAN1
CAN_FilterInitStructure.CAN_FilterNumber = 6;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;
CAN_FilterInitStructure.CAN_FilterIdLow = 0xAA << 5;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0xAA << 5;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFE0;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFE0;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
//CAN2
CAN_FilterInitStructure.CAN_FilterNumber = 14;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
//----------NVIC Init----------
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//CAN1
NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
NVIC_Init(&NVIC_InitStructure);
//CAN2
NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
NVIC_Init(&NVIC_InitStructure);
//----------ENABLE----------
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);
CAN_ITConfig(CAN2,CAN_IT_FMP0, ENABLE);
}
void CAN1_SendData(uchar* Str, uchar Len)
{
CAN1_Message.DLC = Len;
for(uchar i = 0; i < Len; i ++)
{
CAN1_Message.Data[i] = Str[i];
}
uchar MailBox = CAN_Transmit(CAN1, &CAN1_Message);
while(CAN_TransmitStatus(CAN1, MailBox) == CAN_TxStatus_Failed);
}
void CAN2_SendData(uchar* Str, uchar Len)
{
CAN2_Message.DLC = Len;
for(uchar i = 0; i < Len; i ++)
{
CAN2_Message.Data[i] = Str[i];
}
uchar MailBox = CAN_Transmit(CAN2, &CAN2_Message);
while(CAN_TransmitStatus(CAN2, MailBox) == CAN_TxStatus_Failed);
}
void CAN1_RX0_IRQHandler(void)
{
CAN_Receive(CAN1, 0, &CAN1_RecData);
}
void CAN2_RX0_IRQHandler(void)
{
CAN_Receive(CAN2, 0, &CAN2_RecData);
}
双CAN通讯模板的更多相关文章
- 高性能双端js模板
高性能双端js模板(新增filter)---simplite simplite是一款js实现的模板引擎,它能够完成浏览器端js模版和node服务器端js模板的数据渲染. 渲染性能十分突出. 支持浏览器 ...
- TCP建立与断开连接、socket通讯模板
在传输层,有一个重点是TCP传输时建立连接的三次"握手"和四次"挥手",因为socket工作于应用层和传输层之间,故而涉及到建立连接和关闭连接的过程,以下笔记可 ...
- python网络编程:TCP通讯模板、粘包及解决方案、自定义报头
一.TCP通讯模板 二.远程CMD程序 三.解决粘包问题 四.解决粘包问题2 一.TCP通讯模板 TCP客户端 import socket c = socket.socket() # 连接服务器 c. ...
- Tarjan算法求解无向连通图的割点、割边、点双连通分量和边双连通分量的模板
历时好几天,终于完工了! 支持无向图四种功能:1.割点的求解 2.割边的求解 3.点双连通分量的求解 4.边双连通分量的求解 全部支持重边!!!!全部支持重边!!!!全部支持重边!!!! 测试数据: ...
- python网络编程:socket半连接池、UDP通讯模板
一.TCP半连接池原理 二.UDP通讯 三.UDP聊天 四.UDP聊天2 五.UDP会粘包吗 六.UDP总结 七.UDP与TCP对比 一.TCP半连接池原理 客户端 import socket cli ...
- 高性能双端js模板---simplite
simplite是一款js实现的模板引擎,它能够完成浏览器端js模版和node服务器端js模板的数据渲染,渲染性能达到引擎的极限. 渲染性能十分突出. 支持浏览器端和node服务器端模板渲染. 它简单 ...
- hdu 3352 求边双联通分量模板题(容器)
/*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树 找叶子节点的个数*/ #include<stdio.h> #include<string.h ...
- poj 1523 SPF(双连通分量割点模板)
题目链接:http://poj.org/problem?id=1523 题意:给出无向图的若干条边,求割点以及各个删掉其中一个割点后将图分为几块. 题目分析:割点用tarjan算法求出来,对于每个割点 ...
- (转载)GDI+双缓冲
双缓冲在GDI+里可以有效的提高描画效率.改善显示的质量. 下面的代码是一个最简单的双缓冲的模板.可以根据需要,做简单的修改即可. Bitmap CacheImage( [Width], [Heigh ...
- Node.js模板引擎的深入探讨
每次当我想用 node.js 来写一个 web 相关项目的时候.我总是会陷入无比的纠结.原因是 JavaScript 生态圈里的模板引擎实在太多了,但那么多却实在找不出一个接近完美的,所谓完美的概念就 ...
随机推荐
- WebGPU 01之Hello Triangle
1. 引言 WebGPU是什么? WebGPU 到底是什么? - Orillusion的回答 - 知乎 WebGPU与WebGL的对比? WebGL 与 WebGPU 比对 前奏 - 四季留歌 - 博 ...
- 【Linux SPI】RFID RC522 设备驱动
一.概述 MFRC522 支持 SPI.I2C.UART 接口,我在某宝上购买了一个 SPI 接口的 RC522 模块.此笔记主要要是通过 RC522 模块学习 linux 中的 SPI 驱动,方便今 ...
- linux常用操作指令记录
https://maker.pro/linux/tutorial/basic-linux-commands-for-beginners ## 打开终端 ## **Ctrl+Alt+T** ## ls ...
- Android 数据回显
public class EchoDataUtils { /** * 保存文件到手机内存 * @param context * @param number * @param psw * @return ...
- 不可忽略的.gitignore_global
会不会很奇怪,本地的代码运行没有问题,以为自己提交到远程仓库了 但是别人下载下来却没有,有没有可能是你根本没提交上去,对了,你真的有可能没提交上去 你本地这个文件是灰色的,确实没有提交上去,但是项目中 ...
- 打卡ts day01 数据类型,类
一,环境 1 新增的数据类型和部分语法,没有办法在浏览器和node 中执行,需要安装typescript 环境 安装:npm i -g typescript 成功:tsc -v 2 在浏览器中使用ts ...
- class和struct区别
类(class) 引用类型:将一个对象赋值给另一个对象时,系统不会对此对象进行拷贝,而会将指向这个对象的指针赋值给另一个对象,当修改其中一个对象的值时,另一个对象的值会随之改变. 结构体(struct ...
- 肖sir ___性能测试____多线程
一.理论 (一) (1)多线程是Python程序中实现多任务的一种方式(2)线程是程序执行的最小单位. (3)同属一个进程的多个线程共享进程所拥有的全部资源. (二)进程和线程对比 (1)关系对比: ...
- 通过pxelinux引导管理器网络引导slax linux
前提条件 1.用于引导服务器具备tftp服务和http服务: 2.使用syslinux项目下lpxelinux.0做为pxe引导文件,原因:测试发现lpxelinux.0对http协议支持更好,可以更 ...
- OpenStack 卷虚拟机跨租户迁移方案
目标:迁移租户A的卷虚机到租户B 场景:使用卷虚拟机,租户a和b使用相同网络 租户A的操作: 1.记录虚拟机的ip地址,Mac信息, nova interface-list neutron port- ...