?? sja_bcanfunc.c
字號:
/*
********************************************************************************************************************
**描述: 獨立的CAN 控制器SJA1000基本硬件頭文件定義(BasicCAN 工作方式)
**文件名: SJA_BcanFunc.H
**應用語言: KEIL C51
**版本 : V1.0
**廣州周立功單片機發展有限公司 保留所有的版權
********************************************************************************************************************
*/
/*$page*/
#include "SJA_BCANCONF.H"
#include <string.h>
/************************************************************************
*以下為基本的函數說明(BasicCAN) *
************************************************************************/
/************************************************************************
*函數原型: bit BCAN_CREATE_COMMUNATION(void) *
*參數說明: 無 *
*返回值: *
* 0 ; 表示SJA1000接口正常 *
* 1 ; 表示SJA1000與處理器接口不正常 *
* *
*說明:該函數用于檢測CAN控制器的接口是否正常 *
************************************************************************/
bit BCAN_CREATE_COMMUNATION(void)
{
SJA_BCANAdr=REG_TEST; //訪問測試寄存器
*SJA_BCANAdr =0xaa; //寫入測試值
if(*SJA_BCANAdr == 0xaa)
{
return 0; //讀測試正確
}
else
{
return 1;
}
}
/************************************************************************
*函數原型: bit BCAN_ENTER_RETMODEL(void) *
*參數說明: 無 *
*返回值: *
* 0 ; 表示成功進入復位工作模式 *
* 1 ; 表示不能進入復位工作模式 *
* *
*說明: CAN控制器進入復位工作模式 *
************************************************************************/
bit BCAN_ENTER_RETMODEL(void)
{
unsigned char TempData;
SJA_BCANAdr = REG_CONTROL; //訪問地址指向控制寄存器
TempData= *SJA_BCANAdr; //保存原始值
*SJA_BCANAdr=(TempData|0x01); //置位復位請求
if((*SJA_BCANAdr&0x01) == 1)
{
return 0;
}
else
{
return 1;
}
}
/************************************************************************
*函數原型: bit BCAN_QUIT_RETMODEL(void) *
*參數說明: 無 *
*返回值: *
* 0 ; 表示成功退出復位工作模式 *
* 1 ; 表示不能退出復位工作模式 *
* *
*說明: CAN控制器退出復位工作模式 *
************************************************************************/
bit BCAN_QUIT_RETMODEL(void)
{
unsigned char TempData;
SJA_BCANAdr = REG_CONTROL; //訪問地址指向控制寄存器
TempData = *SJA_BCANAdr; //保存原始值
*SJA_BCANAdr=(TempData&0xfe); //清除復位請求
if((*SJA_BCANAdr&0x01) == 0)
{
return 0; //
}
else
{
return 1; //退出成功
}
}
/*
************************************************************************************************************************
**函數原型: char SJASetBandRateStandard(unsigned char BandRateSize)
**參數說明: BandRateSize 標準常用波特率(Kbps)
** 0 5
** 1 10
** 2 20
** 3 40
** 4 50
** 5 80
** 6 100
** 7 125
** 8 200
** 9 250
** 10 400
** 11 500
** 12 666
** 13 800
** 14 1000
**返回值:
** 0 ; 設置總線定時器成功
** SJA_SETBTR_ERR ; 設置總線定時器錯
** SJA_NOBTRSIZE ;波特率不能設為此值
**
**說明: 該函數用于設定在系統晶體為16MHZ時,常用的標準波特率的值。
** 參數BandRateSize只能為0~14,其它的值會返回SJA_NOBTRSIZE錯誤
** 本函數只能用于復位模式
************************************************************************************************************************
*/
unsigned char code SJA_BTR_CODETAB[]={
0xbf,0xff, //;5KBPS的預設值
0x67,0x2f, //;10KBPS的預設值
0x53,0x2F, //;20KBPS的預設值
0x87,0xFF, //;40KBPS的預設值
0x47,0x2F, //;50KBPS的預設值
0x83,0xFF, //;80KBPS的預設值
0x43,0x2f, //;100KBPS的預設值
0x03,0x1c, //;125KBPS的預設值
0x81,0xfa, //;200KBPS的預設值
0x01,0x1c, //;250KBPS的預設值
0x80,0xfa, //;400KBPS的預設值
0x00,0x1c, //;500KBPS的預設值
0x80,0xb6, //;666KBPS的預設值
0x00,0x16, //;800KBPS的預設值
0x00,0x14 //;1000KBPS的預設值
};
bit BCAN_SET_BANDRATE(unsigned char CAN_ByteRate)
{
bit ErrorFlag =1;
unsigned char ErrorCount = 0x20; //32次報錯
if(CAN_ByteRate>14){
ErrorFlag =1;
}
else{
while(--ErrorCount){
WriteSjaReg(REG_BTR0,SJA_BTR_CODETAB[CAN_ByteRate*2]);
WriteSjaReg(REG_BTR1,SJA_BTR_CODETAB[CAN_ByteRate*2+1]);
if(ReadSjaReg(REG_BTR0) != SJA_BTR_CODETAB[CAN_ByteRate*2])continue;
if(ReadSjaReg(REG_BTR1) != SJA_BTR_CODETAB[CAN_ByteRate*2+1])continue;
ErrorFlag=0;
break;
}//while結束
}
return ErrorFlag ;
}
/************************************************************************
;*函數原型: BCAN_SET_OBJECT *
*參數說明: *
* BCAN_ACR:存放驗收代碼寄存器(ACR)的參數設置 *
* BCAN_AMR:存放接收屏蔽寄存器(AMR)的參數設置 *
;*返回值: *
;* 0 ;通信對象設置成功 *
;* 1 ;通信對象設置失敗 *
;* *
;*說明:設置CAN節點的通訊對象,允許接收的報文ID號的高8位(D10--D3) 。 *
;* 允許接收的報文,是由AMR和ACR共同決定的. *
;* 滿足以下條件的ID號的報文才可以被接收 *
;*[(ID.10-ID.3)≡(AC.7-AC.0)]||(AM.7-AM.0)≡11111111 *
;* 該子程序只能用于復位模式 * *
;************************************************************************/
bit BCAN_SET_OBJECT(unsigned char BCAN_ACR,unsigned char BCAN_AMR)
{
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;
}
return 0;
}
/************************************************************************
;*函數原型: bit BCAN_SET_OUTCLK (unsigned char Out_Control, *
unsigned char Clock_Out); *
;*參數說明: *
* Out_Control:存放輸出控制寄存器 (OC) 的參數設置 *
* Clock_Out:存放時鐘分頻寄存器 (CDR) 的參數設置 *
* *
;*返回值: *
;* 0 ;設置成功 *
;* 1 ;設置失敗 *
;* *
;*說明:設置SJA1000的輸出模式和時鐘分頻 。該子程序只能用于復位模式 * *
;************************************************************************/
bit BCAN_SET_OUTCLK (unsigned char Out_Control,
unsigned char Clock_Out)
{
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_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)*
*參數說明: 特定幀各式的數據
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -