首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

关于GZ16的mscan08的标准can的配置?[原创]

关于GZ16的mscan08的标准can的配置?[原创]

请问freescale是否有现成的例子?因为是刚开始做can项目,还不是很熟悉,想通过例子来节省一些时间?谢谢了!
我前断时间作了一个LIN的项目,现在运行正常.一共1个主模块,4个从模块,还有一个显示模块.如果只是需要一些简单的LIN收发方面的配置程序,我可以提供.其实在freescale网站也可以找到.
立志做个专业的工程师
我想参考看看,倦客能提供给我看看吗?现在刚刚开始学用FC的东西
我邮箱是zangsir@126.com
你可以用CodeWarrior的Processor Expert功能来生成参考代码。
海纳百川  有容乃大
我还不会用这个功能(processor expert),请问在freescale的网站上有无can的例子?以前写lin也很多是参考fs的例子
立志做个专业的工程师
网站上有啊。
海纳百川  有容乃大
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 }
立志做个专业的工程师
版主,我没有找到,能贴出地址吗?没有看到关于gz16的can参考.
立志做个专业的工程师
上面的程序有点乱!可能要自己琢磨以下了.写的不好别见怪!
立志做个专业的工程师
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;
    }
  }
}
立志做个专业的工程师
娃哈哈!怎么成乱七八糟的了,不好意思啊!要么请删除吧!太忙了也没有整理
立志做个专业的工程师
有没有写过GZ16的can的网友,能不能给can的初始化,接受中断,和发送部分的程序参考下?或推荐下网络上的例子?好像现在作can用非力普和pic的单片机的例子在网络上能找到一些.freescale的反而少.
立志做个专业的工程师
http://www.freescale.com/webapp/sps/site/application.jsp?nodeId=02430ZNtdx4J11
海纳百川  有容乃大
谢谢版主,这个地方我看过了,但没有仔细的看其中的内容,好像没有gz16/8/32的mscan内容看来我太急了,我先看看资料.
立志做个专业的工程师

这是我的can程序,汇编写的

[此贴子已经被作者于2005-11-3 16:29:13编辑过]

欢迎大家到汽车电子群2838085!
让我们推动中国汽车前进!
谢谢楼上!可以参考一下,这几天在看freescale的文档,明天正式开始写软件了.不过我是用c写单片机软件.汇编的可读性不是很好.
立志做个专业的工程师
返回列表