📄 can_bus.c
字号:
/*********************************************************************
* Filename: Can_bus.c *
* *
* Author: Jianping Xu,2003/06/3 *
* *
* Last Modified: 2003/06/3 *
* *
* Description: can communication module with other singlechip. * *
**********************************************************************/
#include "artisman.h"
#include "extern.h"
void can_init(void)
{
WORD cTemp;
*MCRB |= (BIT7+BIT6); /*设置IOPC6、IOPC7为CANTX、CANRX*/
*PCDATDIR |= BIT14; /*OUTPUT MODE*/
*PCDATDIR &=~BIT15; /*INPUT MODE*/
*CAN_IFR=0XFFFF; /*清所有CAN中断标志位*/
*LAM1_H=0X7FFF; /*设置邮箱2、3的屏蔽ID寄存器*/
*LAM1_L=0XFFFF;
/*========================================================================
/*以下配置位定时器BCR1和BCR2
/*======================================================================*/
*MCR=CCR; /*CCR=1,改变配置请求*/
while((*GSR&CCE)!=CCE); /*当CCE=1时方可配置BCR2,BCR1寄存器*/
switch(bCANBAUD[bCANBaudRate])
{
#ifdef X1226S8I
case 100:
*BCR2=0X0018; /*波特率预分频寄存器,波特率设置为100K*/
*BCR1=0X0061; /*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/
break;
case 250:
*BCR2=0X0009; /*波特率预分频寄存器,波特率设置为250K*/
*BCR1=0X0061; /*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/
break;
case 500:
*BCR2=0X0004; /*波特率预分频寄存器,波特率设置为500K*/
*BCR1=0X0061; /*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/
break;
// case 1000:
// *BCR2=0X0001; /*波特率预分频寄存器,波特率设置为1000K*/
// *BCR1=0X007a; /*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/
// break;
#else
case 100:
*BCR2=0X0013; /*波特率预分频寄存器,波特率设置为100K*/
*BCR1=0X0061; /*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/
break;
case 250:
*BCR2=0X0007; /*波特率预分频寄存器,波特率设置为100K*/
*BCR1=0X0061; /*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/
break;
case 500:
*BCR2=0X0003; /*波特率预分频寄存器,波特率设置为100K*/
*BCR1=0X0061; /*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/
break;
// case 1000:
// *BCR2=0X0001; /*波特率预分频寄存器,波特率设置为1000K*/
// *BCR1=0X0061; /*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/
// break;
#endif
}
*MCR &=~CCR; /*CCR=0,改变配置结束请求*/
while((*GSR&CCE)==CCE); /*当CCE=0时,BCR2,BCR1寄存器配置成功*/
/*========================================================================
/*以下初始化接收邮箱
/*======================================================================*/
*MDER =MD2; /*不使能邮箱,邮箱2设为接收邮箱,邮箱3设为发送邮箱*/
*MCR =CDR; /*CDR=1,数据区改变请求,选择邮箱2*/
*MSGID2H=0X59A4; /*设置邮箱2的控制字及ID,IDE=0,AME=1,AAM=0
/*接收标识符为0669H(11001101001B),标准方式为MSGID2H[12~2]*/
*MSGID2L=0XFFFF;
*MSGCTRL2=DLC_4; /*调制控制域,数据长度DCL=4,RTR=0数据帧*/
*MBX2A=0; /*邮箱2信息初始化*/
*MBX2B=0;
*MCR=DBO+ABO; /*CDR=0,DBO=1,ABO=1,STM=0*/
*MDER|=ME2+ME3; /*MBX3发送,MBX2接收,使能接收邮箱*/
*CAN_IMR=BIT10; /*中断MBX3不使能,MBX2使能,高中断优先级*/
*CAN_IFR=0XFFFF; /*清全部中断标志*/
*IMR |= BIT0; /*允许INT1中断 */
}
/*============================================================
邮箱3发射子程序
入口参数:所传数据字WORD dat1及WORD dat2
功能:向小键盘传输数据
/*============================================================*/
void can_tx(WORD dat1,WORD dat2)
{
WORD i=0,j=0;
*MDER &=~ME3; /*不使能邮箱,邮箱2设为接收邮箱,邮箱3设为发送邮箱*/
*MCR =CDR; /*CDR=1,数据区改变请求,选择邮箱3*/
*MSGID3H=0X1564; /*设0置邮箱3的标识符为0559H(10101011001B)*/
*MSGID3L=0XFFFF;
*MSGCTRL3=DLC_4; /*RTR=0,DLC=8*/
*MBX3A=dat1; /*邮箱3信息初始化*/
*MBX3B=dat2;
*MCR=DBO+ABO; /*CDR=0,DBO=1,ABO=1*/
*MDER |=ME3; /*使能发射邮箱*/
do
{
j++;
*TCR=TRS3; /*MBX3请求发送*/
while((*TCR&TA3)!=TA3)
{
i++;
MSDelay(2);
if(i>1000)
break;
}
}while((j<3)&&((*TCR&TA3)!=TA3));
*TCR=TA3; /*清TA3和MIF3标志位*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -