单片机CAN总线的设置与应用(CAN基础知识和以华芯微特SWM211C8T7为例)

单片机华芯微特CAN总线的设置与应用

以SWM211C8T7为例

CAN基础知识:

1.什么是CAN总线?

CAN是“Controller Area Network”的缩写,意思为“控制器局域网”,是一个ISO(国际标准化组织)串行通信协议。

2.CAN总线网略架构:

CAN总线的物理连接只需要两根线,常称为CAN_H和CAN_L,通过差分信号进行数据的传输。CAN总线有两种电平,分别为隐性电平和显性电平,而此两种电平有着类似漏极I/O电平信号之间“与”的关系:
(1)若隐性电平相遇,则总线表现为隐性电平;
(2)若显性电平相遇,则总线表现为显性电平;
(3)若隐性电平和显性电平相遇,则总线表现为显性电平。

一个典型的CAN总线网略结构,注意两端的终端电阻。

3.CAN总线的5种帧:

(1)数据帧:用于发送单元向接收单元传送数据的帧;
(2)过载帧:用于接收单元通知其尚未做好准备接收的帧;
(3)帧间隔:用于数据帧及遥控帧与前面的帧分离开来的帧;
(4)遥控帧:用于接收单元向具有相同ID的发送单元请求数据的帧;
(5)错误帧:用于当检测出错误时向其他单元通知错误的帧.

4.CAN总线的位时序:

由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段。
• 同步段(SS)
• 传播时间段(PTS)
• 相位缓冲段 1(PBS1)
• 相位缓冲段 2(PBS2)
这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成。
1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。
1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可
同时采样,也可任意设定采样点。
单片机CAN总线的设置与应用(CAN基础知识和以华芯微特SWM211C8T7为例)_第1张图片
同步段恒为1tq;位段1(PTS+PBS1)为2-16tq;位段2(PBS2)为1-8tq;补偿段(SJW)1-4tq;
单片机CAN总线的设置与应用(CAN基础知识和以华芯微特SWM211C8T7为例)_第2张图片
采样点应设占比70-85%;采样点占比计算公式:(同步端+位段1)/(同步端+位段1+位段2);一般设为占空比80%左右。

5.CAN总线波特率的计算:

以下为STM32计算方法(注:华芯微特计算波特率方法最后举例时计算)
SYNC_EC段 : 1tq
BS1段:
BS2段:
Tplck:CAN总线挂的时钟;
BRP:CAN总线外设时钟分频值;
1tq时间长度:BRP/Tplxk;
1位时间长度:T1bit=1tq+BS1+BS2;
波特率:1/T1bit;

6.华芯微特CAN配置:

以SWM211C8T7为例:库文件时钟均是以内部晶振12M起振到60M时钟(以后会分享华芯微特时钟有外部起振的配置);
void CAN_Configuration(void)
{
CAN_InitStructure CAN_initStruct; //声明
CAN_Close(CAN0); //关闭CAN0
CAN_initStruct.Mode = CAN_MODE_NORMAL; //常规模式
CAN_initStruct.CAN_bs1 = CAN_BS1_11tq; //
CAN_initStruct.CAN_bs2 = CAN_BS2_3tq; //
CAN_initStruct.CAN_sjw = CAN_SJW_2tq; //
CAN_initStruct.Baudrate = 40000; //波特率
CAN_initStruct.RXNotEmptyIEn = 1; //接收非空,有数据可读 使能
CAN_initStruct.ArbitrLostIEn = 0; //控制器丢失仲裁,变为接收方 失能
CAN_initStruct.ErrPassiveIEn = 0; //接受/发送错误计数值达到127 失能
CAN_Init(CAN0, &CAN_initStruct);

CAN_SetFilter32b(CAN0, CAN_FILTER_1, 0x01, 0x7FFFFFFF);		       //接收ID为0x00000001的扩展包

CAN_SetFilter32b(CAN0, CAN_FILTER_2, 0x02, 0x7FFFFFFF); //接收ID为0x00000002的扩展包
CAN_SetFilter32b(CAN0, CAN_FILTER_3, 0x00525060, 0x7FFFFFF0); //接收ID为0x00525060–0x0052506F的扩展包

NVIC_EnableIRQ(GPIOB2_GPIOA10_CAN0_IRQn); 
CAN_Open(CAN0);                                                  //启动CAN0	

}
以上是配置CAN总线波特率为40000;华芯微特波特率设置为反过来推算BRP,确保分频数为整数;
uint32_t brp = (SystemCoreClock/2)/2/initStruct->Baudrate/(1 + (initStruct->CAN_bs1 + 1) + (initStruct->CAN_bs2 + 1)) - 1;
如上面函数配置:brp=(60M/2)/2/40K/(1+(10+1)+(2+1))-1;
以上CAN 配置函数为扩展数据帧;滤波器设置规则举例说明:
CAN_SetFilter32b(CAN0, CAN_FILTER_3, 0x00525060, 0x7FFFFFF0); //接收ID为0x00525060–0x0052506F的扩展包
0x00525060&0x7FFFFFF0=(接收ID)&0x7FFFFFF0;
其他接收发送模式请看例程。
跪求做单片机有兴趣的一起交流。自知自己技术不行,想多学习,多讨论,有缘人可加我微信:15921588263

你可能感兴趣的:(单片机,嵌入式硬件,CAN,华芯微特)