⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can_receive.c

📁 英飞凌的CAN驱动。英飞凌的CAN非常复杂
💻 C
字号:
#include<XC886CLM.H>
#include<can.h>
//#define _can_0_
void can_write(uword addr,ulong value)
{
CAN_ADL=(addr>>2)&0xff;
CAN_ADH=(addr>>10)&0x0f;
CAN_DATA0=value&0xff;
CAN_DATA1=(value>>8)&0xff;
CAN_DATA2=(value>>16)&0xff;
CAN_DATA3=(value>>24)&0xff;
CAN_ADCON=0xf1;
while(BSY==1);
//BSY=0;
}
//设置相应位
void  can_set(uword addr,uword value)
{
   CAN_ADL=(addr>>2)&0xff;
  CAN_ADH=(addr>>10)&0x0f;
  CAN_DATA2=value&0xff;
  CAN_DATA3=(value>>8)&0xff;
  V2=1;
  V3=1;
  RWEN=1;
  while(BSY==1);
  
}
void  can_res(uword addr,uword value)
{
   CAN_ADL=(addr>>2)&0xff;
  CAN_ADH=(addr>>10)&0x0f;
  CAN_DATA0=value&0xff;
  CAN_DATA1=(value>>8)&0xff;
  V0=1;
  V1=1;
  RWEN=1;
  while(BSY==1);
  
}

 //置位
void set_bit(uword addr,uchar bitnum,uchar value)
{
  uchar i=1;
  //can_read(addr);
  CAN_ADL=(addr>>2)&0xff;
  CAN_ADH=(addr>>10)&0x0f;
   if(bitnum<8)  {
   
   if(value)
   CAN_DATA0|=(i<<bitnum);
   else
   CAN_DATA0&=~(i<<bitnum);
   V0=1;
   }
   else if(bitnum>=8&&bitnum<16)
   {
     
     if(value)
     CAN_DATA1|=(i<<(bitnum-8));
     else
     CAN_DATA1&=~(i<<(bitnum-8));
       V1=1;
     }
      else if(bitnum>=16&&bitnum<24)
      {
      
      if(value)
     CAN_DATA2|=(i<<(bitnum-16));
     else
       CAN_DATA2&=~(i<<(bitnum-16));
       V2=1;
     }
      else if(bitnum>=24&&bitnum<32)
      {
   
      if(value)
     CAN_DATA3|=(i<<(bitnum-24));
     else
     CAN_DATA3&=~(i<<(bitnum-24));
     V3=1;
     }

       RWEN=1;
 while(BSY==1);
}
   

 P3_init1()
 {
  PORT_PAGE  = 0x00;
  P3_DIR     = 0xFF;    // all output


  PORT_PAGE  = 0x03;
  P3_OD      = 0x00;    // normal mode
    PORT_PAGE  = 0x01;
  P3_PUDSEL  = 0xFF;    // pull-up
  P3_PUDEN   = 0x01;    // pull-up disable
     PORT_PAGE  = 0x02;
  P3_ALTSEL0 = 0x00;
  P3_ALTSEL1 = 0x00;    // normal GPIO
 }


//reg 0 2 4 8  选择写那个寄存器
void can_write_0(uword addr,uchar value,uchar reg)
{
  uchar i=1;
  CAN_ADL=(addr>>2)&0xff;
CAN_ADH=(addr>>10)&0x0f;
 switch (reg)
 {
 case 0:
         V0=1;
         CAN_DATA0=value;break;
 case 1:
         V1=1;
         CAN_DATA1=value;break;
  case 2:
         V2=1;
         CAN_DATA2=value;break;
  case 3:
         V3=1;
         CAN_DATA3=value;break;

 }
 AUAD=0X01;
 RWEN=1;
 while(BSY==1);
}


 void can_read(uword addr)
  {
  CAN_ADL=(addr>>2)&0xff;
  CAN_ADH=(addr>>10)&0x0f;
  RWEN=0;
  while(BSY==1);
  // BSY=0;
  }

 char read_datalen()
 {
  can_read(MOFCR0);
  return   CAN_DATA3;
 }
 //读取相应位
   uchar read_bit(uword addr,uchar bitnum)
    {
      uchar i=1;
  //can_read(addr);
  CAN_ADL=(addr>>2)&0xff;
  CAN_ADH=(addr>>10)&0x0f;
      RWEN=0;
 while(BSY==1);
   if(bitnum<8)  {
   //V0=1;
     return CAN_DATA0&(i<<bitnum)  ;
   }
   else if(bitnum>=8&&bitnum<16)
   {
     //V1=1;
     return CAN_DATA1&(i<<(bitnum-8));

     }
      else if(bitnum>=16&&bitnum<24)
      {
      //V2=1;
     return CAN_DATA2&(i<<(bitnum-16));
     }
      else if(bitnum>=24&&bitnum<32)
      {
      //V3=1;
     return CAN_DATA3&(i<<(bitnum-24));
     }
    }


    void write_pancom(uchar pancmd,uchar panar1 ,uchar panar2)
   {
    CAN_ADL=(PANCTR>>2)&0xff;
CAN_ADH=(PANCTR>>10)&0x0f;
CAN_DATA0=pancmd;
CAN_DATA2=panar1;
CAN_DATA3=panar2;
CAN_ADCON=0XD5;
while(BSY==1);
  while(read_bit(PANCTR,0X08)!=0);
   }


   void can1_init()
 {

 //节点1控制
      //漏极开路选择
    PORT_PAGE  = 0x03;
  P1_OD      = 0x00;
  PORT_PAGE  = 0x00;
  //1.3out,1.4in
  P1_DIR=0x08;

  //设置rxsel
  set_bit(NCR1,CCE,1);
  can_write_0(NPCR1,0X03,0);
  PORT_PAGE=0x02;
     P1_ALTSEL0 = 0x02;
  P1_ALTSEL1 =  0x02; //p477,端口选择
    //写面板控制寄存器,静态分配,将报文对象0给节点1
     write_pancom(0x02,0x00,0x02);
    //can_read(MOSTAT0);

     //测试是否给list1分配报文对象
        /*
        if((CAN_DATA1&0xf0)==0x10)
        {
      PORT_PAGE=0;
         P3_DATA=0x55;
        }
        if(read_bit(0x0104,24)==0)
         {
         PORT_PAGE=0;
         P3_DATA=0XFF;
         }*/

      //位时序控制,CCE置位

    can_write(NBTR1,0X3487);
    //设置ncr1(p495),使能can0节点
   can_write(NCR1,0x0e);
   //set_bit(NCR1,CCE,0);
   //侦设置
        set_bit(MOAMR0,MIDE,1);
       set_bit(MOAR0,IDE,0);//标准侦
     return;
 }
 set_singal(ulong singal)
 {
   if(read_bit(MOAR0,IDE)!=0)
  can_write(MOAR0,(singal|0x20000000));
  else
  can_write(MOAR0,((singal<<18)&0XDFFFFFFF));
 }

 //接受函数
 void can_receive()
 {
 #ifdef _can_0_
 PORT_PAGE  = 0x03;
  P1_OD      = 0x00;
   PORT_PAGE  = 0x00;
    set_bit(NCR0,CCE,1);
  P1_DIR=0xfe;
  PORT_PAGE=0x02;
     P1_ALTSEL0 = 0x02;
  P1_ALTSEL1 =  0x02; //p477,端口选择
  //写面板控制寄存器,静态分配
     write_pancom(0x02,0x00,0x01);
     //位时序控制

    can_write(NBTR0,0X3487);
   //设置ncr0 (p495)
   can_write(NCR0,0X0E);
   //侦设置
        set_bit(MOAMR0,MIDE,1);
       set_bit(MOAR0,IDE,0);//标准侦
       #else
          can1_init();
       #endif
          //设置接受滤波信号
            set_singal(0x05);
     //接受验收滤波dir,TXRQ,不发送远程侦
      // set_bit(MOCTR0 ,SETDIR,0);
    set_bit(MOCTR0 ,RESDIR,1);
    //set_bit(MOCTR0 ,SETTXRQ,0);
    set_bit(MOCTR0 ,RESTXRQ,1);
    set_bit(MOCTR0 ,SETMSGVAL,1);
    //set_bit(MOCTR0 ,RESMSGVAL,0);
    set_bit(MOCTR0 ,SETRXEN,1);
    //set_bit(MOCTR0 ,RESRXEN,0);
    //while(read_bit(MOSTAT0,RTSEL)==0);
     while(read_bit(MOSTAT0,NEWDAT)==0);
     //while(read_bit(MOSTAT0,RXUPD)==0);
    while(read_bit(NSR0,RXOK)==0);
    //set_bit(NSR0,RXOK,0);
  //   set_bit(MOCTR0 ,SETRTSEL,1);
    //set_bit(MOCTR0 ,RESRTSEL,0);
      //set_bit(MOSTAT0,DIR,0);
       //set_bit(MOSTAT0,TXRQ,0);

       //while(read_bit(MOSTAT0,RTSEL)==0);//RTSEL位1,选中报文对象进行接收
       //set_bit(MOSTAT0,DIR,1);
    //设置MSGVAL,RXEN
    //set_bit(MOSTAT0,RXEN,1);//接受使能
    //set_bit(MOSTAT0,MSGVAL,1);
    //set_bit(MOSTAT0,DIR,1);
     //读取newdat位
      //while(read_bit(MOSTAT0,NEWDAT)==0);
      //set_bit(MOSTAT0,NEWDAT,0);
      return;
 }
void delay()
{
int i,j;
for( i=250;i>0;i--)
     for( j=250;j>0;j--);
}

int main()
{

    P3_init1();
     PORT_PAGE  = 0x00;
    P3_DATA=0X11;

   delay();
     can_receive();
          PORT_PAGE  = 0x00;
           can_read(MOFCR0);
           P3_DATA=CAN_DATA3;//数据长度
       //P3_DATA=read_datalen();
        while(1);
return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -