关于GZ16的mscan08的标准can的配置?[原创]
- UID
- 115025
- 性别
- 男
|
关于GZ16的mscan08的标准can的配置?[原创]
请问freescale是否有现成的例子?因为是刚开始做can项目,还不是很熟悉,想通过例子来节省一些时间?谢谢了!
我前断时间作了一个LIN的项目,现在运行正常.一共1个主模块,4个从模块,还有一个显示模块.如果只是需要一些简单的LIN收发方面的配置程序,我可以提供.其实在freescale网站也可以找到. |
|
|
|
|
|
- UID
- 124376
- 性别
- 男
|
我想参考看看,倦客能提供给我看看吗?现在刚刚开始学用FC的东西
我邮箱是zangsir@126.com |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
你可以用CodeWarrior的Processor Expert功能来生成参考代码。 |
|
|
|
|
|
- UID
- 115025
- 性别
- 男
|
我还不会用这个功能(processor expert),请问在freescale的网站上有无can的例子?以前写lin也很多是参考fs的例子 |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
|
|
|
|
|
- UID
- 115025
- 性别
- 男
|
ql4作为终端模块,下面是lin的初始化,和中断中接受和发送:
/*对SLIC模块的初始化*/
void slic_init(void){
SLCC1_INITREQ=0; //清除INITREQ,但未开启中断.
while(SLCS_INITACK==1){;} //是否初始化完毕进入正常操作
SLCC2_SLCE=1; //运行SLIC模块
SLCC2_BTM=0; //不启用字节发送方式
SLCP=0x80; //配置接受滤波的延迟时间
//SLCDLC=0x43: //计算校验和不包括ID字节,接受的数据字节为4.
SLCDLC_CHKMOD=1; //计算校验和不包括ID字节
SLCC1_SLCIE=1; //使能中断
}
/*SLIC中断,用于接受或发送LIN数据*/
void interrupt 10 slic_int(void){
uchar temp_SLCSV = 0;
uchar ID_found = 0; // If ID not found, set IMSG
temp_SLCSV = SLCSV; // Read SLCSV value
switch(temp_SLCSV){ // switch is temporary measure
case 0x00: //No Interrupts Pending
break;
case 0x04: //No Bus Activity
break;
case 0x08: //TX Buffer Empty - Checksum Sent
break;
case 0x0C: //TX Buffer Empty
break;
case 0x10: //RX Buffer Full - Checksum OK
if(SLCID==0x20){ // Test message from master
lin_buffer0= SLCD0; // Load RAM from RX buffers
lin_buffer1= SLCD1; // Load RAM from RX buffers
lin_buffer2= SLCD2; // Load RAM from RX buffers
lin_buffer3= SLCD3; // Load RAM from RX buffers
}
else if(SLCID==0xe7){
sleep_tmp= SLCD0;
sleep_tmp= SLCD1;
sleep_tmp= SLCD2;
sleep_tmp= SLCD3;
//sleep_tmp= SLCD4;
//sleep_tmp= SLCD5;
//sleep_tmp= SLCD6;
//sleep_tmp= SLCD7;
sleep_flag=1; //设置睡眠标志位
}
else{
;
}
break;
case 0x14: //RX Buffer Full - No errors
break;
case 0x18: //Bit-Error
break;
case 0x1C: //RX Buffer Overrun
break;
case 0x20: //
break;
case 0x24: //Checksum Error
break;
case 0x28: //Byte Framing Error
break;
case 0x2C: //ID received correctly - parity OK
if(SLCID==0xa3){ // Check ID--前终端模块
ID_found = 1; // Set ID found flag
SLCD0 = lindata0; // Load TX buffers
SLCD1 = lindata1;
SLCD2 = lindata2; // Load TX buffers
SLCD3 = lindata3;
SLCDLC = 0xC3; // Write DLC code to start TX - STD CHECKSUM
}
if(SLCID==0x20){ //master control command--对所有终端模块(不包括显示)
ID_found = 1; // Set ID found flag
SLCDLC = 0x43; // Write DLC code = RX, STANDARD CHECKSUM, 4 bytes
}
if(SLCID==0xe7){ //睡眠的ID
ID_found = 1;
SLCDLC = 0x43; // Write DLC code = RX, STANDARD CHECKSUM, 8 bytes
}
if (ID_found == 0){ // Alpha sample workaround - write DLC = 0 before IMSG=1;
SLCDLC = 0x00;
SLCC1_IMSG = 1; // Set IMSG bit to ignore ID if not found!
}
ID_found = 0; // reset ID_found (should do anyway on re-entry into ISR)
break;
case 0x30: //ID Parity Error
break;
case 0x34: //Inconsistent-Synch-Field Error
break;
case 0x38: //__
break;
case 0x3C: //_Wakeup_
break;
default:
break;
} //end switch temp_SLCSV
SLCS_SLCF = 1; // Clear SLIC interrupt flag
} |
|
|
|
|
|
- UID
- 115025
- 性别
- 男
|
版主,我没有找到,能贴出地址吗?没有看到关于gz16的can参考. |
|
|
|
|
|
- UID
- 115025
- 性别
- 男
|
上面的程序有点乱!可能要自己琢磨以下了.写的不好别见怪! |
|
|
|
|
|
- UID
- 115025
- 性别
- 男
|
ey16作为显示终端,也是初始化和lin接受中断.
void lin_sciinit(void){
/* NB: SCI is not disabled during initialization */
SCPSC=0x00; //bypass
/* initialization order correct */
SCBR = 0x04; /* set the baud rate divider */
SCC1 = 0x44; /* enable SCI. One start bit, eight data bits, one stop bit */
SCC2 = 0x0c; /* enable transmitter and receiver, disable all interrupts */
SCC3 = 0x00; /* no DMA, disable all error interrupt etc. */
/* clear SCI status */
LIN_TmpSCIByte = SCS1;
LIN_TmpSCIByte = SCS2;
LIN_TmpSCIByte = SCDR;
SCC2_SCRIE=1; /* Enable RX completed interrupt */
//LIN_SCC3 |= LIN_SCC3_FEIE; /* Enable Frame Error interrupt */
}
/*ESCI接受中断,把接受缓冲区中的数据压入队列*/
void interrupt 11 scirev_int(void) {
uchar tmp;
if(SCS1_FE){
LIN_TmpSCIByte=SCS1; //清除FE和SCRF标志位.
LIN_TmpSCIByte=SCDR;
if(LIN_TmpSCIByte==0x00){ //表示接受到break field
receive_no=0;
fe_flag=1;
}
}
else{
lin_rflag=1;
switch(receive_no){
case 0:
LIN_TmpSCIByte=SCS1; //清除SCRF标志位.
LIN_TmpSCIByte=SCDR;
if((LIN_TmpSCIByte==0x55)&&(fe_flag==1)){ //接受到起始场和同步间隔场
receive_no=1;
}
fe_flag=0;
break;
case 1: //判断ID
LIN_TmpSCIByte=SCS1; //清除SCRF标志位.
LIN_TmpSCIByte=SCDR;
if(LIN_TmpSCIByte==0xe2){ //对前终端模块的诊断信息
count_fm=0;
receive_no=2;
}
else if(LIN_TmpSCIByte==0xa3){ //驾驶室模块
count_dm=0;
receive_no=3;
}
else if(LIN_TmpSCIByte==0x64){ //发动机室模块
count_em=0;
receive_no=4;
}
else if(LIN_TmpSCIByte==0x25){ //后终端和挂车终端模块
count_rm=0;
receive_no=5;
}
else if(LIN_TmpSCIByte==0xe7){ //后终端和挂车终端模块
count_sleep=0;
receive_no=6;
}
else if(LIN_TmpSCIByte==0x20){ //小灯打开时液晶背光灯亮
count_dism=0;
receive_no=7;
}
else if(LIN_TmpSCIByte==0xa6){ //显示模块
send_char(0x58); //接受到主向显示模块的诊断信息后马上返回信息
send_char(0x58); //主要用于测试显示模块是否存在
send_char(0x58);
send_char(0x58);
chksum=addc(0x58,0x58);
chksum=addc(chksum,0x58);
chksum=addc(chksum,0x58);
chksum=~chksum;
send_char(chksum); //发送校验和.
receive_no=0;
}
else
receive_no=0;
fe_flag=0;
break;
case 2: //对前终端模块的4个数据字节和校验和的接受
LIN_TmpSCIByte=SCS1; //清除SCRF标志位.
LIN_TmpSCIByte=SCDR;
buffer_fm[count_fm]=LIN_TmpSCIByte;
count_fm++;
if(count_fm==5){
fmodule_flag=1; //前模块有回应标志,如果超过1s无回应则标示模块不存在
fm_flag=1; //前模块数据全部接受完等待主循环处理标志.
receive_no=0;
}
fe_flag=0;
break;
case 3: //对驾驶室终端模块的4个数据字节和校验和的接受
LIN_TmpSCIByte=SCS1; //清除SCRF标志位.
LIN_TmpSCIByte=SCDR;
buffer_dm[count_dm]=LIN_TmpSCIByte;
count_dm++;
if(count_dm==5){
dmodule_flag=1;
dm_flag=1;
receive_no=0;
}
fe_flag=0;
break;
case 4: //对发动机终端模块的4个数据字节和校验和的接受
LIN_TmpSCIByte=SCS1; //清除SCRF标志位.
LIN_TmpSCIByte=SCDR;
buffer_em[count_em]=LIN_TmpSCIByte;
count_em++;
if(count_em==5){
emodule_flag=1;
em_flag=1;
receive_no=0;
}
fe_flag=0;
break;
case 5: //对发动机终端模块的4个数据字节和校验和的接受
LIN_TmpSCIByte=SCS1; //清除SCRF标志位.
LIN_TmpSCIByte=SCDR;
buffer_rm[count_rm]=LIN_TmpSCIByte;
count_rm++;
if(count_rm==5){
rmodule_flag=1;
rm_flag=1;
receive_no=0;
}
fe_flag=0;
break;
case 6:
LIN_TmpSCIByte=SCS1; //清除SCRF标志位.
LIN_TmpSCIByte=SCDR;
tmp=LIN_TmpSCIByte;
count_sleep++;
if(count_sleep==5){
sleep_flag=1;
receive_no=0;
}
fe_flag=0;
break;
case 7: //显示模块接受主对终端的控制信号
LIN_TmpSCIByte=SCS1;
LIN_TmpSCIByte=SCDR;
buffer_dism[count_dism]=LIN_TmpSCIByte;
count_dism++;
if(count_dism==5){
dism_flag=1;
receive_no=0;
}
fe_flag=0;
break;
default:
break;
}
}
} |
|
|
|
|
|
- UID
- 115025
- 性别
- 男
|
娃哈哈!怎么成乱七八糟的了,不好意思啊!要么请删除吧!太忙了也没有整理 |
|
|
|
|
|
- UID
- 115025
- 性别
- 男
|
有没有写过GZ16的can的网友,能不能给can的初始化,接受中断,和发送部分的程序参考下?或推荐下网络上的例子?好像现在作can用非力普和pic的单片机的例子在网络上能找到一些.freescale的反而少. |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
http://www.freescale.com/webapp/sps/site/application.jsp?nodeId=02430ZNtdx4J11 |
|
|
|
|
|
- UID
- 115025
- 性别
- 男
|
谢谢版主,这个地方我看过了,但没有仔细的看其中的内容,好像没有gz16/8/32的mscan内容看来我太急了,我先看看资料. |
|
|
|
|
|
- UID
- 124289
- 性别
- 男
|
这是我的can程序,汇编写的
[此贴子已经被作者于2005-11-3 16:29:13编辑过] |
欢迎大家到汽车电子群2838085! 让我们推动中国汽车前进! |
|
|
|
|
|
- UID
- 115025
- 性别
- 男
|
谢谢楼上!可以参考一下,这几天在看freescale的文档,明天正式开始写软件了.不过我是用c写单片机软件.汇编的可读性不是很好. |
|
|
|
|
|