历史上的今天

今天是:2024年09月30日(星期一)

正在发生

2019年09月30日 | stm32f103 学习笔记 —— 07 CAN通讯协议

发布者:美好未来 来源: eefocus关键字:stm32f103  CAN  通讯协议 手机看文章 扫描二维码
随时随地手机看文章

1.报文种类

数据帧 :用于节点向外传送数据


遥控帧 :用于向远端节点请求数据


错误帧 :用于向远端节点通知校验错误,请求重新发送上一个数据


过载帧 :用于通知远端节点本节点尚未做好接受准备


帧间隔 :用于将数据帧及遥控帧与前面的帧分离开来


2.报文结构(以数据帧为例)

以一个显性位(逻辑0)开始,以7个连续的隐性位(逻辑1)结束


帧起始(Start Of Frame):只有一个数据位(显性电平,逻辑0)


仲裁段 :决定发送优先级(通过“线与”的方式,即同时出现显性和隐形电平时总线状态被置为显性);CAN控制器根据ID过滤报文


远程传输请求位(Remote Transmission Request Bit):数据帧为显性,遥控帧为隐性


标识符扩展位(Identifier Extension Bit):显性表示标准格式,隐性表示扩展格式


SRR :只存在于扩展格式,它用于替代标准格式中的RTR位(由于扩展帧中的SRR位为隐性位,RTR在数据帧为显性位,所以在两  个ID相同的标准格式报文与扩展格式报文中,标准格式的优先级较高)


数据长度码(Data Length Code):由4个数据位组成,但只能表示0~8个字节,用于表示报文中的数据段包含多少个字节


CRC :为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码,一旦接收节点算出的CRC码跟接收到的CRC码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC部分的计算一般由CAN控制器硬件完成,出错时的处理则由软件控制最大重发数。在CRC校验码之后,有一个CRC界定符,它为隐性位,主要作用是把CRC校验码与后面的ACK段间隔起来。


ACK段 :包括一个ACK槽位,和ACK界定符位。在ACK槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在ACK槽和帧结束之间由ACK界定符间隔开。


帧结束(End Of Frame):7个连续的隐性位


3.CAN的相关配置

1.main.c


 

#include "stm32f10x.h"

#include "./usart/bsp_usart.h"

#include "./led/bsp_led.h"

#include "./can/bsp_can.h"

#include "./key/bsp_key.h"  

 

CanRxMsg  CAN_Rece_Data;

CanTxMsg  CAN_Tran_Data;

 

uint8_t flag = 0;

 

 

void Delay(__IO uint32_t nCount); 

 

 

int main(void)

{

CAN_Config() ;   

Key_GPIO_Config();

while(1)

{

if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON  )

{

uint8_t box;

CAN_Tran_Data.StdId = 0;

CAN_Tran_Data.ExtId = PASS_ID;

CAN_Tran_Data.RTR = CAN_RTR_Data;

CAN_Tran_Data.IDE = CAN_Id_Extended ;

CAN_Tran_Data.DLC = 1;

CAN_Tran_Data.Data[0] = 10;

box = CAN_Transmit(CAN1,&CAN_Tran_Data);

while(CAN_TransmitStatus(CAN1,box) == CAN_TxStatus_Failed);

}

if(flag == 1)

{

  flag = 0;

}

else

{

}

}

}

 

 

2.bsp_can.c


#include "./can/bsp_can.h"

 

//1.初始化CAN外设、波特率,位的组成

//2.配置筛选器,方便接收数据

//3.发送数据,并接收,使用回环模式测试

 

void CAN_GPIO_Config(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

/* 使能CAN时钟 */

RCC_APB1PeriphClockCmd (RCC_APB1Periph_CAN1 , ENABLE );

/* 使能CAN引脚相关的时钟 */

  RCC_APB2PeriphClockCmd ( CAN_GPIO_CLK|RCC_APB2Periph_AFIO, ENABLE );

//使用PA8 9引脚的第二功能

GPIO_PinRemapConfig (GPIO_Remap1_CAN1 ,ENABLE);

  /* 配置CAN的 引脚,普通IO即可 */

  GPIO_InitStructure.GPIO_Pin = CAN_TX_GPIO_PIN;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(CAN_TX_GPIO_PROT, &GPIO_InitStructure);

  /* 配置CAN的 引脚,普通IO即可 */

  GPIO_InitStructure.GPIO_Pin = CAN_RX_GPIO_PIN;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

  GPIO_Init(CAN_RX_GPIO_PORT, &GPIO_InitStructure);

}

 

 

void CAN_Mode_Config(void)

{

 

CAN_InitTypeDef CAN_InitTypeStruct;

CAN_InitTypeStruct.CAN_ABOM = ENABLE;//自动离线管理功能

CAN_InitTypeStruct.CAN_AWUM = ENABLE;//自动唤醒功能

CAN_InitTypeStruct.CAN_Mode = CAN_Mode_LoopBack;//CAN_Mode_Normal;//工作模式

CAN_InitTypeStruct.CAN_NART = ENABLE;//错误重传

CAN_InitTypeStruct.CAN_RFLM = ENABLE;//是否锁定FIFO

CAN_InitTypeStruct.CAN_TTCM = DISABLE;//是否使能时间触发功能

CAN_InitTypeStruct.CAN_TXFP = DISABLE; //按ID优先级发送

//配置成1Mbps

CAN_InitTypeStruct.CAN_BS1 = CAN_BS1_5tq;

CAN_InitTypeStruct.CAN_BS2 = CAN_BS2_3tq;

CAN_InitTypeStruct.CAN_SJW = CAN_SJW_2tq;

CAN_InitTypeStruct.CAN_Prescaler = 4;

CAN_Init(CAN1,&CAN_InitTypeStruct);

 

}

 

void CAN_Filter_Config(void)

{

CAN_FilterInitTypeDef CAN_FilterInitTypeStruct;

CAN_FilterInitTypeStruct.CAN_FilterActivation = ENABLE;

CAN_FilterInitTypeStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0  ;

CAN_FilterInitTypeStruct.CAN_FilterNumber = 0;//筛选器编号

CAN_FilterInitTypeStruct.CAN_FilterScale = CAN_FilterScale_32bit;//筛选器尺度

CAN_FilterInitTypeStruct.CAN_FilterMode = CAN_FilterMode_IdMask  ;//筛选器模式

CAN_FilterInitTypeStruct.CAN_FilterIdHigh = ((PASS_ID<<3 |CAN_Id_Extended |CAN_RTR_Data)&0xFFFF0000)>>16;

CAN_FilterInitTypeStruct.CAN_FilterIdLow = ((PASS_ID<<3 |CAN_Id_Extended |CAN_RTR_Data)&0xFFFF);

CAN_FilterInitTypeStruct.CAN_FilterMaskIdHigh = 0xFFFF;

CAN_FilterInitTypeStruct.CAN_FilterMaskIdLow =0xFFFF;

 

CAN_FilterInit(&CAN_FilterInitTypeStruct);

CAN_ITConfig (CAN1,CAN_IT_FMP0,ENABLE);

}

 

void CAN_NVIC_Config(void)

{

 

NVIC_InitTypeDef NVIC_InitStructure;

  

  /* 配置NVIC为优先级组1 */

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  

  NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;

  /* 配置抢占优先级 */

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

  /* 配置子优先级 */

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  /* 使能中断通道 */

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}

 

void CAN_Config(void)

{

CAN_GPIO_Config();

  CAN_Mode_Config();

CAN_Filter_Config();

CAN_NVIC_Config();

}

   

3.bsp_can.h


#ifndef __BSP_CAN_H

#define __BSP_CAN_H

 

#include "stm32f10x.h"

 

 

#define PASS_ID   ((uint32_t)0x1314)

 

 

#define CAN_TX_GPIO_PROT  GPIOB

#define CAN_TX_GPIO_PIN    GPIO_Pin_9

 

#define  CAN_RX_GPIO_PORT     GPIOB

#define  CAN_RX_GPIO_PIN      GPIO_Pin_8

 

#define CAN_GPIO_CLK RCC_APB2Periph_GPIOB

 

 

 

void CAN_Config(void) ;     

 

 

#endif /* __BSP_CAN_H */

关键字:stm32f103  CAN  通讯协议 引用地址:stm32f103 学习笔记 —— 07 CAN通讯协议

上一篇:STM32学习笔记(十) CAN通讯测试(环回模式)
下一篇:利用CAN中断进行简单的数据接收

推荐阅读

高性能模拟和混合信号半导体产品及先进算法领先供应商Semtech Corporation 日前发布了Semtech设计合作伙伴计划。该计划通过在商业客户、系统集成商和开发人员与了解LoRa® 器件及无线射频技术(LoRa技术)的设计服务公司之间建立联系,以缩短基于LoRa的物联网解决方案从规划到实际部署的时间。 Semtech设计合作伙伴计划的首次亮相便已获得了七家设计服...
(文章来源:中科罗伯特机器人学院) 对于普通人来说工业机器人在工作时一切都是“顺理成章的”,但其实工业机器人在工作时需要大量的系统同时进行协作,其中视觉系统对于很多的工业机器人人显得尤为重要,其中一个叫做,它往往被人们忽略了,但其实他的作用对于工业机器人来说和视觉系统一样重要,有时他的作用比视觉更加大。 早年的工业机器人并不...
据digitimes报道,美国商务部对华为最新禁令已于9月15日正式生效,不过现在又批准英特尔、AMD继续供货华为,美国此举看似是放宽了对华为的限制,不过有分析指出,实际上这是美国间接阻止华为自制芯片的策略。TechNode引述分析师意见指出,英特尔的主要产品包括SoC、CPU(中央处理器)和GPU(绘图处理器)等IC产品,既不授权专利也不提供芯片制造工具和设备...
20200831Add:TIM2,TIM3 configuration program.其中:f CK_CNT为定时器计数频率;f CK_PSC为系统的时钟频率;PSCR[15:0]为预分频值。Codes of configuration:

史海拾趣

问答坊 | AI 解惑

ATmega16(L)简易并行编程器

;说明: ; 用于没有烧写ATmega16并行编程器的朋友,初用ATmega16的工程师在串行 ;编程时写错熔丝位,及加密位,造成不能再应用串行编程,构成不便,没并行 ;编程将无法再使用,做了一个简易的并行编程器(很简单,用万能板搭焊即可), ; ...…

查看全部问答∨

FPGA设计中复位方式的选择

FPGA设计中有同步复位,有异步复位,两种复位方式各自有什么有缺点。欢迎大家各抒意见!…

查看全部问答∨

MCS-51 单片机应用设计 哈工大

本书从应用的角度,详细地介绍了MCS-51单片机的硬件结构、指令系统、各种硬件接口设计、各种常用的数据运算和处理程序及接口驱动程序的设计以及MCS-51单片机应用系统的设计,并对MCS-51单片机应用系统设计中的抗干扰技术以及各种新器件也作了详细的 ...…

查看全部问答∨

为什么在电路中很多“与非”门要取非,而不是直接用与门或者或门?

这个问题困扰我很久啦,明明直接就可以东西,为什么非要取非呢?…

查看全部问答∨

锂电池(一节)保护板设计附原理图

对于锂电池的保护,其方案有很多种,IC芯片也有很多种,现在指针对一节锂电保护板设计介绍如下 一、电池保护板的原理 在锂离子电池使用过程中,为避免使用者的错误使用而造成电池升温,电池内电解液的分解而产生气体使其内压上升,金属锂等的释出而 ...…

查看全部问答∨

想问下LCD3310和LCD5110的区别?

在网上找了下关于LCD3310和5110的资料不是很多。!!  阿莫这里还是有不少。呵呵。。  就想问问这两个区在引脚,驱动方面有什么区别吗? 如果能提供一些资料就在此谢过了。…

查看全部问答∨

msp430 AD问题求助!

AD初始化程序段: ADC12CTL0 = ADC12ON+MSC+SHT0_8; // Turn on ADC12, extend sampling time // to ××oid overflow of results ADC12CTL1 = SHP+CONSEQ_3; // Use samp ...…

查看全部问答∨

基于2812实现rs485和rs232的串口通信源程序(转载)

基于2812实现rs485和rs232的串口通信源程序…

查看全部问答∨

2013年清单分析 11楼做调过飞行器,值得借鉴

本帖最后由 paulhyde 于 2014-9-15 03:32 编辑 直入主题,不废话。 首先2013与2011年竞赛清单对比 2013年 1. 基本仪器清单60MHz双通道数字示波器100MHz双通道数字示波器低频信号发生器(1Hz~1MHz)标准高频信号发生器(1MHz~100MHz,可输出 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved