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通讯实现的更多相关文章

  1. stm32串口通讯问题

    stm32串口通讯问题 在串口试验中,串口通讯不正常,则可能会出现以下问题: 1. 配置完成后,串口没有任何消息打印. 原因:1,端口配置有问题,需要重新检查I/O口的配置 2,接线有问题,检查接线是 ...

  2. STM32应用实例十:简析STM32 I2C通讯死锁问题

    I2C接口是一种使用非常普遍的MCU与外部设备的接口方式,在STM32中也集成了I2C接口,我们也常常使用它来与外围的传感器等设备通讯. 最近在我们使用STM32F1VET6读取压力和温湿度传感器数据 ...

  3. STM32—串口通讯详解

    串口通讯目录 物理层 协议层 USART简介 开发板与上位机的连接 代码讲解: 一.初始化结构体 二.NVIC配置中断优先级 三.USART配置函数讲解 四.传输数据的函数: 1.发送一个字节 2.发 ...

  4. STM32 i2c通讯失败复位方法

    最近在调研STM32 F10X,准备把公司AVR的MCU项目迁移到STM32上.在调研STM32 i2c这一部分时,在与i2c slave硬件连接断开后,这时再去读/写 i2c slave需要STM3 ...

  5. 基于STM32和W5500的Modbus TCP通讯

    在最近的一个项目中需要实现Modbus TCP通讯,而选用的硬件平台则是STM32F103和W5500,软件平台则选用IAR EWAR6.4来实现. 1.移植千的准备工作 为了实现Modbus TCP ...

  6. STM32学习笔记(十) CAN通讯测试(环回模式)

    1.CAN通讯的理解 想学习CAN通讯,那么要对通讯协议有一定的认知.通讯协议是指通信双方对数据传送控制的一种约定.约定中包括对数据格式,同步方式,传输速度,传送步骤,检纠错方式以及控制字符定义等问题 ...

  7. STM32学习笔记——SPI串行通讯(向原子哥学习)

    一.SPI  简介 SPI是 Serial Peripheral interface 的缩写,就是串行外围设备接口.SPI 接口主要应用在  EEPROM, FLASH,实时时钟,AD 转换器,还有数 ...

  8. STM32菜鸟成长记录---RS485通讯协议的应用

    写作原因:近来蛋闲?非也  !  昨天一同事合作的项目代码出现的bug-----他的上位机每200ms给我发送命令向我这边下位机读取一些数据,在此过程会按下按键做一些另外操作并给他返回数据:(通信是通 ...

  9. STM32作为主设备,Arduino作为从设备进行IIC通讯的注意要点

    近日公司的项目重心要往米思齐的Arduino图形化编程上转移了,需要我将STM32和Arduino的IIC通讯调通.之前Arduino并没怎么使用过,仅仅是将超声波的代码移植成TOF激光测距而已.网上 ...

随机推荐

  1. iOS控制器之基类设计

    题记 在进入新公司后.经过这一个月的重构项目,终于把项目做到了个人相对满意的程度(还有一种不满意的叫老板的需求,提过多次意见也没用= =!).在这次重构中按照以前的思路设计出了个人觉得比较适用的一个基 ...

  2. Linq常用语法详细

    1.简单的linq语法 //1 var ss = from r in db.Am_recProScheme select r; //2 var ss1 = db.Am_recProScheme; // ...

  3. Java 执行系统命令

    在Java中执行系统命令,主要是使用ProcessBuilder和Runtime.getRuntime().exec().而在这里主要是介绍两种方法的使用. 使用情景是在linux系统中,使用menc ...

  4. [mobile开发碎碎念]手机页面上显示PDF文件

    demo:http://mozilla.github.io/pdf.js/web/viewer.html 项目地址:https://github.com/mozilla/pdf.js <scri ...

  5. Sql获取周、月、年的首尾时间。

    ,) -- 本周周一 ,,,)) -- 本周周末 ,) -- 本月月初 ,,,)) -- 本月月末 ,,) -- 上月月初 ,,)) -- 上月月末 ,) -- 本年年初 ,,,)) -- 本年年末 ...

  6. 根据条件动态拼接LinQ的where条件字串

    var items1 = from c in customer == ? c.FirstName == == ? c.LastName == "BBB" : true) selec ...

  7. folder、source folder、package 区别与联系

    在eclipse下,package,source folder,folder都是文件夹.  它们的区别如下:  package:当你在建立一个package时,它自动建立到source folder下 ...

  8. 常见的JavaScript函数

    JavaScript函数一共可分为5类:常规函数.数组函数.日期函数.数学函数和字符串函数. (1)常规函数(9个) alert函数:显示一个警告对话框,包括一个“确定”按钮. confirm函数:显 ...

  9. 关于紫光a5扫描仪的安装

    同事需要扫描写东西,从别的机器上搬来紫光a5的扫描仪,不会安装,需要帮忙. 插上扫描仪,win7提示发现新硬件,开始自动安装驱动.等了一会儿,提示无法安装,看来得手工寻找驱动来安装了.上网搜索a5的驱 ...

  10. php 面试题收集-基础题

    1.表单中 get与post提交方法的区别?答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息. 2.session与cookie的区别?答:s ...