📄 main.c
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12d64.h> /* derivative information */
#include <stdio.h>
#pragma LINK_INFO DERIVATIVE "mc9s12d64"
#pragma MESSAGE DISABLE C1106 // WARNING C1106: Non-standard bitfield type
/*采用9S12D64实现的CAN,发送时while(1){CAN_Transmit();}可实现发送,接收时用中断,接受ID=2的扩展贞,接受的字符用串口发送到计算机显示*/
//宏定义,如果采用自循环模式(CAN自发自收)时则打开宏定义 ,否则如果不采用自发自收则把下面的宏定义屏蔽
#define LoopMode
char buf[30];
uchar sig=0;
#define CAN_BUFFER_LNG 64
uchar CANReceive[CAN_BUFFER_LNG];
char i;
uchar mask;
/* MSCAN初始化*/
void MSCAN_init(void)
{ CAN0CTL1_CANE = 1;
CAN0CTL0_INITRQ = 1;
while(CAN0CTL1_INITAK!=1);
CAN0CTL1_CLKSRC = 0; /* 选择晶振频率 */
#ifdef LoopMode
CAN0CTL1_LOOPB = 1;
#else
CAN0CTL1_LOOPB = 0;
#endif
CAN0CTL1_LISTEN = 0;
/* 用4M晶振125 kb rate */
CAN0BTR0_SJW =1; /* SJW=2tq*/
CAN0BTR0_BRP =1; /* 分频 2 */
CAN0BTR1_SAMP =0; /* one sample per bit */
CAN0BTR1_TSEG_20 =5; /* Tseg2=6 */
CAN0BTR1_TSEG_10 =8; /* Tseg1=9 */
CAN0IDAC = 0; /* two 32bit acceptance filter*/
/*下面仅配置为接受ID=02的扩展贞格式,此时Hit 0 命中,但对于ID=0的标准贞也接受,此时Hit 1命中*/
CAN0IDAR0 =0x00;
CAN0IDAR1 =0x00;
CAN0IDAR2 =0x00;
CAN0IDAR3 =0x04; //接受ID=2
CAN0IDMR0 = 0x00;
CAN0IDMR1 =0x18;//屏蔽SRR和IDE
CAN0IDMR2 = 0x00;
CAN0IDMR3 = 0x01;//屏蔽RTR
CAN0IDAR4 =0x00;//注意:如果标准贞ID设为1000,则也可接收到,因为1000已超出11位,所以此时的ID也为0
CAN0IDAR5 =0x00;
CAN0IDAR6 =0x00;
CAN0IDAR7 =0x00;
CAN0IDMR4 = 0x00;
CAN0IDMR5 = 0x00;
CAN0IDMR6 = 0x00;
CAN0IDMR7 = 0x00;
CAN0CTL0_INITRQ = 0;
while(CAN0CTL1_INITAK!=0);
CAN0RIER_RXFIE = 1; /* 接收中断使能,禁止发送中断 */
CAN0TIER = 0;
}
uchar CAN_Transmit(void)
{
mask = CAN0TFLG;
CAN0TBSEL= mask;
mask = CAN0TBSEL;
CAN0TXIDR0 = 0x00;
CAN0TXIDR1 = 0x08; //扩展桢
CAN0TXIDR2 = 0x00;
CAN0TXIDR3 = 0x04; //发送ID=2
CAN0TXDSR0 = 200;
CAN0TXDSR1 = 212;
CAN0TXDSR2 = 111;
CAN0TXDSR3 = 23;
CAN0TXDSR4 = 89;
CAN0TXDSR5 = 155;
CAN0TXDSR6 = 199;
CAN0TXDSR7 = 0;
CAN0TXDLR = 0x08;
CAN0TXTBPR = 0x00;
CAN0TFLG = mask;
return mask;
}
/**-------------------------------------------串口发送函数---*/
//发送字符串,上位机可以以ASCII码形式接收
void TransmitT(char *text){SCI0SR1;
while (*text != '\0'){
while (!(SCI0SR1 & 0x80)); /* wait for output buffer empty */
SCI0DRL = *text++;}
}
//发送一个字节的二进制,上位机要以HEX方式接收
void TransmitHex(unsigned char n) //串行口输出
{ unsigned char a;
a=SCI0SR1;
while (!(SCI0SR1 & 0x80));
SCI0DRL=n;
}
void Initial(void)
{
/*----------------------------------------锁相环初始化---------------*/
CLKSEL=0x00; //disable pll;
PLLCTL=0xe1; //CLOCK MONITOR=ON,PLL=ON,AUTO SELECT,是默认设置
SYNR=14;REFDV=2; //bus clock =20M
PLLCTL=0x60; //自动锁定
asm NOP;asm NOP;asm NOP;
while(!CRGFLG_LOCK);
CLKSEL=0x80; //pll start
/*----------------------------------------串口初始化---------------*/
SCI0BDL=130; //20M总线 //25M总线 :SCI0BDL=163;
SCI0CR1=0; //无奇偶校验,1个起始位8个数据位1个停止位
SCI0CR2 = 0x2c; //允许接收中断
/*----------------------------------------定时中断初始化---------------*/
RTICTL=0x1f; //油门PID控制和离合器PID控制的定时中断频率,产生4ms定时中断
CRGINT=0x80; //允许RTI中断
MSCAN_init();
EnableInterrupts;
}
void main(void) {
Initial();
for(;;){
if(sig==1){CAN_Transmit();sig=0;}
}
}
interrupt void RTI_ISR (void) {
CRGFLG_RTIF=1;
}
//串口接收中断
interrupt void SCI0Recive_ISR(void){
unsigned char receivedata;
receivedata=SCI0SR1; //清除标志
receivedata=SCI0DRL; //读数据
if(receivedata==1)sig=1;
else {TransmitHex(receivedata);sig=0;}
}
/* MSCAN 接收中断*/
/*中断入口: VECTOR ADDRESS 0XFFB2 CANReceive_ISR*/
interrupt void CANReceive_ISR(void) {
if (CAN0RXIDR1_IDE)
{
CANReceive[0]=CAN0RXIDR0; /* 扩展29位 */
CANReceive[1]=CAN0RXIDR1;
CANReceive[2]=CAN0RXIDR2;
CANReceive[3]=CAN0RXIDR3;
CANReceive[4]=CAN0RXDLR&0x0F;
CANReceive[5]=CAN0RXDSR0;
CANReceive[6]=CAN0RXDSR1;
CANReceive[7]=CAN0RXDSR2;
CANReceive[8]=CAN0RXDSR3;
CANReceive[9]=CAN0RXDSR4;
CANReceive[10]=CAN0RXDSR5;
CANReceive[11]=CAN0RXDSR6;
CANReceive[12]=CAN0RXDSR7;
}
else
{
CANReceive[0]=CAN0RXIDR0; /* 标准11位 */
CANReceive[1]=CAN0RXIDR1;
CANReceive[2]=CAN0RXDLR&0x0F;
CANReceive[3]=CAN0RXDSR0;
CANReceive[4]=CAN0RXDSR1;
CANReceive[5]=CAN0RXDSR2;
CANReceive[6]=CAN0RXDSR3;
CANReceive[7]=CAN0RXDSR4;
CANReceive[8]=CAN0RXDSR5;
CANReceive[9]=CAN0RXDSR6;
CANReceive[10]=CAN0RXDSR7;
}
for(i=0;i<13;i++){
sprintf(buf,"%d\n",CANReceive[i]);TransmitT(buf);} //注意:调用Sprintf函数必须在头文件包含 #include <stdio.h>
CAN0RFLG_RXF=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -