历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-09-30 来源:eefocus

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 */

推荐阅读

史海拾趣

Comus_International公司的发展小趣事

随着市场的不断变化和客户需求的日益多样化,Comus International并没有满足于现状。公司开始着手新产品的开发,不久便推出了金属汞开关,并最终成功研发了获得专利的无汞开关。这些创新产品不仅进一步巩固了公司在市场上的地位,也拓展了其业务范围,为公司的长远发展注入了新的活力。

Greenliant公司的发展小趣事

在光伏产业快速发展的背景下,GPS于2020年进军光伏逆变器市场。公司凭借其深厚的技术积累和创新能力,开发出了一系列高效、可靠的光伏逆变器产品。这些产品不仅转换效率高,而且具备智能监控和远程控制功能,大大提升了光伏电站的运行效率和安全性。GPS的光伏逆变器产品迅速获得市场认可,成为众多光伏项目的首选设备。

AIRPAX公司的发展小趣事

随着全球环保意识的提高,AIRPAX开始关注产品的环保性能。公司积极研发符合RoHS标准的产品,并致力于减少生产过程中的环境污染。同时,AIRPAX还推动了绿色供应链的建设,与供应商共同实现可持续发展。这些努力使得AIRPAX在电子行业中树立了绿色环保的良好形象。

台湾美丽微(FMS)公司的发展小趣事

近年来,FTDI通过战略并购进一步拓展了其业务领域。例如,电连技术通过发行股份及支付现金的方式收购了FTDI的控股权,这一举措不仅使电连技术在产品和客户层面实现了更完整的布局,也增强了其在汽车电子、物联网、工业产品、医疗设备等多个领域的市场竞争力。FTDI凭借其在USB桥接芯片领域的深厚积累和技术优势,为电连技术的业务扩展提供了有力支持,共同推动了公司在全球电子元件产业的持续发展。

Electronic Sensor + Resistor GmbH公司的发展小趣事

随着产品技术的不断成熟和市场份额的逐步扩大,ESR公司开始将目光投向国际市场。公司积极参加国际电子展会和技术交流活动,与全球各地的客户和合作伙伴建立了广泛的联系。

同时,ESR公司还根据不同国家和地区的市场需求和法规要求,对产品线进行了针对性的调整和优化。通过本地化的营销策略和服务体系,公司成功打开了多个海外市场的大门,并赢得了当地客户的信任和支持。

Elcoma公司的发展小趣事

随着全球对环保问题的日益关注,Elcoma公司也积极响应,将环保理念融入到企业的发展战略中。他们采用环保材料和工艺,减少生产过程中的污染排放,同时推出了一系列环保型电子产品,满足消费者对环保产品的需求。这种对环保的重视不仅提升了Elcoma的品牌形象,也为企业带来了可持续发展的动力。

问答坊 | AI 解惑

【MPS商城钜惠体验季】开箱

     快递到了,还挺快的,买了两个模块,包装很精美,像个工艺品,一睹为快                         …

查看全部问答>

PADS9.5入门学习资料

哪位有PADS9.5的学习资料,这个工具真心不理解,干各种事情用专门的软件,DxDesigner Symbol Editor这都找不到软件图标。哪位好心人给指点下。 …

查看全部问答>

FPGA 学习开发板

本帖最后由 Fred_1977 于 2022-12-20 16:09 编辑      说实在的,学FPGA的时候真的是爱好,因为我本身就是做硬件开发设计的; FPGA功能确认很强大,所以就想试着自已做一块开发板出来,如果买的话确实挺贵的,当然这不是主要原因 ...…

查看全部问答>

[ ST NUCLEO-U575ZI-Q 测评] HAL移植U8G2

原来在arduino上使用了u8g2.今天偿试用stm32cubeIde进行移植。 一、用stm32cubeIDE进行配置i2c:   这次用到的为PB8-SCL、PB9-SDA,在管脚上配置好: 保存生成工程文件。  二、下载u8g2源码:https://gitcode.net/mirrors ...…

查看全部问答>

GD32450i-EVAL开发板U盘例程存储从内部sram改为外部flash芯片不成功的问题

项目开发中需要存图片到外部flash中,使用GD32450i-EVAL开发板U盘例程,修改存储空间从内部sram改为外部flash芯片,只改了STORAGE_Init、STORAGE_Read、STORAGE_Write三个函数,还有扇区大小和数量。修改后枚举可以成功,格式化也提示成功,但不可 ...…

查看全部问答>

DLC升压电路分析与计算

  鄙人近期遇到几个问题,感觉超出了本人的能力范围,无奈只能寄希望于请教一下论坛的大神了,哎!怪自己学艺不精呐,在此留下了无能的眼泪 如图,从上电之初开始分析,(设上电前C1C2电压为0,L1电流为0,忽略D1D2的正向压降和内阻) ...…

查看全部问答>

红外体温计标定方法是怎么样的?

红外体温计标定方法是怎么样的?   用体温计去测试黑体炉温度?黑体炉设置不同的温度,体温计测试后再比对黑体炉显示的温度?如果有偏差就修正,找出对应的函数关系? 红外体温计标定的流程  说能123说说  另外 ...…

查看全部问答>

开关电源管理芯片反推

本帖最后由 supertanglang 于 2022-12-20 22:22 编辑 各位大师,本人小白,手里有块电源板(接类似吸尘器的东西,满载功率大概260W左右,2路输出),大概逆了下原理图,但是电源管理芯片上没有丝印信息,所以确定不了型号。各位大师是否能够根据 ...…

查看全部问答>

【Sipeed 博流BL808全能板】BL808最小系统验证

本帖最后由 单笑寒 于 2022-12-21 10:04 编辑 BL808最小系统验证       手册里说,BL808有3个RISC-V核:D0核(480MHz RV64)、M0核(320MHz RV32)、LP核(160MHz RV32),本次基于官方文档验证最小环境(基于Linux ...…

查看全部问答>

[ ST NUCLEO-U575ZI-Q 测评] STM32U5超低功耗高性能Cortex_M33MCU技术解析培训资料

今天找到了在ST中文网上的中文培训资料,很详细的PPT。这里分享给需要的人。 里面主要有: 1-市场部分 V1.3 2-硬件部分-v1.0 3-STM32U5对比STM32L5有哪些更新-v1.0 4-系统和架构-v1.0 5-DMA-v1.0 6-电源管理和低功耗-v1.0 ...…

查看全部问答>