?? sja1000.c
字號(hào):
/*
****************************************Copyright (c)**************************************************
** 廣州致遠(yuǎn)電子有限公司
** CAN開(kāi)發(fā)組
** http://www.zyinside.com
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: SJA1000.c
**創(chuàng) 建 人: 滕欣欣
**創(chuàng) 建 日 期: 2005-04-13
**描 述: SJA1000 CAN控制器操作函數(shù)定義
**最后修改日期: 2006-03-03
**原 始 版 本: v1.0
**最 后 版 本: v1.2
**--------------歷史修改--------------------------------------------------------------------------------
**修 改 人:
**修 改 日 期:
**修 改 原 因:
**修 改 版 本:
********************************************************************************************************
*/
#include "SJA1000.h"
#include "config.h"
extern stcSJA1000_BufInfo SJA1000_RxBuf;
/*
********************************************************************************************************************
**函數(shù)原型 : BOOL SJA_SoftRst(BOOL bIsRst)
**參數(shù)說(shuō)明 : bIsRst -> TURE SJA1000進(jìn)入軟件復(fù)位模式
** : FALSE SJA1000退出軟件復(fù)位模式
**返回值 : TURE -> 成功完成相應(yīng)設(shè)置
** : FALSE -> 設(shè)置失敗
**說(shuō) 明 :
********************************************************************************************************************
*/
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;
}
/*
********************************************************************************************************************
**函數(shù)原型 : BOOL SetModeReg(INT8U Val, BOOL bIsEn)
**參數(shù)說(shuō)明 : Val -> 設(shè)置模式值 MOD_LOM 只聽(tīng)模式
** : MOD_STM 自測(cè)試模式
** : MOD_AFM_SIG 單濾波方式
** : MOD_AFM_DOB 雙濾波方式
** : bIsEn -> 設(shè)定方式 TRUE 使能設(shè)定
** ; FALSE 禁能設(shè)定
**返回值 : TURE -> 成功完成相應(yīng)設(shè)置
** : FALSE -> 設(shè)置失敗
**說(shuō) 明 : 該函數(shù)設(shè)定SJA1000模式,必須在軟件復(fù)位模式中調(diào)用,否則失敗,模式值可并聯(lián)使用
********************************************************************************************************************
*/
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;
}
/*
********************************************************************************************************************
**函數(shù)原型 : BOOL EnterSleepMod(BOOL IsEn)
**參數(shù)說(shuō)明 : IsEn -> SJA1000請(qǐng)求進(jìn)入復(fù)位模式
**返回值 : TURE -> 成功完成相應(yīng)設(shè)置
** : FALSE -> 設(shè)置失敗
**說(shuō) 明 : 該函數(shù)必須在工作模式下調(diào)用,否則失敗
********************************************************************************************************************
*/
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;
}
/*
********************************************************************************************************************
**函數(shù)原型 : BOOL SetCommand(INT8U Cmd)
**參數(shù)說(shuō)明 : Cmd -> 命令字 CMR_NOM_SD 正常發(fā)送
** : CMR_SIG_SD 單次發(fā)送
** : CMR_SLF_SD 自發(fā)自收
** : CMR_CL_BUF 釋放接收緩緩沖區(qū)
** : CMR_CL_DATA 清除數(shù)據(jù)溢出狀態(tài)
**返回值 : 無(wú)
**說(shuō) 明 : 每次調(diào)用該函數(shù)只能發(fā)送一條命令值
********************************************************************************************************************
*/
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);
}
/*
********************************************************************************************************************
**函數(shù)原型 : BOOL SetInterrupt(INT8U Val, BOOL IsEn)
**參數(shù)說(shuō)明 : Val -> 中斷值 IER_RC--IER_BE
** : IsEn -> 是否使能該中斷
**返回值 :
**說(shuō) 明 : 中斷值可并聯(lián)使用,全部使能,禁能中斷時(shí)可使用 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;
}
}
/*
********************************************************************************************************************
**函數(shù)原型 : BOOL SetBaudRate(INT16U BaudVal)
**參數(shù)說(shuō)明 : BaudVal -> 波特率值,由 定時(shí)器0<<8|定時(shí)器1 組成
**返回值 :
**說(shuō) 明 : 該函必須在軟件復(fù)位模式下調(diào)用
********************************************************************************************************************
*/
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;
}
/*
********************************************************************************************************************
**函數(shù)原型 : BOOL SetOutPutMod(INT8U Val)
**參數(shù)說(shuō)明 : Val -> 輸出模式值
**返回值 :
**說(shuō) 明 : 通常設(shè)為0x1A
********************************************************************************************************************
*/
BOOL SetOutPutMod(INT8U Val)
{
Write_SJA1000(Val,OCR);
return (Val == Read_SJA1000(OCR))? TRUE:FALSE;
}
/*
********************************************************************************************************************
**函數(shù)原型 : BOOL SetClkDiv(INT8U CAN_Mod,BOOL bRxINTEn,BOOL bClkOFF,INT8U Div)
**參數(shù)說(shuō)明 : CAN_Mod -> CAN模式值 BAIS_CAN
** : PELI_CAN
** : bRxINTEn -> 是否使用Tx1引腳作為接收中斷指示
** : bClkOFF -> 是否使用頻率輸出引腳
** : Div -> 0-7,表示(Val+1)*2分頻
**返回值 :
**說(shuō) 明 : 該函數(shù)必須在軟件復(fù)位模式下調(diào)用
********************************************************************************************************************
*/
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);
}
/*
********************************************************************************************************************
**函數(shù)原型 : void SetTxBuf(stcSJA1000_TxInfo *pTxInfo)
**參數(shù)說(shuō)明 : pTxInfo -> 發(fā)送數(shù)據(jù)的結(jié)構(gòu)體指針
**返回值 :
**說(shuō) 明 : 調(diào)用該函數(shù)寫(xiě)入欲發(fā)送的數(shù)據(jù)
********************************************************************************************************************
*/
void SetTxBuf(stcSJA1000_BufInfo *pTxInfo)
{
INT8U i;
INT32U IDTemp;
Write_SJA1000(pTxInfo->FrIf.Byte,TXBUF);
if(1 == pTxInfo->FrIf.Bits.FF)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -