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

📄 main.c

📁 S3C44B0X加MCP2515扩展CAN总线接口
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "option.h"
#include "def.h"
#include "44b.h"
#include "44blib.h"
#include "MCP2515.h"
#include "prototype.h"


#define  BIT_LED1_LOOP      (0X01<<1) //GPC1(117)indicate the main loop is normal  
#define  BIT_LED2_RTS_TXB0  (0X01<<2) //GPC2(116)request to send TXB0
#define  BIT_LED3_CS        (0X01<<3) //GPC3(115)MCP2515:indicate the /CS

#define  MCP2515_MODE_CNFIG    (0X87) //MCP2515 configure mode,Abort disable,OSM disable, clockout enable,1/8 prescale
#define  MCP2515_MODE_NOMAL    (0X07) //MCP2515 normal mode,Abort disable, OSM disable,clockout enable, 1/8 prescale
#define  MCP2515_MODE_LOOPBACK (0X47) //MCP2515 loopback mode,Abort disable, OSM disable,clockout enable,1/8 prescale

#define BIT_TX0REQ  (0x1<<3) //MCP2515: TXB0 require to send a message
#define BIT_TX1REQ  (0x1<<3) //MCP2515: TXB1 require to send a message
#define BIT_TX2REQ  (0x1<<3) //MCP2515: TXB2 require to send a message

#define  BIT_SIO_START (0x1<<3) //MCP2515: rSIOCON[3],trigger the shift operation,and it auto change to 0 


		
unsigned char Message_TXB0SIDH[13]={0,0,0,0,8,1,2,3,4,5,6,7,8};//the message of TXB0
unsigned char Message_TXB0D0[8]={1,2,3,4,5,6,7,8};//the data segment of message in TXB0


unsigned char Message_RXB0SIDH[13];//the message of RXB0
unsigned char Message_RXB0D0[8];//the data segment of message in RXB0


void MCP2515_Enable(void)
{
  rPDATC&=~BIT_LED3_CS;//CS enable MCP2515
}

void MCP2515_Disable(void)
{
  rPDATC|=BIT_LED3_CS;//CS disable MCP2515
}


void SIO_Init(void)
{
   //PORT F GROUP
   //rPCONF[21:0]
   //| BIT21|....................................|  BIT0
   //|SIOCLK|SIORXD|SIORDY|SIOTXD|PF4|PF3|PF2|PF1|PF0|
   //| 011  | 011  | 011  | 011  | 00|00 |00 |00 |00 |
   //rPUPF[8:0]
   //|  0   |  0   |  0   |  0   | 0 | 0 | 0 | 0 | 0 |
   rPDATF=0x1ff;//All is High
   rPCONF=0x1B6C00;//configure to SIO function 
   rPUPF=0x000;// All pins pull up enable 

   //rSIOCO[7:0]
   //    7            6          5               4             3                 2                  1:0
   //internal clock, MSB, trasmit/recept, down edge clock, no action, non hand-shaking mode, SIO interrupt mode
   //    0            0          1               0             0                 0                  01
   rSIOCON=0x21;
   Uart_Printf("SIO_Init(): rSIOCON=%d \n",rSIOCON);

   rSIODAT=0X00;
   rSBRDR=59; //Baud=500KHz,MCLK=60MHz,Baud=MCLK/2/(rSBRDR+1)
                    
   rIVTCNT=0;
   rDCNTZ=0;

   rI_ISPC|=BIT_SIO;//Clear the flag of SIO_INTPND
}


void SendSIOData(unsigned char data)
{
  rSIODAT=data; 
  rSIOCON|=BIT_SIO_START;//Start to shift, and rSIOCON[3] auto return to 0
  while(!(rINTPND&BIT_SIO));//Wait to complete
  rI_ISPC|=BIT_SIO;//Clear the flag of SIO_INTPND
  //Uart_Printf("SendSIOData(): data=%d and rSIODAT=%d \n",data,rSIODAT);
}

void ResetMCP2515(void)
{
  MCP2515_Enable();
  //Uart_Printf("\nCall ResetMCP2515() \n");
  SendSIOData(INSTRUCTION_RESET);//Send a RESET insturction word
  MCP2515_Disable(); 
}

void WriteByte(unsigned char Register_Address,unsigned char data)
{
  MCP2515_Enable();
  //Uart_Printf("\nCall WriteByte() \n");
  SendSIOData(INSTRUCTION_WRITE);//send a WRITE instruction word
  SendSIOData(Register_Address);//send a address
  SendSIOData(data);//send a data to the address unit
  MCP2515_Disable();
}

void BitModify(unsigned char Register_Address,unsigned char mark,unsigned char data)
{
  MCP2515_Enable();
  //Uart_Printf("\nCall BitModify() \n");
  SendSIOData(INSTRUCTION_BIT_MODIFY);//send a BIT_MODIFY instruction word
  SendSIOData(Register_Address);//send a register address
  SendSIOData(mark);//send a mark word
  SendSIOData(data);//send a data
  MCP2515_Disable();
}

unsigned char ReceptSIOData(void)
{
  //rSIODAT=0Xaa;//send a dummy data
  rSIOCON|=BIT_SIO_START;//Start to shift and rSIOCON[3] auto change to 0
  while(!(rINTPND&BIT_SIO));//wait the shift to complete
  rI_ISPC|=BIT_SIO;//Clear the flag of SIO_INTPND
  //Uart_Printf("ReceptSIOData():rSIODAT=%d \n",rSIODAT);

  return rSIODAT;
}


unsigned char ReadByte(unsigned char Register_Address)
{
  unsigned char temp=0;

  MCP2515_Enable();
  //Uart_Printf("\nCall ReadByte() \n");
  SendSIOData(INSTRUCTION_READ);//send the READ instruction word
  SendSIOData(Register_Address);//send the address
  temp=ReceptSIOData();//read the content of address unit
  MCP2515_Disable();

  return temp;
}

void TXBnInit(unsigned char Register_TXBnSIDH)
{
   unsigned char i=0;
   for(i=0;i<13;i++)
   {
     if(i<4)//TXBnSIDH,TXBnSIDL,TXBnEID8,TXBnEID0 are 0x00
     {
        WriteByte(Register_TXBnSIDH,0x00);
        Register_TXBnSIDH++;
        continue;
     }
     if(i==4)//TXBnDLC:data frame, 8 bytes     
     {
       WriteByte(Register_TXBnSIDH,0x08);
       Register_TXBnSIDH++;
       continue;
     }
     if(i>4)//TXBnD0~TXBnD7 are 99
     {
       WriteByte(Register_TXBnSIDH,99);
       Register_TXBnSIDH++;
       continue;
     }     
   }
}

void TXB012Init(void)
{
   WriteByte(REGISTER_TXRTSCTRL,0X07);//TXRTS0, TXRTS1, TXRTS2 fuction enable

   WriteByte(REGISTER_TXB0CTRL,0X03);//clear the TXREQ bit, TXB0 has the highest priority
   TXBnInit(REGISTER_TXB0SIDH);

   WriteByte(REGISTER_TXB1CTRL,0X02);//clear the TXREQ bit, TXB1 has the media priority
   TXBnInit(REGISTER_TXB1SIDH);
  
   WriteByte(REGISTER_TXB2CTRL,0X01);//clear the TXREQ bit, TXB2 has the lowest priority
   TXBnInit(REGISTER_TXB2SIDH);
}


void RXB01Init(void)
{
   WriteByte(REGISTER_BFPCTRL,0X0F);//enable RXB0BF,RXB1BF function

   WriteByte(REGISTER_RXB0CTRL,0X00);//recept all frame matched the marker and filter,bukt function disable
   WriteByte(REGISTER_RXB1CTRL,0X00);//recept all frame matched the marker and filter
}


void RXMnInit(unsigned char Register_RXMnSIDH)
{
   unsigned char i=0;
   for(i=0;i<4;i++)//RXMnSIDH,RXMnSIDL,RXMnEID8,RXMnEID0 are 0x00,do not care mode
   {
     WriteByte(Register_RXMnSIDH,0X00);
     Register_RXMnSIDH++;
   }
}

void Marker01Init(void)
{
   //initalize marker
   RXMnInit(REGISTER_RXM0SIDH);
   RXMnInit(REGISTER_RXM1SIDH);
}


void RXFnInit(unsigned char Register_RXFnSIDH)
{
   unsigned char i=0;
   for(i=0;i<4;i++)//RXFnSIDH,RXFnSIDL,RXFnEID8,RXFnEID0 are 0x00
   {
     WriteByte(Register_RXFnSIDH,0X00);
     Register_RXFnSIDH++;
   }
}

void Filter012345Init(void)
{
   //initialize filter
   RXFnInit(REGISTER_RXF0SIDH);
   RXFnInit(REGISTER_RXF1SIDH);
   RXFnInit(REGISTER_RXF2SIDH);
   RXFnInit(REGISTER_RXF3SIDH);
   RXFnInit(REGISTER_RXF4SIDH);
   RXFnInit(REGISTER_RXF5SIDH);
}



void DisplayTXBnSIDH(unsigned char Register_TXBnSIDH)
{
   unsigned char temp=0;
   unsigned char i=0;

   Uart_Printf("\n");
   for(i=0;i<13;i++)
   {
     temp=ReadByte(Register_TXBnSIDH);
     Register_TXBnSIDH++;

          switch(i)
     {
      case 0:
        Uart_Printf("TXB0SIDH=%d \n",temp);
        break;
      case 1:
        Uart_Printf("TXB0SIDL=%d \n",temp);
        break;
      case 2:
        Uart_Printf("TXB0EID8=%d \n",temp);
        break;
      case 3:
        Uart_Printf("TXB0EID0=%d \n",temp);
        break;
      case 4:
        Uart_Printf("TXB0DLC=%d \n",temp);
        break;
      case 5:

⌨️ 快捷键说明

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