?? sja_bcanfunc.c
字號:
/************************************************************************
*函數原型: bit BCAN_HW_INIT(unsigned char BCAN_ACR, *
* unsigned char BCAN_AMR, *
* unsigned char Bus_Timing0, *
* unsigned char Bus_Timing1, *
* unsigned char Out_Control, *
* unsigned char Clock_Out *
* ) *
*參數說明: *
* BCAN_ACR:存放驗收代碼寄存器(ACR)的參數設置 *
* BCAN_AMR:存放接收屏蔽寄存器(AMR)的參數設置 *
* Bus_Timing0:存放總線定時0寄存器(BTR0)的參數設置 *
* Bus_Timing1:存放總線定時1寄存器(BTR1)的參數設置 *
* Out_Control:存放輸出控制寄存器 (OC) 的參數設置 *
* Clock_Out:存放時鐘分頻寄存器 (CDR) 的參數設置 *
* *
*返回值: *
* 0 ; 表示初始化成功 *
* 1 ; 表示初始化失敗 *
* *
*說明:CAN控制器的初始化只能在復位模式下才能完成。初始化操作之前請先進入*
* 到復位操作模式,并將要初始化的各參數的值按數據手冊中的計算方法,正 *
* 確的按實際需要計算好參數后,將參數寫入對應的寄存器 。 *
*注: 為了CAN控制器的正確運行,請務必仔細的閱讀SJA1000的數據手冊 *
* *
*示例:設應用系統中晶體頻率16MHZ,節點只接收ID(標志符)高八位為 *
* '10101010'的消息,系統波特率為50Kbit/s,關閉CLKOUT輸出。 *
* 則根據數據手冊中的計算方法的各參數如下: *
* ACR==0AAH,AMR==00H,BTR0==0C9H,BTR1==0C9H,OC==0FFH,CDR=48H *
* 則調用本函數為: *
* BCAN_HW_INIT(0xaa,0x00,0xc9,0xc9,0xff,0x48) *
************************************************************************
bit BCAN_HW_INIT(unsigned char BCAN_ACR,
unsigned char BCAN_AMR,
unsigned char Bus_Timing0,
unsigned char Bus_Timing1,
unsigned char Out_Control,
unsigned char Clock_Out
)
{
SJA_BCANAdr=REG_ACR; //訪問地址指向驗收代碼寄存器(ACR)
*SJA_BCANAdr=BCAN_ACR; //寫入參數
if(*SJA_BCANAdr != BCAN_ACR) //校驗寫入值
{
return 1;
}
SJA_BCANAdr=REG_AMR; //訪問地址指向驗收屏蔽寄存器(AMR)
*SJA_BCANAdr=BCAN_AMR; //寫入參數
if(*SJA_BCANAdr != BCAN_AMR) //校驗寫入值
{
return 1;
}
SJA_BCANAdr=REG_BTR0; //訪問地址指向總線定時寄存器0
*SJA_BCANAdr=Bus_Timing0; //寫入參數
if(*SJA_BCANAdr != Bus_Timing0)//校驗寫入值
{
return 1;
}
SJA_BCANAdr=REG_BTR1; //訪問地址指向總線定時寄存器0
*SJA_BCANAdr=Bus_Timing1; //寫入參數
if(*SJA_BCANAdr != Bus_Timing1)//校驗寫入值
{
return 1;
}
SJA_BCANAdr=REG_OCR ; //訪問地址指向輸出控制寄存器
*SJA_BCANAdr=Out_Control; //寫入參數
if(*SJA_BCANAdr != Out_Control)//校驗寫入值
{
return 1;
}
SJA_BCANAdr=REG_CDR; //訪問地址指向輸出控制寄存器
*SJA_BCANAdr=Clock_Out; //寫入參數
return 0;
}
/************************************************************************
*函數原型: bit BCAN_DATA_WRITE(unsigned char *SendDataBuf)*
*參數說明: 特定幀各式的數據? *
*返回值: *
* 0 ; 表示將數據成功的送至發送緩沖區 *
* 1 ; 表示上一次的數據正在發送, *
* ; 表示發送緩沖區被鎖定,不能寫入數據 *
* ; 表示寫入數據錯誤 *
*說明: 將待發送特定幀各式的數據,送入SJA1000發送緩存區中,然后啟動 *
* SJA1000發送。 *
* 特定幀格式為:開始的兩個字節存放 '描述符' ,以后的為數據 *
* 描述符包括11位長的ID(標志符)\1位RTR\4位描述數據長度的DLC共16位 *
* *
*注:本函數的返回值僅指示,將數據正確寫入SJA1000發送緩存區中與否。 *
* 不指示SJA1000將該數據正確發送到CAN總線上完畢與否 *
************************************************************************/
bit BCAN_DATA_WRITE(unsigned char *SendDataBuf)
{
unsigned char TempCount;
SJA_BCANAdr = REG_STATUS; //訪問地址指向狀態寄存器
if((*SJA_BCANAdr&0x08) == 0) //判斷上次發送是否完成
{
return 1;
}
if((*SJA_BCANAdr&0x04)==0) //判斷發送緩沖區是否鎖定
{
return 1;
}
SJA_BCANAdr = REG_TxBuffer1; //訪問地址指向發送緩沖區1
if((SendDataBuf[1]&0x10)==0) //判斷RTR,從而得出是數據幀還是遠程幀
{
TempCount =(SendDataBuf[1]&0x0f)+2; //輸入數據幀
}
else
{
TempCount =2; //遠程幀
}
memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
return 0;
}
/************************************************************************
*函數原型: bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf); *
*參數說明: RcvDataBuf,存放微處理器保存數據緩沖區 *
*返回值: 0;接收成功 *
* 1;接收失敗 *
*說明:CAN控制器接收數據,僅限于接收數據 *
************************************************************************/
bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf)
{
unsigned char TempCount;
SJA_BCANAdr = REG_STATUS; //訪問地址指向狀態寄存器
if((*SJA_BCANAdr&0x01)==0) //判斷報文是否有效
{
return 1;
}
SJA_BCANAdr = REG_RxBuffer2; //訪問地址指向接收緩沖區2
if((*SJA_BCANAdr&0x10)==0) //如果是數據幀
{
TempCount=(*SJA_BCANAdr&0x0f)+2; //計算報文中數據的個數
}
else
{
TempCount=2;
}
SJA_BCANAdr = REG_RxBuffer1; //訪問地址指向接收緩沖區1
memcpy(RcvDataBuf,SJA_BCANAdr,TempCount);//讀取接收緩沖區的報文
return 0;
}
/************************************************************************
*函數原型: bit BCAN_CMD_PRG(unsigned char cmd) *
*參數說明: cmd:sja1000運行的命令字 *
* 01:發送請求 *
* 02:中止發送 *
* 04:釋放接收緩沖區 *
* 08:清除超載狀態 *
* 0x10:進入睡眠狀態 *
* *
*返回值: *
* 0 ; 表示命令執行成功 *
* 1 ; 表示命令執行失敗 *
* *
*說明: 執行sja1000命令 *
************************************************************************/
bit BCAN_CMD_PRG(unsigned char cmd)
{
SJA_BCANAdr=REG_COMMAND; //訪問地址指向命令寄存器
*SJA_BCANAdr=cmd; //啟動命令字
switch(cmd)
{
case TR_CMD: //發送請求命令
return 0;
break;
case AT_CMD: //夭折發送命令
SJA_BCANAdr = REG_STATUS; //訪問地址指向狀態寄存器
if((*SJA_BCANAdr & 0x20)==0)//判斷是否正在發送
{
return 0;
}
else
{
return 1;
}
break;
case RRB_CMD: //釋放接收緩沖區
SJA_BCANAdr = REG_STATUS; //訪問地址指向狀態寄存器
if((*SJA_BCANAdr & 0x01)==1)//判斷是否釋放成功
{
return 1;
}
else
{
return 0;
}
break;
case COS_CMD: //清除超載狀態
SJA_BCANAdr = REG_STATUS; //訪問地址指向狀態寄存器
if((*SJA_BCANAdr & 0x02)==0)//判斷清除超載是否成功
{
return 0;
}
else
{
return 1;
}
break;
case GTS_CMD: //進入睡眠狀態命令
return 0;
break;
default:
return 1;
break;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -