?? can.h
字號:
//接收代碼變量,接收屏蔽變量,發送緩沖變量,接收緩沖變量,發送數據,接收數據,點擊變量
unsigned char ACR[4],AMR[4],TXD_Buffer[13],RXD_Buffer[13],TXD_Data,RXD_Data;
void CAN_TXD(void);
void CAN_RXD(void);
//CAN初始化
void Init_CAN(void)
{
unsigned char bdata temp; //建立存儲在bdata中的臨時變量temp
do
{
MODR=0x01;
temp=MODR; //模式寄存器-設置復位模式而且單驗收濾波模式
}
while(!(temp&0x01)); //判斷
CDR=0x88; //時鐘分頻寄存器-設置PeliCAN模式,Clock off有效
BTR0=0x31; //總線時序寄存器-波特率為10kbps
BTR1=0x1c;
IER=0x01; //中斷使能寄存器-接收中斷使能
OCR=0xaa; //輸出控制寄存器-借簽...
CMR=0x04; //命令寄存器-釋放RXFIF0
ACR0=ACR[0]; //接收代碼寄存器-本節點地址位CAN0
ACR1=ACR[1];
ACR2=ACR[2];
ACR3=ACR[3];
AMR0=AMR[0]; //接收屏蔽寄存器-無任何屏蔽
AMR1=AMR[1];
AMR2=AMR[2];
AMR3=AMR[3]; //最后兩位為無用位,必須設置為邏輯1
do
{
MODR=0x00;
temp=MODR; //模式寄存器-推出復位模式,保持單驗收濾波模式
}
while(temp&0x01); //判斷...
}
//CAN發送函數
void CAN_TXD(void)
{
unsigned char bdata temp;
do
{
temp=SR; //判斷報文接收完畢?
}
while(temp&0x10); //SR.4=0 發送閑置,SR.4=1 發送狀態中
do
{
temp=SR; //判斷最后報文請求?
}
while(!(temp&0x08)); //SR.3=0 沒有余報文請求,SR.3=1 還存在報文請求
do
{
temp=SR; //判斷TXFIFO是否鎖定?
}
while(!(temp&0x04)); //SR.2=0 鎖定,SR.2=1 開放
TBSR0=TXD_Buffer[0];
TBSR1=TXD_Buffer[1];
TBSR2=TXD_Buffer[2];
TBSR3=TXD_Buffer[3];
TBSR4=TXD_Buffer[4];
TBSR5=TXD_Buffer[5];
TBSR6=TXD_Buffer[6];
TBSR7=TXD_Buffer[7];
TBSR8=TXD_Buffer[8];
TBSR9=TXD_Buffer[9];
TBSR10=TXD_Buffer[10];
TBSR11=TXD_Buffer[11];
TBSR12=TXD_Buffer[12];
CMR=0x01; //命令寄存器-自動發送請求
}
//CAN接收函數
void CAN_RXD(void)
{
unsigned char temp;
temp = IR;
if( temp & 0x01) //判斷是否接收中斷
{
RXD_Buffer[0]=RBSR0; //讀取RXFIFO
RXD_Buffer[1]=RBSR1;
RXD_Buffer[2]=RBSR2;
RXD_Buffer[3]=RBSR3;
RXD_Buffer[4]=RBSR4;
RXD_Buffer[5]=RBSR5;
RXD_Buffer[6]=RBSR6;
RXD_Buffer[7]=RBSR7;
RXD_Buffer[8]=RBSR8;
RXD_Buffer[9]=RBSR9;
RXD_Buffer[10]=RBSR10;
RXD_Buffer[11]=RBSR11;
RXD_Buffer[12]=RBSR12;
CMR = 0X04; //釋放RXFIFO中的空間
temp = ALC; //釋放仲裁隨時捕捉寄存器
temp = ECC; //釋放錯誤代碼捕捉寄存器
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -