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

📄 main.c

📁 S3C44B0X加MCP2515扩展CAN总线接口
💻 C
📖 第 1 页 / 共 2 页
字号:
        Uart_Printf("TXB0D0=%d \n",temp);
        break;
      case 6:
        Uart_Printf("TXB0D1=%d \n",temp);
        break;
      case 7:
        Uart_Printf("TXB0D2=%d \n",temp);
        break;
      case 8:
        Uart_Printf("TXB0D3=%d \n",temp);
        break;
      case 9:
        Uart_Printf("TXB0D4=%d \n",temp);
        break;
      case 10:
        Uart_Printf("TXB0D5=%d \n",temp);
        break;
      case 11:
        Uart_Printf("TXB0D6=%d \n",temp);
        break;
      case 12:
        Uart_Printf("TXB0D7=%d \n",temp);
        break;
      default:
        Uart_Printf("Error \n");
        break;
     }
   }
}

void ReadAndDisplayRXBnSIDH(unsigned char Register_RXBnSIDH,unsigned char Message_RXBnSIDH[13])
{
   unsigned char i=0;

   Uart_Printf("\n");
   for(i=0;i<13;i++)
   {
     Message_RXBnSIDH[i]=ReadByte(Register_RXBnSIDH);
     Register_RXBnSIDH++;
     
          switch(i)
     {
      case 0:
        Uart_Printf("RXB0SIDH=%d \n",Message_RXBnSIDH[i]);
        break;
      case 1:
        Uart_Printf("RXB0SIDL=%d \n",Message_RXBnSIDH[i]);
        break;
      case 2:
        Uart_Printf("RXB0EID8=%d \n",Message_RXBnSIDH[i]);
        break;
      case 3:
        Uart_Printf("RXB0EID0=%d \n",Message_RXBnSIDH[i]);
        break;
      case 4:
        Uart_Printf("RXB0DLC=%d \n",Message_RXBnSIDH[i]);
        break;
      case 5:
        Uart_Printf("RXB0D0=%d \n",Message_RXBnSIDH[i]);
        break;
      case 6:
        Uart_Printf("RXB0D1=%d \n",Message_RXBnSIDH[i]);
        break;
      case 7:
        Uart_Printf("RXB0D2=%d \n",Message_RXBnSIDH[i]);
        break;
      case 8:
        Uart_Printf("RXB0D3=%d \n",Message_RXBnSIDH[i]);
        break;
      case 9:
        Uart_Printf("RXB0D4=%d \n",Message_RXBnSIDH[i]);
        break;
      case 10:
        Uart_Printf("RXB0D5=%d \n",Message_RXBnSIDH[i]);
        break;
      case 11:
        Uart_Printf("RXB0D6=%d \n",Message_RXBnSIDH[i]);
        break;
      case 12:
        Uart_Printf("RXB0D7=%d \n",Message_RXBnSIDH[i]);
        break;
      default:
        Uart_Printf("Error \n");
        break;
     }
   }
}

void MCP2515_Init(void)
{
   unsigned char temp=0;
   
   //reset MCP2515
   ResetMCP2515();//reset MCP2515 all register
   Uart_Printf("\nCANCTRL=%d \n",ReadByte(REGISTER_CANCTRL));
   Uart_Printf("\nCANSTAT=%d \n",ReadByte(REGISTER_CANSTAT));

   WriteByte(REGISTER_CANCTRL,MCP2515_MODE_CNFIG); //configure mode,abort disable, OSM diable, clkout enable, 1/8 distribute
   while(ReadByte(REGISTER_CANCTRL)!=MCP2515_MODE_CNFIG)
   {
     WriteByte(REGISTER_CANCTRL,MCP2515_MODE_CNFIG);
   }
   BitModify(REGISTER_CANCTRL,0X03,0X01);//1/2 distribute
   
   //set the CAN baudrate=125KHz
   WriteByte(REGISTER_CNF1,0x03);//SJW=1TQ, BRP=3, Tbit=2(BRP+1)/Fosc=500ns; Fosc=16MHz
   WriteByte(REGISTER_CNF2,0xb1);//PS2 is determinate by PS22:PS20 of CNF3, sample one time, PS1=7TQ, PROGSEG=2TQ
   WriteByte(REGISTER_CNF3,0x05);//SOF disable, wake filter disable, PS2=6TQ
  
   //disable all interrupt and clear all interrupt flags
   WriteByte(REGISTER_CANINTE,0X00);//MCP2515 disable all interrupt
   WriteByte(REGISTER_CANINTF,0X00);//clear all interrupt flags

   //initialize the relative registers of transmition and reception
   TXB012Init();
   RXB01Init();
   Marker01Init();
   Filter012345Init();
      
   //MCP2515 tangle to loop-back mode
   WriteByte(REGISTER_CANCTRL,MCP2515_MODE_LOOPBACK);//MCP2515 tangle to loopback mode
   while(ReadByte(REGISTER_CANCTRL)!=MCP2515_MODE_LOOPBACK)
   {
     WriteByte(REGISTER_CANCTRL,MCP2515_MODE_LOOPBACK);
   }

   //enable all interrupt
   WriteByte(REGISTER_CANINTE,0XFF);
}


void SendFrameTXB0SIDH(unsigned char Register_TXB0SIDH,unsigned char Message_TXB0SIDH[13])
{
   unsigned char i=0;
   unsigned char status=0;
   
   for(i=0;i<13;i++)
   {
     WriteByte(Register_TXB0SIDH,Message_TXB0SIDH[i]);
     Register_TXB0SIDH++;
   }
   Uart_Printf("\n\nnow transmiting TXB0:");
   DisplayTXBnSIDH(REGISTER_TXB0SIDH);

   BitModify(REGISTER_TXB0CTRL,BIT_TX0REQ,BIT_TX0REQ);//set the TX0REQ 
   while(!(ReadByte(REGISTER_CANINTF)&BIT_TX0IF))
   {
     status=ReadByte(REGISTER_CANINTF);
     Uart_Printf("\n");
     Uart_Printf("waiting the transmit operation to finish \n");
     Uart_Printf("CANINTF=%d \n",status);
     Uart_Printf("CANINTF&BIT_RX0IF=%d \n",status&BIT_RX0IF);
     Uart_Printf("CANINTF&BIT_RX1IF=%d \n",status&BIT_RX1IF);
     Uart_Printf("CANINTF&BIT_TX0IF=%d \n",status&BIT_TX0IF);
     Uart_Printf("CANINTF&BIT_TX1IF=%d \n",status&BIT_TX1IF);
     Uart_Printf("CANINTF&BIT_TX2IF=%d \n",status&BIT_TX2IF);
     Uart_Printf("CANINTF&BIT_ERRIF=%d \n",status&BIT_ERRIF);
     Uart_Printf("CANINTF&BIT_WAKIF=%d \n",status&BIT_WAKIF);
     Uart_Printf("CANINTF&BIT_MERIF=%d \n",status&BIT_MERIF);
     
     if(status&BIT_ERRIF)
     {
        status=ReadByte(REGISTER_EFLG);
        Uart_Printf("EFLG=%d \n",status);
        Uart_Printf("EFLG&BIT_RX1OVER=%d \n",status&BIT_RX1OVER);
        Uart_Printf("EFLG&BIT_RX0OVER=%d \n",status&BIT_RX0OVER);
        Uart_Printf("EFLG&BIT_BUSOFF=%d \n",status&BIT_BUSOFF);
        Uart_Printf("EFLG&BIT_TXERRP=%d \n",status&BIT_TXERRP);
        Uart_Printf("EFLG&BIT_RXERRP=%d \n",status&BIT_RXERRP);
        Uart_Printf("EFLG&BIT_TXWARN=%d \n",status&BIT_TXWARN);
        Uart_Printf("EFLG&BIT_RXWARN=%d \n",status&BIT_RXWARN);
        Uart_Printf("EFLG&BIT_ERWARN=%d \n",status&BIT_ERWARN);

        Uart_Printf("transmit error counter:TEC=%d \n",ReadByte(REGISTER_TEC));
        Uart_Printf("recevie error counter:REC=%d \n",ReadByte(REGISTER_REC));

     }
   }
   status=ReadByte(REGISTER_CANINTF);
   Uart_Printf("\n");
   Uart_Printf("CANINTF=%d \n",status);
   Uart_Printf("CANINTF&BIT_RX0IF=%d \n",status&BIT_RX0IF);
   Uart_Printf("CANINTF&BIT_RX1IF=%d \n",status&BIT_RX1IF);
   Uart_Printf("CANINTF&BIT_TX0IF=%d \n",status&BIT_TX0IF);
   Uart_Printf("CANINTF&BIT_TX1IF=%d \n",status&BIT_TX1IF);
   Uart_Printf("CANINTF&BIT_TX2IF=%d \n",status&BIT_TX2IF);
   Uart_Printf("CANINTF&BIT_ERRIF=%d \n",status&BIT_ERRIF);
   Uart_Printf("CANINTF&BIT_WAKIF=%d \n",status&BIT_WAKIF);
   Uart_Printf("CANINTF&BIT_MERIF=%d \n",status&BIT_MERIF);
   BitModify(REGISTER_CANINTF,BIT_TX0IF,~BIT_TX0IF);//clear the TX0IF flag 
   //BitModify(REGISTER_TXB0CTRL,BIT_TX0REQ,~BIT_TX0REQ);//clear the TX0REQ(TX0REQ auto tangle to zero)

   if(ReadByte(REGISTER_CANINTF)&BIT_RX0IF)
   {
      Uart_Printf("\n\nnow recepting RXB0:");
      ReadAndDisplayRXBnSIDH(REGISTER_RXB0SIDH,Message_RXB0SIDH);
      BitModify(REGISTER_CANINTF,BIT_RX0IF,~BIT_RX0IF);//clear the RX0IF flag 
   }
   
   if(ReadByte(REGISTER_CANINTF)&BIT_ERRIF)
   {
     status=ReadByte(REGISTER_EFLG);
     Uart_Printf("\n");
     Uart_Printf("EFLG=%d \n",status);
     Uart_Printf("EFLG&BIT_RX1OVER=%d \n",status&BIT_RX1OVER);
     Uart_Printf("EFLG&BIT_RX0OVER=%d \n",status&BIT_RX0OVER);
     Uart_Printf("EFLG&BIT_BUSOFF=%d \n",status&BIT_BUSOFF);
     Uart_Printf("EFLG&BIT_TXERRP=%d \n",status&BIT_TXERRP);
     Uart_Printf("EFLG&BIT_RXERRP=%d \n",status&BIT_RXERRP);
     Uart_Printf("EFLG&BIT_TXWARN=%d \n",status&BIT_TXWARN);
     Uart_Printf("EFLG&BIT_RXWARN=%d \n",status&BIT_RXWARN);
     Uart_Printf("EFLG&BIT_ERWARN=%d \n",status&BIT_ERWARN);
  
     Uart_Printf("transmit error counter:TEC=%d \n",ReadByte(REGISTER_TEC));
     Uart_Printf("recevie error counter:REC=%d \n",ReadByte(REGISTER_REC));

     BitModify(REGISTER_CANINTF,BIT_ERRIF,~BIT_ERRIF);//clear the ERRIF flag 
   }
} 


void Main(void)
{
    unsigned char temp;

    rSYSCFG=CACHECFG;   // Using 8KB Cache//

    Port_Init();

    rPDATC|=BIT_LED1_LOOP;//turn on the LED1
    rPDATC|=BIT_LED2_RTS_TXB0;//turn on the LED2
   
    MCP2515_Disable();

    Uart_Init(0,57600);//initalize UART0,baud=57600
    Delay(10);
    Uart_Select(0); //Select UART0
    Uart_Printf("Enter Main program \n"); 

    SIO_Init();
    MCP2515_Init();

    Uart_Printf("\nthe original TXB0:");
    DisplayTXBnSIDH(REGISTER_TXB0SIDH);

    Uart_Printf("\nthe original RXB0:");
    ReadAndDisplayRXBnSIDH(REGISTER_RXB0SIDH,Message_RXB0SIDH);
  
    while(1)
    { 
      SendFrameTXB0SIDH(REGISTER_TXB0SIDH,Message_TXB0SIDH);
      //SendMessageTXBnD0(INSTRUCTION_WRITE_TXB0D0);
      //WriteTXBnSIDH(INSTRUCTION_WRITE_TXB0SIDH,Message_TXB0SIDH);
      //DisplayTXBnSIDH(REGISTER_TXB0SIDH);
    }     
}

⌨️ 快捷键说明

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