?? sja1000.c
字號:
/*
****************************************Copyright (c)**************************************************
** 廣州致遠電子有限公司
** CAN開發組
** http://www.zyinside.com
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: SJA1000.c
**創 建 人: 滕欣欣
**創 建 日 期: 2005-04-13
**描 述: SJA1000 CAN控制器操作函數定義
**最后修改日期: 2006-03-03
**原 始 版 本: v1.0
**最 后 版 本: v1.2
**--------------歷史修改--------------------------------------------------------------------------------
**修 改 人:
**修 改 日 期:
**修 改 原 因:
**修 改 版 本:
********************************************************************************************************
*/
#include "SJA1000.h"
#include "config.h"
extern stcSJA1000_BufInfo SJA1000_RxBuf;
/*
********************************************************************************************************************
**函數原型 : BOOL SJA_SoftRst(BOOL bIsRst)
**參數說明 : bIsRst -> TURE SJA1000進入軟件復位模式
** : FALSE SJA1000退出軟件復位模式
**返回值 : TURE -> 成功完成相應設置
** : FALSE -> 設置失敗
**說 明 :
********************************************************************************************************************
*/
BOOL SJA_SoftRst(BOOL IsRst)
{
uRsgMod ModTemp;
INT8U Statu;
ModTemp.Byte = Read_SJA1000(MOD)&0x1F;
ModTemp.Bits.RM = (TRUE == IsRst)? 1:0;
Write_SJA1000(ModTemp.Byte, MOD);
ModTemp.Byte = Read_SJA1000(MOD)&0x1F;
Statu = (ModTemp.Bits.RM == 1)? TRUE:FALSE;
return (Statu == IsRst)? TRUE:FALSE;
}
/*
********************************************************************************************************************
**函數原型 : BOOL SetModeReg(INT8U Val, BOOL bIsEn)
**參數說明 : Val -> 設置模式值 MOD_LOM 只聽模式
** : MOD_STM 自測試模式
** : MOD_AFM_SIG 單濾波方式
** : MOD_AFM_DOB 雙濾波方式
** : bIsEn -> 設定方式 TRUE 使能設定
** ; FALSE 禁能設定
**返回值 : TURE -> 成功完成相應設置
** : FALSE -> 設置失敗
**說 明 : 該函數設定SJA1000模式,必須在軟件復位模式中調用,否則失敗,模式值可并聯使用
********************************************************************************************************************
*/
BOOL SetModeReg(INT8U Val, BOOL bIsEn)
{
uRsgMod ModTemp;
ModTemp.Byte = Read_SJA1000(MOD)&0x1F;
if(ModTemp.Bits.RM)
{
if(Val&MOD_LOM)
{
ModTemp.Bits.LOM = (TRUE == bIsEn)? 1:0;
}
if(Val&MOD_STM)
{
ModTemp.Bits.STM = (TRUE == bIsEn)? 1:0;
}
if(Val&MOD_AFM_SIG)
{
ModTemp.Bits.AFM = 1;
}
if(Val&MOD_AFM_DOB)
{
ModTemp.Bits.AFM = 0;
}
}
else
return FALSE;
Write_SJA1000(ModTemp.Byte,MOD);
if(ModTemp.Byte == (Read_SJA1000(MOD)&0x1F))
{
return TRUE;
}
else
return FALSE;
}
/*
********************************************************************************************************************
**函數原型 : BOOL EnterSleepMod(BOOL IsEn)
**參數說明 : IsEn -> SJA1000請求進入復位模式
**返回值 : TURE -> 成功完成相應設置
** : FALSE -> 設置失敗
**說 明 : 該函數必須在工作模式下調用,否則失敗
********************************************************************************************************************
*/
BOOL EnterSleepMod(BOOL IsEn)
{
uRsgMod ModTemp;
INT8U Statu;
ModTemp.Byte = Read_SJA1000(MOD)&0x1F;
if(ModTemp.Bits.RM) return FALSE;
ModTemp.Bits.SM = (TRUE == IsEn)? 1:0;
Write_SJA1000(ModTemp.Byte,MOD);
ModTemp.Byte = Read_SJA1000(MOD)&0x1F;
Statu = (ModTemp.Bits.SM == 1)? TRUE:FALSE;
return (Statu == IsEn)? TRUE:FALSE;
}
/*
********************************************************************************************************************
**函數原型 : BOOL SetCommand(INT8U Cmd)
**參數說明 : Cmd -> 命令字 CMR_NOM_SD 正常發送
** : CMR_SIG_SD 單次發送
** : CMR_SLF_SD 自發自收
** : CMR_CL_BUF 釋放接收緩緩沖區
** : CMR_CL_DATA 清除數據溢出狀態
**返回值 : 無
**說 明 : 每次調用該函數只能發送一條命令值
********************************************************************************************************************
*/
void SetCommand(INT8U Cmd)
{
uRsgCmd CMRTemp;
CMRTemp.Byte = 0;
switch(Cmd)
{
case CMR_SIG_SD:
CMRTemp.Bits.AT = 1;
case CMR_NOM_SD:
if(1 == (Read_SJA1000(MOD)&0x04))
{
while(TRUE != SJA_SoftRst(TRUE));
while(TRUE != SetModeReg(MOD_STM,FALSE));
while(TRUE != SJA_SoftRst(FALSE));
}
CMRTemp.Bits.TR = 1;
break;
case CMR_SLF_SD:
if(0 == (Read_SJA1000(MOD)&0x04))
{
while(TRUE != SJA_SoftRst(TRUE));
while(TRUE != SetModeReg(MOD_STM,TRUE));
while(TRUE != SJA_SoftRst(FALSE));
}
CMRTemp.Bits.SRR = 1;
CMRTemp.Bits.AT = 1;
break;
case CMR_CL_BUF:
CMRTemp.Bits.RR = 1;
break;
case CMR_CL_DATA:
CMRTemp.Bits.CDO = 1;
break;
default:
break;
}
Write_SJA1000(CMRTemp.Byte,CMR);
}
/*
********************************************************************************************************************
**函數原型 : BOOL SetInterrupt(INT8U Val, BOOL IsEn)
**參數說明 : Val -> 中斷值 IER_RC--IER_BE
** : IsEn -> 是否使能該中斷
**返回值 :
**說 明 : 中斷值可并聯使用,全部使能,禁能中斷時可使用 IER_ALL
********************************************************************************************************************
*/
BOOL SetInterrupt(INT8U Val, BOOL IsEn)
{
INT8U IntVal;
INT8U temp;
if(TRUE == IsEn)
{
Write_SJA1000(Val,IER);
temp = Read_SJA1000(IER);
if(temp == Val)
{
return TRUE;
}
else
{
return FALSE;
}
}
else
{
IntVal = Read_SJA1000(IER);
IntVal &= ~Val;
Write_SJA1000(IntVal,IER);
return (IntVal == Read_SJA1000(IER))? TRUE:FALSE;
}
}
/*
********************************************************************************************************************
**函數原型 : BOOL SetBaudRate(INT16U BaudVal)
**參數說明 : BaudVal -> 波特率值,由 定時器0<<8|定時器1 組成
**返回值 :
**說 明 : 該函必須在軟件復位模式下調用
********************************************************************************************************************
*/
BOOL SetBaudRate(INT16U BaudVal)
{
INT16U h, l;
if(1 == (Read_SJA1000(MOD)&0x01))
{
Write_SJA1000((INT8U)(BaudVal>>8),BTR0);
Write_SJA1000((INT8U)(BaudVal&0xFF),BTR1);
h = Read_SJA1000(BTR0) << 8;
l = Read_SJA1000(BTR1);
if(BaudVal == (h + l))
{
return TRUE;
}
else
{
return FALSE;
}
}
else
return FALSE;
}
/*
********************************************************************************************************************
**函數原型 : BOOL SetOutPutMod(INT8U Val)
**參數說明 : Val -> 輸出模式值
**返回值 :
**說 明 : 通常設為0x1A
********************************************************************************************************************
*/
BOOL SetOutPutMod(INT8U Val)
{
Write_SJA1000(Val,OCR);
return (Val == Read_SJA1000(OCR))? TRUE:FALSE;
}
/*
********************************************************************************************************************
**函數原型 : BOOL SetClkDiv(INT8U CAN_Mod,BOOL bRxINTEn,BOOL bClkOFF,INT8U Div)
**參數說明 : CAN_Mod -> CAN模式值 BAIS_CAN
** : PELI_CAN
** : bRxINTEn -> 是否使用Tx1引腳作為接收中斷指示
** : bClkOFF -> 是否使用頻率輸出引腳
** : Div -> 0-7,表示(Val+1)*2分頻
**返回值 :
**說 明 : 該函數必須在軟件復位模式下調用
********************************************************************************************************************
*/
BOOL SetClkDiv(INT8U CAN_Mod,BOOL bRxINTEn,BOOL bClkOFF,INT8U Div)
{
INT8U CDRTemp = 0;
INT8U RxINTTemp = (bRxINTEn == TRUE)? 1:0;
INT8U ClkOffTemp = (bClkOFF == TRUE)? 1:0;
if(1 == (Read_SJA1000(MOD)&0x01))
{
CDRTemp = CAN_Mod<<7|0x01<<6|RxINTTemp<<5|ClkOffTemp<<3|Div;
Write_SJA1000(CDRTemp,CDR);
}
else
return FALSE;
return ((CDRTemp == Read_SJA1000(CDR))? TRUE:FALSE);
}
/*
********************************************************************************************************************
**函數原型 : void SetTxBuf(stcSJA1000_TxInfo *pTxInfo)
**參數說明 : pTxInfo -> 發送數據的結構體指針
**返回值 :
**說 明 : 調用該函數寫入欲發送的數據
********************************************************************************************************************
*/
void SetTxBuf(stcSJA1000_BufInfo *pTxInfo)
{
INT8U i;
INT32U IDTemp;
Write_SJA1000(pTxInfo->FrIf.Byte,TXBUF);
if(1 == pTxInfo->FrIf.Bits.FF)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -