1、15.4.2 控制寄存器 (1)MSCAN08模式控制寄存器0 (Module Control Register 0,CMCR0) 模式控制寄存器0(CMCR0)定义了MSCAN08模块的同步状态等有关工作方式。 地址:$0500 数据位 D7 D6 D5 D4 D3 D2 D1 D0 读 0 0 0 SYNCH TLNKEN SLPAK SLPRQ SFTRES 写 - - - - TLNKEN - SLPRQ
2、 SFTRES 复位 0 0 0 0 0 0 0 1 SYNCH — Synchronized Status:同步状态。SYNCH =1,MSCAN08与CAN总线同步;SYNCH =0,MSCAN08与CAN总线不同步。 TLNKEN — Timer Enable:时钟使能。TLNKEN =1,MSCAN08时钟信号输出连接到片上时钟输入;TLNKEN =0,MSCAN08不连接到时钟输入。 SLPAK — Sleep Mode Acknowledge:睡眠模式确认。SLPAK标志位指示MSCA
3、N08是否处于睡眠模式,SLPAK =1,表示MSCAN08处于内部睡眠模式;SLPAK =0,不在内部睡眠模式。 SFTRES — Soft Reset:软复位。SFTRES =1,MSCAN08处于软复位状态;SFTRES =0,MCAN08处于正常运行状态。当SFTRES被置为1时,MSCAN08立即进入软复位状态。此时,MSCAN08所有正在进行的收发操作都被中止,且不再与CAN总线保持同步。只有在软复位状态下,才能对寄存器MCR1、BTR0、BTR1、IDAC、IDAR0-IDAR3、IDMR0-IDMR3进行写操作。当该位清0时,MSCAN08将在11个隐性位后与总线保持同步。
4、 (2)MSCAN08模式控制寄存器1 (Module Control Register 1,CMCR1) 模式控制寄存器1定义了MSCAN08模块的时钟源、唤醒模式及工作方式。 地址:$0501 数据位 D7 D6 D5 D4 D3 D2 D1 D0 读 0 0 0 0 0 LOOPB WUPM CLKSRC 写 - - - - - LOOPB WUPM CLKSRC 复位
5、 0 0 0 0 0 0 0 0 LOOPB — Loop Back Self-Test Mode:回环自测模式位。LOOPB =1,激活回环自测模式;LOOPB =0,正常运行模式。当处于回环自测模式时,CANRX引脚被忽略,CANTX引脚输出隐性值,MSCAN08将自己发送的报文当成是从远程节点上发送过来的报文进行接收,并产生发送和接收中断。通过自测模式可以在不接任何外外围器件的基础上,测试MSCAN08工作是否正常。 WUPM — Wakeup Mode:唤醒模式位。该位定义是否启用内部低通滤波以
6、避免被错误唤醒。WUPM=1,只有当总线上显性电平至少保持了twup时间后MSCAN08才被唤醒;WUPM=0,总线上任何隐性变为显性的下降沿,MSCAN08被唤醒。 CLKSRC — Clock Source:时钟源选择位。CLKSRC=1,MSCAN08时钟源采用锁相环输出;CLKSRC=0,MSCAN08时钟源直接采用外部晶振的2分频(CGMXCLK/2)。 注:MCR1只能在软复位状态下才能被写入。 (3)MSCAN08总线定时寄存器0 (Bus Timing Register 0,CBTR0) 总线定时寄存器0和总线定时寄存器1共同决定了CAN总线通信波特率。其中,总线定时寄
7、存器0定义了MSCAN08的同步跳转宽度和预分频因子。 地址:$0502 数据位 D7 D6 D5 D4 D3 D2 D1 D0 读/写 SJW1 SJW0 BRP5 BRP4 BRP3 BRP2 BRP1 BRP0 复位 0 0 0 0 0 0 0 0 SJW1-0 — Synchronization Jump Width:同步跳转宽度。同步跳转宽度定义了一个位周期可以被一次重新同步
8、缩短或延长的时间份额Tq(见下面对BPR5-BPR0的说明)的最大数目,以便在数据发送时与总线同步。SWJ1-0取值与同步跳转宽度对应关系见表15-5。 表15-5 同步跳转宽度 SJW1 SJW2 同步跳转宽度 0 0 0 0 1 0 0 1 1 2 1 0 0 0 3 1 0 1 0 4 表15-6 波特率预置器 BPR5 BPR4 BPR3 BPR2 BPR1 BPR0 预分频因子 0 0 0 0 0 0 1 0 0 0 0 0 1 2 : : : : : : : 1 1 1
9、 1 1 1 64 BPR5-BPR0 — Band Rate Prescaler:波特率预置器。BPR5-BPR决定了用于生成各位(bit)延时的时间份额(Time Quanta---Tq)的大小,其中Tq=fMSCANCLK/预分频因子。BPR5-BPR0与预分频因子的对应关系见表15-6。 注:BTR0只能在软复位状态下才能被写入。 (4)MSCAN08总线定时寄存器1(Bus Timing Register 1,CBTR1) 总线定时寄存器1(BTR1)定义位周期的长度、采样点的位置和每个位时间内采样次数。 地址:$0503 数据位 D7 D6
10、 D5 D4 D3 D2 D1 D0 读/写 SAMP TSEG22 TSEG21 TSEG20 TSEG13 TSEG12 TSEG11 TSEG10 复位 0 0 0 0 0 0 0 0 SAMP — Sampling:采样次数。=1,每位采样3次;=0,每位采样1次。 表15-7 时间段1定义 TSEG13 TSEG12 TSEG11 TSEG10 时间段1 0 0 0 0 1 0 0
11、 0 1 2 0 0 1 0 3 : : : : : 1 1 1 1 16 表15-8 时间段2定义 TSEG22 TSEG21 TSEG20 时间段2 0 0 0 1 0 0 1 2 0 1 0 3 : : : : 1 1 1 8 TSEG22-TSEG20 — Time Segment:时间段。时间段决定了每一位所需的时间份额Tq数目和采样点的位置。时间段由时间段1(TSEG1)和时间段2(TSEG2)组成,定义分别如表15-7和15-8所示。 注:在CAN标准中,时间段1的
12、取值范围为5-16,时间段2的取值范围为2-8,用户设置的位时间必须确保与CAN标准兼容。 CAN通信位周期总体结构如图15-14所示。 同步段 1 (Tq) 时间段1 时间段2 4…16 (Tq) 2…8 (Tq) 采样点(单采样或三次采样) 1位时间=8…25(Tq) NRZ信号 图15-14 CAN通信位周期总体结构图 例如:在MSCAN08时钟频率fMSCAN08=4M,BTR0和BTR1寄存器取如下值时,SJW1-0=00,BPR5-BPR0=000001, SAMP=0,TSEG22-TSEG20=010,TSEG13
13、TSEG10=0101 则:预分频因子PreScale=2,时间份额Tq= fMSCAN08/PreScale = 2M 同步跳转宽度=1(Tq),时间段1=6(Tq),TSEG2=3(Tq) 位时间=1+6+3=10(Tq),通信波特率=2M/10=200(kbps) (5)MSCAN08接收标志寄存器(Receiver Flag Register,CRFLR) 接收标志寄存器反映了MSCAN08接收报文时的有关状态。 地址:$0504 数据位 D7 D6 D5 D4 D3 D2 D1 D0
14、 读/写 WUPIF RWRNIF WRNIF RERRIF TERRIF BOFFIF OVRIF RXF 复位 0 0 0 0 0 0 0 0 WUPIF — Wakeup Interrupt Flag:唤醒中断标志位。当MSCAN08处于睡眠模式时,检测到总线上有数据,将置WUPIF标志位。WUPIF =1,MSCAN08已检测到总线活动并请求唤醒;WUPIF =0,没有产生唤醒中断。 RWRNIF — Receiver Warning Interrupt Flag:接收器警告中断
15、标志位。当接收错误计数器超过96,且其他任何错误中断标志或总线关闭中断标志都未置位时,MSCAN08将进入警告状态时,并置RWRNIF标志位。RWRNIF =1,MSCAN08已进入接收警告状态;RWRNIF =0,未进入接收警告状态。 TWRNIF — Transmitter Warning Interrupt Flag:发送器警告中断标志位。当发送错误计数器超过96,且其他任何错误中断标志或总线关闭中断标志都未置位时,MSCAN08将进入警告状态时,并置TWRNIF标志位。TWRNIF=1,MSCAN08已进入发送警告状态;TWRNIF=0,未进入发送警告状态。 RERRIF — Re
16、ceiver Error Passive Interrupt Flag:接收器错误被动中断标志位。当接收错误计数器超过127,且总线关闭中断标志未置位时,MSCAN08将进入接收器被动错误状态,并置RERRIF标志位。RERRIF =1,MSCAN08已进入接收器被动错误状态;RERRIF =0,未进入接收器被动错误状态。 TERRIF — Receiver Error Passive Interrupt Flag:接收器错误被动中断标志位。当接收错误计数器超过127,且总线关闭中断标志未置位时,MSCAN08将进入接收器被动错误状态,并置TERRIF标志位。TERRIF =1,MSCAN0
17、8已进入接收器被动错误状态;TERRIF =0,未进入接收器被动错误状态。 BOFFIF — Bus-Off Interrupt Flag:总线关闭中断标志位。当发送错误计数器超过255时,MSCAN08将进入总线关闭状态,并置BOFFIF标志位。总线关闭后,至少要等128个11位连续的隐性位后才能清除该标志位。BOFFIF =1,MSCAN08已进入总线关闭状态;BOFFIF =0,未进入总线关闭状态。 OVRIF — Overrun Interrupt Flag:过载中断标志位。当数据过载时,置OVRIF标志位。OVRIF =1,MSCAN08已检测到数据过载;OVRIF =0,未检测
18、到数据过载。 RXF — Receive Buffer Full:接收缓冲区满标志位。当一个新的报文已到达前台接收缓冲区时,置RXF标志位。在CPU将接收缓冲区中的报文读走后应清RXF标志,在RXF被置位时,后台接收缓冲区不能将数据传到前台接收缓冲区。RXF=1,接收缓冲区满;RXF=0,接收缓冲区空。 (6)MSCAN08接收中断使能寄存器(Receiver Interrupt Enable Register,CRIER) 地址:$0505 数据位 D7 D6 D5 D4 D3 D2 D1 D0 读/写 WUP
19、IE RWRNIE TWRNIE RERRIE TERRIE BOFFIE OVRIE RXFIE 复位 0 0 0 0 0 0 0 0 WUPIE — Wakeup Interrupt Enable:唤醒中断使能位。WUPIE =1,允许产生唤醒中断,反之不允许。 RWRNIE — Receiver Warning Interrupt Enable:接收器警告中断使能位。RWRNIE=1,允许产生接收警告中断,反之不允许。 TWRNIE — Transmitter Warning I
20、nterrupt Enable:发送器警告中断使能位。TWRNIE=1,允许产生发送警告中断,反之不允许。 RERRIE — Receiver Error Passive Interrupt Enable:接收器错误被动中断使能位。RERRIE =1,允许产生接收器错误被动中断,反之不允许。 TERRIE — Transmitter Error Passive Interrupt Enable:接收器错误被动中断使能位。TERRIE =1,允许产生发送器被动错误中断,反之不允许。 BOFFIE — Bus-Off Interrupt Enable:总线关闭中断使能位。BOFFIE =1,
21、允许产生总线关闭中断,反之不允许。 OVRIE — Overrun Interrupt Enable:过载中断使能位。OVRIE =1,允许产生过载中断,反之不允许。 RXFIE — Receive Full Interrupt Enable:接收满中断使能位。RXFIE=1,允许产生接收满中断,反之不允许。 (7)MSCAN08发送标志寄存器(Transmitter Flag Register,CTFLR) 地址:$0506 数据位 D7 D6 D5 D4 D3 D2 D1 D0 读 0 ABTAK2
22、 ABTAK1 ABTAK0 0 TXE2 TXE1 TXE0 CLKSRC 写 - - - - - TXE2 TXE1 TXE0 TXE2 TXE1 TXE0 复位 0 0 0 0 0 1 1 1 ABTAK2-ABTAK0 - Abort Acknowledge:中止确认标志。当CPU请求中止发送报文时,应用软件通过读中止确认标志位以确定报文是否被成功中止发送。任何时候发送缓冲区空标志T
23、XEn被清0时,相应的中止确信标志位ABTAKn被隐性地清成0。ABTAKn=1,报文被中止;ABTAKn=0,报文未被中止,也即被发送出去。 TXE2-TXE0 - Transmitter Empty:发送缓冲区空标志。当报文装入发送缓冲区n时,CPU清TXEn为0;当MSCAN08成功将报文发送出去时,置TXEn为1。清TXEn的同时,也将清ABTAKn为0;而置TXEn时,相应的ABTRQn将清0(见MSCAN08发送控制寄存器)。TXEn=1,缓冲区n为空,反之为满(装有待发送的报文)。 (8)MSCAN08发送控制存器(Transmitter Control Register,C
24、TCR) 地址:$0507 数据位 D7 D6 D5 D4 D3 D2 D1 D0 读 0 ABTRQ2 ABTRQ1 ABTRQ0 0 TXEIE2 TXEIE1 TXEIE0 CLKSRC 写 - ABTRQ2 ABTRQ1 ABTRQ0 - TXEIE2 TXEIE1 TXEIE0 复位 0 0 0 0 0 1 1 1 ABTRQ2-ABTRQ0 - Abort
25、 Request:中止请求。CPU通过置ABTRQn为1以中止发送缓冲区n中报文的发送。当报文被中止发送时,相应发送缓冲区空标志和中止确认标志被置成1。CPU不能复位ABTRQ标志,发送缓冲区空标志被置成1时,隐性地将相应中止请求位清成0。ABTRQn=1,有中止请求,反之没有。 注:软件不能在清发送缓冲区空标志的同时又置相应的中止请求位。 TXEIE2-TXEIE0 - Transmitter Empty Interrupt Enable:发送缓冲区空中断使能。TXEIEn=1,缓冲区n空时,将产生缓冲区n空中断,反之不产生中断。 (9)MSCAN08标识符验收控制寄存器(Identi
26、fier Acceptance Control Register,CIDACR) 标识符验收控制寄存器定义了验收模式及验收命中状态指示。 地址:$0508 数据位 D7 D6 D5 D4 D3 D2 D1 D0 读 0 0 IDAM1 IDAM0 0 0 IDHIT1 IDHIT0 CLKSRC 写 - - IDAM1 IDAM0 - - - - TXE2 TXE1 TXE0
27、 复位 0 0 0 0 0 0 0 0 IDAM1-IDAM0 - Identifier Acceptance Mode:标识符验收模式标志。CPU通过设置验收模式标志来定义标识符验收滤波模式。表15-9给出了不同的验收模式的设置。在“关闭滤波器”模式下,将不能接收报文。 IDHIT1-IDHIT0 - Identifier Acceptance Hit Indicator:标识符命中指示器。MSCAN08通过设置这些标志位来指示验收命中的情况。表15-10给出了不同的命中模式指示。 表15-9 标识符
28、验收模式设置 IDAM1 IDAM0 同步跳转宽度 0 0 0 0 单32位验收滤波器 0 0 1 1 双16位验收滤波器 1 0 0 0 4个8位验收滤波器 1 0 1 0 关闭滤波器 表15-10 标识符命中模式指示 IDHIT1 IDHIT0 同步跳转宽度 0 0 0 0 滤波器0命中 0 0 1 1 滤波器1命中 1 0 0 0 滤波器2命中 1 0 1 0 滤波器3命中 (10)MSCAN08接收错误计数器(Receiver Error Counter,CRXERR) 地址:$050
29、E 数据位 D7 D6 D5 D4 D3 D2 D1 D0 读 RXERR7 RXERR6 RXERR5 RXERR4 RXERR3 RXERR2 RXERR1 RXERR0 写 - - - - - - - - 复位 0 0 0 0 0 0 0 0 接收错误计数寄存器反映了MSCAN08接收报文出错的次数。 (11)MSCAN08发送错
30、误计数器(Transmit Error Counter,CTER) 地址:$050F 数据位 D7 D6 D5 D4 D3 D2 D1 D0 读 TXERR7 TXERR6 TXERR5 TXERR4 TXERR3 TXERR2 TXERR1 TXERR0 写 - - - - - - - - 复位 0 0 0 0 0 0 0
31、 0 发送错误计数寄存器反映了MSCAN08发送报文出错的次数。 注:所有计数寄存器只能在睡眠模式或软复位模式下才可读。 (12)MSCAN08标识符验收寄存器(Identifier Acceptance Register,CIDAR) 在验收寄存器的作用下,只有当接收的报文中的标识符与标识符验收寄存器中预定义的位值相等时,CAN控制器才会通知CPU去读取接收的报文;否则,当前报文将会被下一个报文覆盖。对于扩展帧,需占用四个验收寄存器和四个屏蔽寄存器;对于标准帧,则各只占前两个。 CIDAR0地址:$0510 数据位 D7 D6 D5 D
32、4 D3 D2 D1 D0 读/写 AC7 AC6 AC5 AC4 AC3 AC2 AC1 AC0 复位 不 影 响 CIDAR1地址:$0511 数据位 D7 D6 D5 D4 D3 D2 D1 D0 读/写 AC7 AC6 AC5 AC4 AC3 AC2 AC1 AC0 复位 不 影 响
33、CIDAR2地址:$0512 数据位 D7 D6 D5 D4 D3 D2 D1 D0 读/写 AC7 AC6 AC5 AC4 AC3 AC2 AC1 AC0 复位 不 影 响 CIDAR3地址:$0513 数据位 D7 D6 D5 D4 D3 D2 D1 D0 读/写 AC7 AC6 AC5 AC4 AC3
34、 AC2 AC1 AC0 复位 不 影 响 AC7-AC0 - Acceptance Code Bits:验收代码位。接收报文缓冲区中的标识符寄存器中的内容与验收代码中相应位进行比较,比较的结果再与屏蔽寄存器中相应位进行掩码运算。 (13)MSCAN08标识符屏蔽寄存器(Identifier Mask Register,CIDMR0-3) 标识符屏蔽寄存器指定了标识符验收寄存器中哪些位起过滤作用,哪些位不起作用。对于11位标识符的标准帧,必须将屏蔽寄存器1的低3位定义成无关(don’t care)。 CIDMR0地址:$0514 数据
35、位 D7 D6 D5 D4 D3 D2 D1 D0 读/写 AM7 AM6 AM5 AM4 AM3 AM2 AM1 AM0 复位 不 影 响 CIDMR1地址:$0515 数据位 D7 D6 D5 D4 D3 D2 D1 D0 读/写 AM7 AM6 AM5 AM4 AM3 AM2 AM1
36、AM0 复位 不 影 响 CIDMR2地址:$0516 数据位 D7 D6 D5 D4 D3 D2 D1 D0 读/写 AM7 AM6 AM5 AM4 AM3 AM2 AM1 AM0 复位 不 影 响 CIDMR3地址:$0517 数据位 D7 D6 D5 D4 D3 D2 D1 D0 读/写 AM7 A
37、M6 AM5 AM4 AM3 AM2 AM1 AM0 复位 不 影 响 AM7-AM0 - Acceptance Mask Bits:验收屏蔽位。验收屏蔽位用于指定验收代码寄存器中有关位是有效。当某验收屏蔽位被清成0时,表明与该位对应的标识符寄存器必须和验收代码寄存器中相应位相同才认为是匹配的。只有当所有位均匹配,报文才会被接收。当某验收屏蔽位被置成1时,验收代码寄存器中的内容则不影响报文的接收。 AMn =1,忽略验收代码寄存器中相应位;AMn=0,验收代码寄存器与标识符寄存器中相应位必须匹配。 15.4.3
38、 CAN接口初始化与CAN报文收发编程的基本方法 (1)MSCAN08初始化 (2)发送一帧数据 (3)接收一帧数据 15.5 MSCAN08编程实例 本节以MC68HC908GZ60(以下简称GZ60)为例,讲述MSCAN08的使用方法。首先给出了GZ60的最小系统硬件连接图,在此基础上,实现了用08C语言编制的规范CAN通信子程序,包括MSCAN08初始化、接收一帧CAN协议报和发送一帧CAN协议报文子程序。 (1)GZ60的最小系统 (2)CAN结点的软件 CAN结点接入CAN网络后,CAN结点需要进行软件初始化,然后就可以向CAN网络发送数据帧或接收其它CA
39、N结点发送过来的数据帧。下面给出这些过程的源码,读者可以做一些实验,我们实验室已经有这方面的成功的应用实例,如果读者有需要可以和我们实验室联系。 ① 初始化子程序 初始化子程序08C语言例 //------------------------------------------------------------------------------------------------// //程序名:void CANInit(unsigned char time1,unsigned char time0) //功能:CAN初始化 //入口:无 //出口:无 //说明:在4M C
40、AN总线频率下将总线速率设为200kbps,
// 节点标识符设为0
//--------------------------------------------------------------------------------------------------//
void CANInit(void)
{
CMCR0|=(1< 41、LOOPB); //自测方式
CBTR0=CBTR0V; //将位速率设置成200kbps
CBTR1=CBTR1V;
CIDAC=CIDACV; //1次验收滤波器模式
CIDAR0=CIDAR0V; //给接收代码寄存器0-1赋值
CIDAR1=CIDAR1V;
CIDMR0=CIDMR0V; //给接收屏蔽寄存器0-1赋值
CIDMR1=CIDMR1V;
CMCR0&=~(1< 42、报文子程序08C语言例
//------------------------------------------------------------------//
//程序名:unsigned char CANsnd1DFrm(unsigned int rid,
// unsigned char * databuf,unsigned char len)
//功能:CAN发送1帧(数据长度<=8)处理子程序
//入口:unsigned int rid---报文标识符,
// unsigned char * databuf---报文数据区首址
// uns 43、igned char len---报文数据长度
//出口:unsigned char CANsnd1DFrm --- 发送成功与否标志,
// =0,没有空闲发送缓冲区,发送不成功;=1,发送成功
//说明:在发送数据之前,先查询是否有空闲发送缓冲区
// 若无,则不能发送,返回0。
//------------------------------------------------------------------//
unsigned char CANsnd1DFrm(unsigned int rid,unsigned char * databuf,
44、 unsigned char len)
{
unsigned char j;
unsigned char * addr;
unsigned char bufbit=0;
bufbit=GetSndBuf();//查找空闲的发送缓冲区
if (bufbit==0xff) //若返回0xff,则没有空闲的发送缓冲区
return 0; //没有空闲的发送缓冲区,发送不成功,返回0
j=(bufbit<<4); //计算空闲缓冲区与缓冲区0的偏移
addr=(unsigned char *)(&SN 45、DBUF1+j);//计算相应缓冲区首地址
//--------------------------------------------------------//
//将报文按CAN格式进行封装并存入空闲发送缓冲区等待发送
addr[0]=(unsigned char)(rid >>8); //11位报文标识符高8位
addr[1]=((unsigned char)rid); //低3位
addr[1] &=~(1< 46、 //IDE位=0
for(j=0;j 47、一个CAN报文子程序
接收一个CAN报文子程序08C语言例
//------------------------------------------------------------------//
//程序名:unsigned char CANrcv1Frm(unsigned char * CANRcvbuf)
//功能:CAN接收1帧子程序
//入口:无
//出口:unsigned char CANrcv1Frm---函数名,表示接收帧的情况,
// =0xff,未收到帧;=1,收到数据帧;=2,收到远程帧
// unsigned char * CAN 48、Rcvbuf--若收到报文,为16字节报文的首地址
//说明:
//------------------------------------------------------------------//
unsigned char CANrcv1Frm(unsigned char * CANRcvbuf)
{
unsigned char tt;
unsigned char * addr;
unsigned char ss=0;
if ((CRFLG&(1< 49、ddr=(unsigned char *)&RCVBUF; //RXF=1,表示收到数据,取数据处理
for(tt=0;tt<16;tt++)
CANRcvbuf[tt]=addr[tt]; //将CAN接收缓冲区中的数据取到临时缓冲区
CRFLG=0xff; //清所有接收标志
//------判断是标准帧还是扩展帧---------------------------//
tt=(CANRcvbuf[1]&(1< 50、帧
tt=(CANRcvbuf[1]&(1<






