控制寄存器——精选推荐
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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标志位指示MSCAN08是否处于睡眠模式,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个隐性位后与总线保持同步。
(2)MSCAN08模式控制寄存器1 (Module Control Register 1,CMCR1)
模式控制寄存器1定义了MSCAN08模块的时钟源、唤醒模式及工作方式。
地址:$0501
LOOPB —Loop Back Self-Test Mode:回环自测模式位。
LOOPB =1,激活回环自测模式;LOOPB =0,正常运行模式。
当处于回环自测模式时,CAN RX引脚被忽略,CAN TX引脚输出隐性值,MSCAN08将自己发送的报文当成是从远程节点上发送过来的报文进行接收,并产生发送和接收中断。
通过自测模式可以在不接任何外外围器件的基础上,测试MSCAN08工作是否正常。
WUPM —Wakeup Mode:唤醒模式位。
该位定义是否启用内部低通滤波以避免被错误唤醒。
WUPM=1,只有当总线上显性电平至少保持了t wup时间后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总线通信波特率。
其中,总线定时寄存器0定义了MSCAN08的同步跳转宽度和预分频因子。
地址:$0502
图15-14 CAN通信位周期总体结构图
例如:在MSCAN08时钟频率f MSCAN08=4M,BTR0和BTR1寄存器取如下值时,SJW1-0=00,BPR5-BPR0=000001,
SAMP=0,TSEG22-TSEG20=010,TSEG13-TSEG10=0101
则:预分频因子PreScale=2,时间份额Tq= f MSCAN08/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
WUPIF —Wakeup Interrupt Flag:唤醒中断标志位。
当MSCAN08处于睡眠模式时,检测到总线上有数据,将置WUPIF标志位。
WUPIF =1,MSCAN08已检测到总线活动并请求唤醒;WUPIF =0,没有产生唤醒中断。
RWRNIF —Receiver Warning Interrupt Flag:接收器警告中断标志位。
当接收错误计数器超过96,且其他任何错误中断标志或总线关闭中断标志都未置位时,MSCAN08将进入警告状态时,并置RWRNIF标志位。
RWRNIF =1,MSCAN08已进入接收警告状态;RWRNIF =0,未进入接收警告状态。
TWRNIF —Transmitter Warning Interrupt Flag:发送器警告中断标志位。
当发送错误计数器超过96,且其他任何错误中断标志或总线关闭中断标志都未置位时,MSCAN08将进入警告状态时,并置TWRNIF标志位。
TWRNIF=1,MSCAN08已进入发送警告状态;TWRNIF=0,未进入发送警告状态。
RERRIF —Receiver Error Passive Interrupt Flag:接收器错误被动中断标志位。
当接收错误计数器超过127,且总线关闭中断标志未置位时,MSCAN08将进入接收器被动错误状态,并置RERRIF标志位。
RERRIF =1,MSCAN08已进入接收器被动错误状态;RERRIF =0,未进入接收器被动错误状态。
TERRIF —Receiver Error Passive Interrupt Flag:接收器错误被动中断标志位。
当接收错误计数器超过127,且总线关闭中断标志未置位时,MSCAN08将进入接收器被动错误状态,并置TERRIF标志位。
TERRIF =1,MSCAN08已进入接收器被动错误状态;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,未检测到数据过载。
RXF —Receive Buffer Full:接收缓冲区满标志位。
当一个新的报文已到达前台接收缓冲区时,置RXF标志位。
在CPU将接收缓冲区中的报文读走后应清RXF标志,在RXF被置位时,后台接收缓冲区不能将数据传到前台接收缓冲区。
RXF=1,接收缓冲区满;RXF=0,接收缓冲区空。
(6)MSCAN08接收中断使能寄存器(Receiver Interrupt Enable Register,CRIER)
地址:$0505
WUPIE —Wakeup Interrupt Enable:唤醒中断使能位。
WUPIE =1,允许产生唤醒中断,反之不允许。
RWRNIE —Receiver Warning Interrupt Enable:接收器警告中断使能位。
RWRNIE=1,允许产生接收警告中断,反之不允许。
TWRNIE —Transmitter Warning Interrupt 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,允许产生总线关闭中断,反之不允许。
OVRIE —Overrun Interrupt Enable:过载中断使能位。
OVRIE =1,允许产生过载中断,反之不允许。
RXFIE —Receive Full Interrupt Enable:接收满中断使能位。
RXFIE=1,允许产生接收满中断,反之不允许。
(7)MSCAN08发送标志寄存器(Transmitter Flag Register,CTFLR)
地址:$0506
ABTAK2-ABTAK0 -Abort Acknowledge:中止确认标志。
当CPU请求中止发送报文时,应用软件通过读中止确认标志位以确定报文是否被成功中止发送。
任何时候发送缓冲区空标志TXEn被清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,CTCR)
地址:$0507
ABTRQ2-ABTRQ0 -Abort Request:中止请求。
CPU通过置ABTRQn为1以中止发送缓冲区n中报文的发送。
当报文被中止发送时,相应发送缓冲区空标志和中止确认标志被
置成1。
CPU 不能复位ABTRQ 标志,发送缓冲区空标志被置成1时,隐性地将相应中止请求位清成0。
ABTRQn=1,有中止请求,反之没有。
注:软件不能在清发送缓冲区空标志的同时又置相应的中止请求位。
TXEIE2-TXEIE0 - Transmitter Empty Interrupt Enable :发送缓冲区空中断使能。
TXEIEn=1,缓冲区n 空时,将产生缓冲区n 空中断,反之不产生中断。
(9
)MSCAN08标识符验收控制寄存器(Identifier Acceptance Control Register ,CIDACR)
标识符验收控制寄存器定义了验收模式及验收命中状态指示。
地址:$0508
IDAM1-IDAM0 - Identifier Acceptance Mode :标识符验收模式标志。
CPU 通过设置验收模式标志来定义标识符验收滤波模式。
表15-9给出了不同的验收模式的设置。
在“关闭滤波器”模式下,将不能接收报文。
IDHIT1-IDHIT0 - Identifier Acceptance Hit Indicator :标识符命中指示器。
MSCAN08通过设置这些标志位来指示验收命中的情况。
表15-10给出了不同的命中模式指示。
接收错误计数寄存器反映了MSCAN08接收报文出错的次数。
(11)MSCAN08发送错误计数器(Transmit Error Counter ,CTER)
地址:$050F
发送错误计数寄存器反映了MSCAN08发送报文出错的次数。
注:所有计数寄存器只能在睡眠模式或软复位模式下才可读。
(12)MSCAN08标识符验收寄存器(Identifier Acceptance Register ,CIDAR)
在验收寄存器的作用下,只有当接收的报文中的标识符与标识符验收寄存器中预定义的
位值相等时,CAN控制器才会通知CPU去读取接收的报文;否则,当前报文将会被下一个报文覆盖。
对于扩展帧,需占用四个验收寄存器和四个屏蔽寄存器;对于标准帧,则各只占前两个。
CIDAR0地址:$0510
AM7-AM0 -Acceptance Mask Bits:验收屏蔽位。
验收屏蔽位用于指定验收代码寄存器中有关位是有效。
当某验收屏蔽位被清成0时,表明与该位对应的标识符寄存器必须和验收代码寄存器中相应位相同才认为是匹配的。
只有当所有位均匹配,报文才会被接收。
当某验收屏蔽位被置成1时,验收代码寄存器中的内容则不影响报文的接收。
AMn =1,忽略验收代码寄存器中相应位;AMn=0,验收代码寄存器与标识符寄存器中相应位必须匹配。
15.4.3 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网络发送数据帧或接收其它CAN结点发送过来的数据帧。
下面给出这些过程的源码,读者可以做一些实验,我们实验室已经有这方面的成功的应用实例,如果读者有需要可以和我们实验室联系。
①初始化子程序
②发送1个CAN数据报文子程序
//------------------------------------------------------------------//
//程序名:unsigned char CANsnd1DFrm(unsigned int rid,
// unsigned char * databuf,unsigned char len)
//功能:CAN发送1帧(数据长度<=8)处理子程序
//入口:unsigned int rid---报文标识符,
// unsigned char * databuf---报文数据区首址
// unsigned char len---报文数据长度
//出口:unsigned char CANsnd1DFrm --- 发送成功与否标志,
// =0,没有空闲发送缓冲区,发送不成功;=1,发送成功
//说明:在发送数据之前,先查询是否有空闲发送缓冲区
// 若无,则不能发送,返回0。
//------------------------------------------------------------------//
unsigned char CANsnd1DFrm(unsigned int rid,unsigned char * databuf,
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 *)(&SNDBUF1+j);//计算相应缓冲区首地址
//--------------------------------------------------------//
//将报文按CAN格式进行封装并存入空闲发送缓冲区等待发送
addr[0]=(unsigned char)(rid >>8); //11位报文标识符高8位
addr[1]=((unsigned char)rid); //低3位
addr[1] &=~(1<<RTR); //RTR=0,数据帧
addr[1] &=~(1<<IDE); //IDE位=0
for(j=0;j<len;j++)
addr[j+4]=databuf[j]; //数据赋值
addr[12]=len; //数据长度
//--------------------------------------------------------//
CTFLG = (1<<bufbit); //发送缓冲区相应TXE位写1,通知MSCAN08发送数据
return (1); //数据成功写入空闲缓冲区,返回1
}
③接收一个CAN报文子程序
00。