2024年2月7日发(作者:)

广州致远电子有限公司

工业通讯-CAN bus通信产品

第3章 CAN控制器驱动

1.1 SJA1000初始化

1.1.1 初始化流程

SJA10000在上电复位后处于复位模式,要使SJA1000能正常收发CAN帧数据,必须对SJA1000进行初始化,SJA1000初始化流程详见图3.1。

1. 进入复位模式

SJA1000的配置寄存器只有在复位模式下才能访问,所以必须首先置位模式寄存器的0位,以进入复位模式。

2. 设置模式寄存器

图3.1 SJA1000初始化流程图

模式寄存器用于设置SJA1000工作模式,定义详见表3.1。

表3.1 SJA1000模式寄存器定义

MOD

寄存器0

Bit7

-

Bit6

-

Bit5

-

Bit4

SM

Bit3

AFM

Bit2

STM

Bit1

LOM

Bit0

RM

RM:复位模式位,置位该位将使SJA1000进入复位模式,清零该位则退出复位模式返回工作模式。

LOM:只听模式位,设置该位后,SJA1000处于只听模式。只听模式只从CAN总线接收数据,不能向总线上发送数据也不会产生错误帧。

只听模式常用于自动波特率检测功能,例如在软件里预先定义一个包含所有可能的位频率以及它们的位时序参数的表格,使能SJA1000接收和错误中断,依次尝试表格中的位时序参数,如果在CAN总线上产生了错误,软件转向下一个位时序参数,在一条信息的成功地接收后,表明软件已经检测到正确的位时序参数。

STM:只检测模式位,设置该位后,SJA1000在发送CAN帧时不检查应答位,可以实现单个CAN节点的发送功能。

AFM:验收滤波器模式,设置该位时使用单滤波功能;清零该位时使用双滤波功能。

SM:睡眠模式位,设置该位时,SJA1000进入睡眠模式,降低功耗。

3. 设置时钟分频寄存器

时钟分频寄存器用于选择BasicCAN模式还是PeliCAN模式、CLKOUT管脚控制、CAN输入比较器控制,寄存器的位定义详见表3.2。

表3.2 SJA1000时钟分频寄存器定义

MOD Bit7 Bit6

CBP

Bit5

-

Bit4

RXINTEN

Bit3

关闭时钟

Bit2

CD.2

Bit1

CD.1

Bit0

CD.0 寄存器31 CAN模式

4. 设置CAN波特率

波特率是异步串行通信中的重要参数,指每秒钟能发送的数据位元数量,只有相同波特率文库资料 ©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.

文章源自广州致远电子有限公司,转载或引用请注明出处

1

广州致远电子有限公司

工业通讯-CAN bus通信产品

的设备才能互相通信,CAN-bus使用异步串行通信技术,同样需要遵守该规则。

如图3.2所示,一个完整的CAN位时间由同步段(SYNCSEG)、位定时段1(TSEG1)和位定时段2(TSEG2)三部分组成,其中SYNCSEG固定为1个CAN时钟单元;TSEG1和TSEG2包含若干个CAN时钟单元(通过总线定时器1(BTR1)寄存器设置),CAN时钟由晶振时钟分频产生,其分频系数由总线定时器0(BTR0)寄存器设置。

图3.2 波特率配置示意图

SJA1000通过总线定时器0(BTR0)和总线定时器1(BTR1)寄存器设置CAN波特率,参照图3.2的对应关系,SJA1000的CAN波特率计算规则如下:

CAN波特率 = CAN时钟/每1位元占用的系统时钟数

CAN时钟 = fosc/(2×(BRP+1))

每1位元占用的系统时钟数= Sync+(TSEG1+1)+(TSEG2+1)=TSEG1+TSEG2+3

在CAN数据流中并没有单独的时钟信号,为了使数据可以被正确译码,CAN总线规范规定通过同步来消除因节点时钟误差造成的相位积累误差。同步采用数据位的跳变来实现(可参看1.5.4 小节同步与填充位),但是同步的范围是有限制的,具体是使用SJW来调整TSEG1和TSEG2。所以CAN位元时钟实际上一个范围,CAN波特率也是一个范围值,处于同一个波特率范围内的CAN节点都能正常通信。

位元时钟数范围=(标准值+SJW)~(标准值-SJW)

波特率标准 = fosc/(2×(BRP+1)×(TSEG1+TSEG2+3))

表3.3 常用CAN速率设置值

CAN速率

1Mbps

800Kbps

500Kbps

250Kbps

125Kbps

100Kbps

50Kbps

20Kbps

10Kbps

5Kbps

BTR0

0x00

0x00

0x00

0x01

0x03

0x04

0x09

0x18

0x31

0xBF

BTR1

0x14

0x16

0x1C

0x1C

0x1C

0x1C

0x1C

0x1C

0x1C

0xFF

波特率最大 = fosc/(2×(BRP+1)×文库资料 ©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.

文章源自广州致远电子有限公司,转载或引用请注明出处

2

广州致远电子有限公司

工业通讯-CAN bus通信产品

(TSEG1+TSEG2+3-SJW))

波特率最小 = fosc/(2×(BRP+1)×(TSEG1+TSEG2+3+SJW))

在SJA1000晶振为16MHz时,常用的CAN速率对应的BTR0和BTR1值详见表3.3。

5. 设置输出模式

定义CAN总线输出管脚TX0和TX1的输出模式:正常输出模式、时钟输出模式、双相输出模式或测试输出模式。

定义TX0和TX1输出管脚配置:悬空、下拉、上拉或推挽以及极性。

6. 退出复位模式

通过将模式寄存器的0位清零,SJA1000退出复位模式,在经过128个连续11位隐性位后,进入正常工作模式。

1.1.2 SJA1000初始化函数

CAN控制器在启动时主控制器必须先对其进行初始化配置才能使其正常的工作,这些配置主要包括输出管脚选择、滤波参数设置、工作模式配置以及通信波特率设定等,系统的初始化应在复位模式下进行,配置完成后必须退出复位模式CAN控制器才能正常工作。CAN控制器SJA1000的初始化代码如程序清单3.1所示,这段程序应在初始化CAN控制器时调用。

程序清单3.1 SJA1000初始化

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

// 验收滤波器的参数,接收所有帧

unsigned char SJA1000_CAN_Filter[8] = {

};

/******************************************************************************************** 函数名称: SJA1000_Init

** 函数功能: CAN控制器初始化函数

** 输入参数: btr0 :总线定时寄存器0

** btr1 :总线定时寄存器1

** filter :滤波器设置指针

** 输出参数:无

** 返 回 值:无

******************************************************************************************/

void SJA1000_Init(unsigned char btr0,unsigned char btr1,unsigned char *filter)

{

}

SetBitMask (REG_CAN_MOD, RM_RR_BIT);

WriteSJAReg(REG_CAN_CDR, 0xC8);

WriteSJAReg(REG_CAN_MOD, 0x09);

WriteSJAReg(REG_CAN_BTR0, btr0);

WriteSJAReg(REG_CAN_BTR1, btr1);

WriteSJAReg(REG_CAN_OCR, 0x1A);

// 进入复位模式

// 配置时钟分频寄存器,选择PeliCAN模式

// 配置模式寄存器, 选择单滤波、正常模式

// 配置总线定时器0

// 配置总线定时器1

// 配置输出管脚为TX0与RX0,推挽输出

0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff

WriteSJARegBlock(REG_CAN_ACR0, filter, 8); // 配置验收代码/屏蔽寄存器

ClearBitMask(REG_CAN_MOD, RM_RR_BIT); // 退出复位模式,进入工作模式

文库资料 ©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.

文章源自广州致远电子有限公司,转载或引用请注明出处

3