?? candeal2.h
字號:
////////candeal2.h///////////////////////
#include "can.h"
void remote_rqst_ini(char MsgNum,uint id){
uint temp;
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK; //指向IF1 Command Mask Registers
CAN0DAT = 0x00b3;
/* IF1 Command Mask Registers =0x00b3
WR/RD=1,Mask=0,Arb=1,Control=1,ClrIntPnd=0,TxRqst=0,DataA=1,DataB=1,一次發送8字節數據*/
CAN0ADR = IF1ARB1;
CAN0DAT = 0x0000;
/*IF1 Arbitration Registers1 =0x0000,即ID15-0=0*/
temp=id<<2;//標準id為ID28-ID18,所以要左移2位
temp&=0x1fff;
temp|=0x8000;
CAN0DAT = temp; //地址自增,指向IF1 Arbitration Registers2
/*IF1 Arbitration Registers2=100(id)00b
MsgVal=1,Xtd=0,為標準模式,擴展ID無效,Dir=0,為接收*/
CAN0DAT = 0x0488;
/*IF1 Message Control Registers=0x0488
NewDat=0,MsgLst=0,IntPnd=0,UMask=0,TxIE=0,RxIE=1,RmtEn=0,TxRqst=0
EoB=1,DLC3-0=1000,即數據長度為8*/
CAN0ADR = IF1CMDRQST;
CAN0DAT = MsgNum;
/*IF1 Command Request Registers=MsgNum,將以上配置寫入MsgNum號消息*/
}
void remote_rqst(char MsgNum){
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK;
CAN0DATL =0x87;//將TxRqst置1,發送遠程幀請求
CAN0ADR = IF1CMDRQST;
CAN0DAT = MsgNum;
}
void remote_send_ini(char MsgNum,uint id){
uint temp;
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK; //指向IF1 Command Mask Registers
CAN0DAT = 0x00b3;
/* IF1 Command Mask Registers =0x00b3
WR/RD=1,Mask=0,Arb=1,Control=1,ClrIntPnd=0,TxRqst=0,DataA=1,DataB=1,一次發送8字節數據*/
CAN0ADR = IF1ARB1;
CAN0DAT = 0x0000;
/*IF1 Arbitration Registers1 =0x0000,即ID15-0=0*/
temp=id<<2;//標準id為ID28-ID18,所以要左移2位
temp&=0x1fff;
temp|=0xa000;
CAN0DAT = temp; //地址自增,指向IF1 Arbitration Registers2
/*IF1 Arbitration Registers2=101(id)00b
MsgVal=1,Xtd=0,為標準模式,擴展ID無效,Dir=1,為發送*/
CAN0DAT = 0x0a88;
/*IF1 Message Control Registers=0x0488
NewDat=0,MsgLst=0,IntPnd=0,UMask=0,TxIE=1,RxIE=0,RmtEn=1,TxRqst=0
EoB=1,DLC3-0=1000,即數據長度為8*/
CAN0ADR = IF1CMDRQST;
CAN0DAT = MsgNum;
/*IF1 Command Request Registers=MsgNum,將以上配置寫入MsgNum號消息*/
}
void remote_send_updata(char MsgNum,char *p,char len){
char i;
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF2CMDMSK;
CAN0DATL = 0x08;
CAN0ADR = IF2CMDRQST;
CAN0DATL = MsgNum; /*將該消息IntPnd清零,注意一定要保證將中斷標志位清零,否則將一直發生中斷,陷入死機狀態*/
CAN0ADR = IF1CMDMSK;
CAN0DAT = 0x008b;
/* IF1 Command Mask Registers =0x008b
WR/RD=1,Mask=0,Arb=0,Control=0,ClrIntPnd=1(注意WR/RD=1時,ClrIntPnd=1對消息IntPnd清零是無效的),TxRqst=0,DataA=1,DataB=1,一次發送8字節數據*/
CAN0ADR = IF1DATA1;
for(i=0;i<len;i+=2){
CAN0DATH=*p++;
CAN0DATL=*p++;
}
CAN0ADR = IF1CMDRQST;
CAN0DATL = MsgNum;
}
void transmit (char MsgNum,char *p,char len)
/*將*p數據寫入can消息發送,len為數據長度*/
{ char i;
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK;
CAN0DAT = 0x0087;
/* IF1 Command Mask Registers =0x0087
WR/RD=1,Mask=0,Arb=0,Control=0,ClrIntPnd=0,TxRqst=1,DataA=1,DataB=1,一次發送8字節數據*/
CAN0ADR = IF1DATA1;
for(i=0;i<len;i+=2){
CAN0DATH=*p++;
CAN0DATL=*p++;
}
CAN0ADR = IF1CMDRQST;
CAN0DATL = MsgNum;
}
void receive_data (uchar MsgNum,char *p,char len)
/*將接收數據存入*p指針中,len為接收長度*/
{
char i;
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF2CMDMSK;
CAN0DATL = 0x0f;
/* IF1 Command Mask Registers =0xxx0f
WR/RD=0,Mask=0,Arb=0,Control=0,ClrIntPnd=1,NewDat=1,DataA=1,DataB=1,一次發送8字節數據*/
CAN0ADR = IF2CMDRQST;
CAN0DATL = MsgNum;
CAN0ADR = IF2DATA1;
for(i=0;i<len;i+=2){
*p++=CAN0DATH;
*p++=CAN0DATL;
}
}
void delay1ms(uint time){//延遲1ms*time,這不是一個精確值
uint i;
uint j;
for (i=0;i<time;i++){
for(j=0;j<300;j++);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -