?? test_mcp2510.cbackup
字號:
SendData[0]=ID[3]; //SID10 SID9 SID8 SID7 SID6 SID5 SID4 SID3
SendData[1]=ID[2] & 0xE0; //SID2 SID1 SID0 __ EXIDE __ EID17 EID16
if(Msg->EIDFlag) //EID15 EID14 EID13 EID12 EID11 EID10 EID9 EID8
{ //EID7 EID6 EID5 EID4 EID3 EID2 EID1 EID0
ID[0]=ID[0]>>3;
ID[0]=ID[0] |(ID[1]<<5);
ID[1]=ID[1]>>3;
ID[1]=ID[1] |(ID[2]<<5);
ID[2]=ID[2]>>3;
ID[2]=ID[2] &0x03;
SendData[1]=SendData[1] | 0x08 | ID[2];
SendData[2]=ID[1];
SendData[3]=ID[0];
}
SendData[4]=Msg->DLC &0x0f; //__ RTR __ __ DLC3 DLC2 DLC1 DLC0
if(Msg->RTRFlag) SendData[4]=SendData[4] | 0x40; //Set RTR Bit
memcpy((void *)&SendData[5], (void *)&Msg->Data[0], 8);
status=ReadMCP2510Status();
if( (status & 0x04)==0x00 )
{
WriteMCP2510ManyRegS(TXB0SIDH,5+(Msg->DLC&0x0f),SendData );
WriteMCP2510Reg(TXB0CTRL, 0x09 );
ulTemp = 15;
m_CANDRV_aulSendingStartTicks[0] = ulTemp;
success=0;
}
else if((status & 0x10)==0x00)
{
WriteMCP2510ManyRegS(TXB1SIDH,5+(Msg->DLC&0x0f),SendData );
WriteMCP2510Reg(TXB1CTRL, 0x0B );
success=1;
}
else if((status & 0x40)==0x00)
{
WriteMCP2510ManyRegS(TXB2SIDH,5+(Msg->DLC&0x0f),SendData );
WriteMCP2510Reg(TXB2CTRL, 0x0B );
success=2;
}
else success=0xFF;
return (success);
}
/****************************************************************************
【功能說明】
****************************************************************************/
U8 SendCANACKMessage( CANMESSAGE* Msg )
{
U8 status,SendData[13];
U8 success=1;
U8 ID[4];
//U8 err;
U8 ucI;
U32 ulTemp;
ID[3]=(U8)((Msg->ID & 0xff000000)>>24);
ID[2]=(U8)((Msg->ID & 0x00ff0000)>>16);
ID[1]=(U8)((Msg->ID & 0x0000ff00)>>8);
ID[0]=(U8)((Msg->ID & 0x000000ff));
SendData[0]=ID[3]; //SID10 SID9 SID8 SID7 SID6 SID5 SID4 SID3
SendData[1]=ID[2] & 0xE0; //SID2 SID1 SID0 __ EXIDE __ EID17 EID16
if(Msg->EIDFlag) //EID15 EID14 EID13 EID12 EID11 EID10 EID9 EID8
{ //EID7 EID6 EID5 EID4 EID3 EID2 EID1 EID0
ID[0]=ID[0]>>3;
ID[0]=ID[0] |(ID[1]<<5);
ID[1]=ID[1]>>3;
ID[1]=ID[1] |(ID[2]<<5);
ID[2]=ID[2]>>3;
ID[2]=ID[2] &0x03;
SendData[1]=SendData[1] | 0x08 | ID[2];
SendData[2]=ID[1];
SendData[3]=ID[0];
}
SendData[4]=Msg->DLC &0x0f; //__ RTR __ __ DLC3 DLC2 DLC1 DLC0
if(Msg->RTRFlag) SendData[4]=SendData[4] | 0x40; //Set RTR Bit
memcpy((void *)&SendData[5], (void *)&Msg->Data[0], 8);
for(ucI=0; ucI < 8; ucI++)
{
status=ReadMCP2510Status();
if( (status & 0x40)==0x00 )
{
WriteMCP2510ManyRegS(TXB2SIDH,5+(Msg->DLC&0x0f),SendData );
WriteMCP2510Reg(TXB2CTRL, 0x0B );
//ulTemp = m_CANDRV_aulSendingStartTicks[][2];
ulTemp = 15;
m_CANDRV_aulSendingStartTicks[2] = ulTemp;
success=0;
break;
}
else
success = 0xff;
for(ulTemp=0; ulTemp < 100; ulTemp++)
Delay(1) ;
}
return (success);
}
/****************************************************************************
【功能說明】
****************************************************************************/
U8 SendCANOnLineMessage( CANMESSAGE* Msg )
{
U8 status,SendData[13];
U8 success=1;
U8 ID[4];
//U8 err;
U8 ucI;
U32 ulTemp;
ID[3]=(U8)((Msg->ID & 0xff000000)>>24);
ID[2]=(U8)((Msg->ID & 0x00ff0000)>>16);
ID[1]=(U8)((Msg->ID & 0x0000ff00)>>8);
ID[0]=(U8)((Msg->ID & 0x000000ff));
SendData[0]=ID[3]; //SID10 SID9 SID8 SID7 SID6 SID5 SID4 SID3
SendData[1]=ID[2] & 0xE0; //SID2 SID1 SID0 __ EXIDE __ EID17 EID16
if(Msg->EIDFlag) //EID15 EID14 EID13 EID12 EID11 EID10 EID9 EID8
{ //EID7 EID6 EID5 EID4 EID3 EID2 EID1 EID0
ID[0]=ID[0]>>3;
ID[0]=ID[0] |(ID[1]<<5);
ID[1]=ID[1]>>3;
ID[1]=ID[1] |(ID[2]<<5);
ID[2]=ID[2]>>3;
ID[2]=ID[2] &0x03;
SendData[1]=SendData[1] | 0x08 | ID[2];
SendData[2]=ID[1];
SendData[3]=ID[0];
}
SendData[4]=Msg->DLC &0x0f; //__ RTR __ __ DLC3 DLC2 DLC1 DLC0
if(Msg->RTRFlag) SendData[4]=SendData[4] | 0x40; //Set RTR Bit
memcpy((void *)&SendData[5], (void *)&Msg->Data[0], 8);
for(ucI=0; ucI < 8; ucI++)
{
status=ReadMCP2510Status();
if( (status & 0x10)==0x00 )
{
WriteMCP2510ManyRegS(TXB1SIDH,5+(Msg->DLC&0x0f),SendData );
WriteMCP2510Reg(TXB1CTRL, 0x0A );
//ulTemp = m_CANDRV_aulSendingStartTicks[][1];
ulTemp = 15 ;
m_CANDRV_aulSendingStartTicks[1] = ulTemp;
success=0;
break;
}
else
success = 0xff;
for(ulTemp=0; ulTemp < 100; ulTemp++)
Delay(1);
}
return (success);
}
CANMESSAGE CanMsg;
/****************************************************************************
【功能說明】
//RXBnSIDH:SID10 SID9 SID8 SID7 SID6 SID5 SID4 SID3
//RXBnSIDL:SID2 SID1 SID0 SRR IDE ____ EID17 EID16
//RXBnEID8:EID15 EID14 EID13 EID12 EID11 EID10 EID9 EID8
//RXBnEID0:EID7 EID6 EID5 EID4 EID3 EID2 EID1 EID0
//RXBnDLC: ___ RTR ___ ____ DLC3 DLC2 DLC1 DLC0
//RXBnDm (m:0--7)
//: Can (0,1,2)
//RXBufferIndex:0,1
****************************************************************************/
void ReceiveCANMessage( CANMESSAGE* Msg,U8 RXBufferIndex )
{
U8 RecData[13];
U8 ID[4];
U32 IDD[4];
U8 RID2 ;
if(RXBufferIndex==0) //buffer 0
{
ReadMCP2510ManyRegS(RXB0SIDH, 5,RecData );
ReadMCP2510ManyRegS(RXB0D0, RecData[4] & 0x0f,RecData+5 );
}
else if(RXBufferIndex==1) //buffer1
{
ReadMCP2510ManyRegS(RXB1SIDH, 5,RecData );
ReadMCP2510ManyRegS(RXB1D1, RecData[4] & 0x0f,RecData+5 );
}
else printf( "Buffer is out of range\n" ) ;; //Buffer is out of range
ID[3]=RecData[0];
ID[2]=RecData[1];
ID[1]=RecData[2];
ID[0]=RecData[3];
if(ID[2] &0x08) Msg->EIDFlag=1; //See if A extend Frame
else Msg->EIDFlag=0;
if(ID[2] &0x01) Msg->RTRFlag=1; //See if A RTR Frame
else if(RecData[4]&0x40) Msg->RTRFlag=1;
else Msg->RTRFlag=0;
RID2=ID[2];
ID[2]=(ID[2]<<3) & 0x1C;
ID[2]=(RID2 &0xe0)+ID[2];
ID[2]=ID[2]+(ID[1]>>5);
ID[1]=ID[1]<<3;
ID[1]=ID[1]+(ID[0]>>5);
ID[0]=ID[0]<<3;
IDD[3]=ID[3];
IDD[2]=ID[2];
IDD[1]=ID[1];
IDD[0]=ID[0];
Msg->ID=(U32)(IDD[3]<<24)+(U32)(IDD[2]<<16)+(S32)(IDD[1]<<8)+(S32)IDD[0];
Msg->DLC=RecData[4] & 0x0f;
memcpy( (void *)&Msg->Data[0], (void *)&RecData[5], 8 ) ;
}
/****************************************************************************
【功能說明】
****************************************************************************/
void AbortAllTransmit( )
{
U8 value;
BitModifyMCP2510Reg(CANCTRL,0X10, 0x10 ); //Set CANCTRL.ABAT bit
Delay(1);
value=ReadMCP2510Status( );
while((value & 0xfc)!=0xa8); //See if all three buffers are empty and //TXB0CTRL.TXREQ =0 TXB1CTRL.TXREQ =0 //TXB2CTRL.TXREQ =0
{
BitModifyMCP2510Reg(CANCTRL,0X10, 0x10 ); //Set CANCTRL.ABAT bit
Delay(1);
value=ReadMCP2510Status( );
}
BitModifyMCP2510Reg(CANCTRL,0X10, 0x00 ); //clear CANCTRL.ABAT bit
}
/****************************************************************************
【功能說明】service for CAN interrupt
****************************************************************************/
void HandleCANInt( U8 *INTFlag )
{
U8 status;
status=ReadMCP2510Reg( CANINTF );
if(status & 0x01) //RXBuffer0 Received data ?
{
printf( "進入接收緩沖器0 滿中斷\n" ) ;
ReceiveCANMessage( &m_CANDRV_aStruRXMsg0[0],0 ); //Receive CAN Message from RXBuffer0
ClearRXBufferFull(0 );
}
if(status & 0x02) //RXBuffer1 Received data ?
{
printf( "進入接收緩沖器1 滿中斷\n" ) ;
ReceiveCANMessage( &m_CANDRV_aStruRXMsg1[1],1 ); //Receive CAN Message from RXBuffer1
ClearRXBufferFull(1 );
}
if(status & 0x04)
{
printf( "進入發送緩沖器0 空中斷\n" ) ;
ClearTXEmptyFlag(0);
m_CANDRV_aulSendingStartTicks[0] = 0;
}
if(status & 0x08)
{
ClearTXEmptyFlag(1);
printf( "進入發送緩沖器1 空中斷\n" ) ;
m_CANDRV_aulSendingStartTicks[1] = 0;
}
if(status & 0x10)
{
ClearTXEmptyFlag(2);
printf( "進入發送緩沖器2 空中斷\n" ) ;
m_CANDRV_aulSendingStartTicks[2] = 0;
}
if(status & 0x20)
{
printf( "進入出錯中斷\n" ) ;
}
if(status & 0x40)
{
printf( "進入喚醒中斷\n" ) ;
}
if(status & 0x80)
{
printf( "進入報文出錯中斷\n" ) ;
}
}
U8 dd=0;
/****************************************************************************
【功能說明】
****************************************************************************/
void InitCANMessage() //a function for Debug
{
U32 i;
CanMsg.Data[0]=dd;
CanMsg.Data[1]=0x31;
CanMsg.Data[2]=0x32;
CanMsg.Data[3]=0x33;
CanMsg.Data[4]=0x34;
CanMsg.Data[5]=0x35;
CanMsg.Data[6]=0x36;
CanMsg.Data[7]=0x37;
CanMsg.ID=0x0052a980;
i=dd;
CanMsg.ID=(i<<24)+CanMsg.ID;
CanMsg.DLC=0x08;
CanMsg.EIDFlag=1;
CanMsg.RTRFlag=0;
dd++;
m_CANDRV_aStruRXFilter[0].EXFrame=1;
m_CANDRV_aStruRXFilter[0].ID=0xAAbb7680;
}
/****************************************************************************
【功能說明】
****************************************************************************/
void InitCANHOT(U8 BaudIndex ) //will be executed when mcp2510 ocurrs error
{
WriteMCP2510Reg(CANINTE, 0x00); //Disable all interrupts
Set_MCP2510_Mode( 5, 1 ); //set to configure mode
Set_MCP2510_Baud(BaudIndex); //set Baud
SetMCP2510Mask(0, m_CANDRV_aulCANDrvMask[0]); //enable all messages be received
SetMCP2510Mask(1, m_CANDRV_aulCANDrvMask[1]); //enable all messages be received
SetMCP2510Filter(0, &m_CANDRV_aStruRXFilter[0]);
SetMCP2510Filter(1, &m_CANDRV_aStruRXFilter[1]);
SetMCP2510Filter(2, &m_CANDRV_aStruRXFilter[2]);
SetMCP2510Filter(3, &m_CANDRV_aStruRXFilter[3]);
SetMCP2510Filter(4, &m_CANDRV_aStruRXFilter[4]);
SetMCP2510Filter(5, &m_CANDRV_aStruRXFilter[5]);
Set_MCP2510_Mode(1,1); //set to normal mode
WriteMCP2510Reg(RXB0CTRL,0X64);
WriteMCP2510Reg(RXB1CTRL,0X60);
ClearRXBufferFull(0);
ClearRXBufferFull(1);
ClearRXBufferOVR(0);
ClearRXBufferOVR(1);
BitModifyMCP2510Reg(CANINTF,0xa0,0x00);
WriteMCP2510Reg(CANINTE, 0xbf);
}
/****************************************************************************
【功能說明】
****************************************************************************/
void Init_CAN( U8 BaudIndex )
{
SendCMDMCP2510( CAN_SPIRESET ) ; //Reset MCP2510 By software via SPI (RESET INSTRUCTION)
printf( "CANCTRL = 0x%x\n", ReadMCP2510Reg( CANCTRL ) ) ;
WriteMCP2510Reg( CANINTE, 0x00 ); //Disable all interrupts
Set_MCP2510_Mode( 5, 1 ); //set to configure mode
Set_MCP2510_Baud( BaudIndex ); //set Baud = 100K
SetMCP2510Filter( 0, &m_CANDRV_aStruRXFilter[0] ); //set filter
SetMCP2510Filter( 1, &m_CANDRV_aStruRXFilter[1] ); //set filter
SetMCP2510Filter( 2, &m_CANDRV_aStruRXFilter[2] ); //set filter
SetMCP2510Filter( 3, &m_CANDRV_aStruRXFilter[3] ); //set filter
SetMCP2510Filter( 4, &m_CANDRV_aStruRXFilter[4] ); //set filter
SetMCP2510Filter( 5, &m_CANDRV_aStruRXFilter[5] ); //set filter
Set_MCP2510_Mode( 3, 1 ); //set to LOOP mode
// Set_MCP2510_Mode( 1, 1 ); //set to NORMAL mode
WriteMCP2510Reg( RXB0CTRL,0x64 ); //接收所有報文
WriteMCP2510Reg( RXB1CTRL,0x60 ); //接收所有報文
ClearRXBufferFull(0);
ClearRXBufferFull(1);
ClearRXBufferOVR(0);
ClearRXBufferOVR(1);
WriteMCP2510Reg( CANINTE, 0x00 ) ; //清中斷標識位
WriteMCP2510Reg( CANINTE, 0x1f ) ;
//printf( "CANCTRL = 0x%x\n", ReadMCP2510Reg(CANSTAT) ) ;
//m = ReadMCP2510Reg( CANCTRL ) ;
//printf( "CANCTRL = 0x%x\n", m ) ;
}
/****************************************************************************
【功能說明】MCP2510測試程序
****************************************************************************/
void Test_MCP2510(void)
{
U8 m ;
CANMESSAGE Msg_Send ;
CANMESSAGE Msg_Receive0 ;
CANMESSAGE Msg_Receive1 ;
rINTMSK = 0xffffffff ; //屏蔽所有中斷
printf( "\nCAN BUS TEST, press ESC key to exit !\n" ) ;
Msg_Send.ID = 0x55555555 ;
Msg_Send.DLC = 0xaa ;
Msg_Send.EIDFlag = 0x55 ;
Msg_Send.RTRFlag = 0xaa ;
for( m = 0; m < 8; m++ )
Msg_Send.Data[m] = 0x55 ;
while( getkey() != ESC_KEY )
{
Init_CAN( 5 ) ;
m = ReadMCP2510Reg( CANINTF );
//if( (m&0x1c) == 0 )
//{
m = SendCANMessage( &Msg_Send ) ;
if( m != 0xff ) printf( "Send is OK! From channel %d \n", m ) ;
else printf( "Send is Failed!!! \n" ) ;
//}
//else printf( "\n\nCANINTF = 0x%x \n\n", m ) ;
//m = ReadMCP2510Reg( CANINTF );
//if( (m&0x01) == 0 )
//{
ReceiveCANMessage( &Msg_Receive0, 0 ) ;
printf( "\n\nMsg_Receive0:\n" ) ;
printf( "ID = 0x%x\n", Msg_Receive0.ID ) ; Msg_Receive0.ID = 0 ;
printf( "DLC = 0x%x\n", Msg_Receive0.DLC ) ; Msg_Receive0.DLC = 0 ;
printf( "EIDFlag = 0x%x\n", Msg_Receive0.EIDFlag ) ; Msg_Receive0.EIDFlag = 0 ;
printf( "RTRFlag = 0x%x\n", Msg_Receive0.RTRFlag ) ; Msg_Receive0.RTRFlag = 0 ;
for( m = 0; m < 8; m++ )
{ printf( "\t0x%x", Msg_Receive0.Data[m] ) ; Msg_Receive0.Data[m] = 0 ; }
//}
//else if( (m&0x02) == 0 )
//{
ReceiveCANMessage( &Msg_Receive1, 1 ) ;
printf( "\n\nMsg_Receive1:\n" ) ;
printf( "ID = 0x%x\n", Msg_Receive1.ID ) ; Msg_Receive1.ID = 0 ;
printf( "DLC = 0x%x\n", Msg_Receive1.DLC ) ; Msg_Receive1.DLC = 0 ;
printf( "EIDFlag = 0x%x\n", Msg_Receive1.EIDFlag ) ; Msg_Receive1.EIDFlag = 0 ;
printf( "RTRFlag = 0x%x\n", Msg_Receive1.RTRFlag ) ; Msg_Receive1.RTRFlag = 0 ;
for( m = 0; m < 8; m++ )
{ printf( "\t0x%x", Msg_Receive1.Data[m] ) ; Msg_Receive1.Data[m] = 0 ; }
//}
//else printf( "\n\nCANINTF = 0x%x \n\n", m ) ;
//Delay( 800 ) ;
}
}
static char title[] = "CAN總線測試";
static char tip[] = "測試CAN總線通訊,按ESC鍵返回";
//Test_MCP2510Item在prog_entry.c里被引用
TEST_PROGRAM_ITEM Test_MCP2510Item = {
(TEST_PROGRAM)Test_MCP2510, //入口地址
title, //顯示名稱
tip, //幫助或提示信息,可為NULL
1}; //使用printf,puts,putch等函數時在LCD上也顯示輸出字符(串)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -