?? main.c
字號:
#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 + -