?? can.c
字號(hào):
#include "can.h"
#include "reg52.h"
void SJAInit(tByte const Reg_acr)
{
MODE = 0x09; //模式寄存器,單驗(yàn)收濾波器,進(jìn)入復(fù)位模式
CDR = 0x88; //時(shí)鐘分頻R,選擇增強(qiáng)CAN模式,關(guān)閉CLKOUT輸出
IER = 0x0d; //中斷使能寄存器,開溢出、錯(cuò)誤、接收中斷
BTR0 = 0x03; //總線定時(shí)寄存器
BTR1 = 0xff; //總線定時(shí)寄存器二,6MHz晶振,波特率30Kbps
OCR = 0xaa; //輸出控制寄存器
ACR0 = Reg_acr; //驗(yàn)收代碼ACR0
ACR1 = 0xff; //驗(yàn)收代碼ACR1,以下無關(guān)
ACR2 = 0xff; //驗(yàn)收代碼ACR2
ACR3 = 0xff; //驗(yàn)收代碼ACR3
AMR0 = 0x00; //驗(yàn)收屏蔽寄存器AMR0=00H
AMR1 = 0xff; //驗(yàn)收屏蔽寄存器AMR1,以下無關(guān)
AMR2 = 0xff; //驗(yàn)收屏蔽寄存器AMR2
AMR3 = 0xff; //驗(yàn)收屏蔽寄存器AMR3
RBSA = 0x00; //接收緩沖器FIFO起始地址為0
TXER = 0x00; //清除發(fā)送錯(cuò)誤計(jì)數(shù)器
ECC = 0x00; //清除錯(cuò)誤代碼捕捉寄存器
MODE = 0x08; //單濾波方式,返回工作方式
}
tByte SJASendData(tByte *Tdata,tByte const DatLen,tByte const TarID,SaID,TxRx)
{
static tByte TempData;
static tByte TempValue;
TempData = SR; //讀狀態(tài)寄存器
P1 = SR;
do //判斷是否正在接收正在接收則等待
{
TempData = SR; //TempValue = 1則等待
}while(TempData & Bit(4));
do //判斷上次發(fā)送是否完成未完成則等待發(fā)送完成
{ //TempValue = 0則等待
TempData = SR;
}while(!(TempData & Bit(3)));
do //判斷發(fā)送緩沖區(qū)是否鎖定鎖定則等待
{ //TempValue = 0則等待
TempData = SR;
}while(!(TempData & Bit(2)));
FIN(0) = TxRx;
ID1 = TarID;
ID2 = SaID;
//開始發(fā)送數(shù)據(jù),一共8個(gè)字節(jié),全部為有效數(shù)據(jù)
for(TempValue = 0;TempValue<DatLen;TempValue++)
{
DAT1(TempValue) = Tdata[TempValue];
}
CMR = 0x01; //啟動(dòng)SJA1000 發(fā)送
return 0;
}
tByte SJARecvData(tByte *Rdata,tByte const DatLen)
{
static tByte TempData;
static tByte TempValue;
TempData = SR; //讀狀態(tài)寄存器
TempValue = (TempData & 0xc3);
if(!TempValue ) //讀取總線脫離、錯(cuò)誤狀態(tài)、接收溢出、有數(shù)據(jù)等位
{
return 1; //總線接收失敗推出
}
if(TempData & Bit(7))
{
TempData = IR; //IR中斷寄存器,出現(xiàn)總線脫離,讀中斷寄存器,清除中斷位
MODE = 0x08; //推出復(fù)位模式,進(jìn)入工作模式
return 2; //總線接收失敗
}
TempData = IR;
if(TempData & Bit(3))
{
CMR = 0x0c; //數(shù)據(jù)溢出處理,清除數(shù)據(jù)溢出位,釋放接收緩沖區(qū)
return 3; //總線接收失敗
}
if(!(TempData & Bit(0)))
{
TempValue = ALC; //釋放仲裁丟失捕捉寄存器和錯(cuò)誤捕捉寄存器
TempValue = ECC;
return 4; //總線接受失敗
}
//TempData = FIN; //遠(yuǎn)程幀處理
if(TempData & Bit(2))
{
CMR = 0x04;
TempValue = ALC; //釋放仲裁丟失捕捉寄存器和錯(cuò)誤捕捉寄存器
TempValue = ECC;
return 5;
}
for(TempValue = 0;TempValue<DatLen;TempValue++)
{
Rdata[TempValue]= FIN(TempValue);
}
CMR = 0x04;
TempValue = ALC; //釋放仲裁丟失捕捉寄存器和錯(cuò)誤捕捉寄存器
TempValue = ECC;
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -