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 */
上一篇:STM32学习笔记(十) CAN通讯测试(环回模式)
下一篇:利用CAN中断进行简单的数据接收
推荐阅读
史海拾趣
为了保持在行业中的领先地位,功得公司不断加大技术研发投入。他们与多所高校和科研机构建立合作关系,共同开展前沿技术研究。在这些合作中,功得公司取得了一系列技术突破,推出了一系列具有行业领先水平的新产品。这些技术成果不仅提升了公司的核心竞争力,也为整个电子行业的发展做出了贡献。
在发展过程中,B&B公司注重与上下游企业的合作与共赢。公司与多家知名的芯片制造商、原材料供应商建立了长期稳定的合作关系,确保了产品的质量和供应链的稳定性。同时,公司也积极与集成商、解决方案提供商等合作伙伴开展深度合作,共同为客户提供更加完善的服务。
随着公司的不断发展,奥松电子陆续获得了多项荣誉资质,如“国家专精特新‘小巨人’企业”、“国家高新技术企业”等。这些荣誉的获得,不仅证明了公司在电子行业中的实力与地位,也为公司的品牌建设提供了有力的支撑。同时,这些荣誉也为公司的市场拓展和业务发展提供了更多的机遇和可能。
随着技术的不断进步,GTC意识到仅仅作为分销商已无法满足市场需求。于是,公司开始逐步涉足电子元器件的生产领域,专注于研发和生产具有自主知识产权的产品。通过持续的技术创新和研发投入,GTC成功推出了一系列高性能的晶体管、集成电路等新产品,进一步丰富了其产品线。这些产品不仅在国内市场受到好评,还逐渐走向国际市场。
为了进一步扩大市场份额和增强技术实力,DATASENSOR公司积极进行收购和扩张。2004年,公司成功收购INFRA和SPECIALVIDEO公司,这两家公司在工业自动化领域拥有丰富的经验和先进的技术,为DATASENSOR公司带来了更多的市场机会和技术优势。此外,公司还在法国、德国、英国和西班牙等国家和地区设立了子公司,实现了全球化的战略布局。
品质是企业的生命线。BusBoard公司深知这一点,因此从原材料采购到生产加工再到产品出厂,每一个环节都严格把控品质。公司建立了完善的品质管理体系,对每一道工序都进行严格的检验和测试。同时,公司还注重员工品质意识的培养和提升,确保每一个员工都能以高度的责任心对待自己的工作。这种对品质的执着追求使得BusBoard公司的产品在市场上赢得了良好的口碑。
;说明: ; 用于没有烧写ATmega16并行编程器的朋友,初用ATmega16的工程师在串行 ;编程时写错熔丝位,及加密位,造成不能再应用串行编程,构成不便,没并行 ;编程将无法再使用,做了一个简易的并行编程器(很简单,用万能板搭焊即可), ; ...… 查看全部问答∨ |
|
本书从应用的角度,详细地介绍了MCS-51单片机的硬件结构、指令系统、各种硬件接口设计、各种常用的数据运算和处理程序及接口驱动程序的设计以及MCS-51单片机应用系统的设计,并对MCS-51单片机应用系统设计中的抗干扰技术以及各种新器件也作了详细的 ...… 查看全部问答∨ |
|
对于锂电池的保护,其方案有很多种,IC芯片也有很多种,现在指针对一节锂电保护板设计介绍如下 一、电池保护板的原理 在锂离子电池使用过程中,为避免使用者的错误使用而造成电池升温,电池内电解液的分解而产生气体使其内压上升,金属锂等的释出而 ...… 查看全部问答∨ |
|
在网上找了下关于LCD3310和5110的资料不是很多。!! 阿莫这里还是有不少。呵呵。。 就想问问这两个区在引脚,驱动方面有什么区别吗? 如果能提供一些资料就在此谢过了。… 查看全部问答∨ |
AD初始化程序段: ADC12CTL0 = ADC12ON+MSC+SHT0_8; // Turn on ADC12, extend sampling time // to ××oid overflow of results ADC12CTL1 = SHP+CONSEQ_3; // Use samp ...… 查看全部问答∨ |
本帖最后由 paulhyde 于 2014-9-15 03:32 编辑 直入主题,不废话。 首先2013与2011年竞赛清单对比 2013年 1. 基本仪器清单60MHz双通道数字示波器100MHz双通道数字示波器低频信号发生器(1Hz~1MHz)标准高频信号发生器(1MHz~100MHz,可输出 ...… 查看全部问答∨ |