?? canfunc.c
字號(hào):
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機(jī)發(fā)展有限公司
** 研 究 所
** 產(chǎn)品一部
** http://www.zlgmcu.com
**-----------------------------------------------------------文件信息--------------------------------------------------------------------------------
** 文 件 名: CANFUNC.C
** 版 本: v1.0
** 日 期: 2004年2月23日
** 描 述: CAN模塊功能操作函數(shù)說(shuō)明文件
********************************************************************************************************/
#define _CANFUNC_GLOBAL_
#include "INCLUDES.H"
/*
***********************************************************************************************************
**函數(shù)原型 : void HwRstCAN (eCANNUM CanNum)
**參數(shù)說(shuō)明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規(guī)定的值
**返回值 : 無(wú)
**說(shuō) 明 : 本函數(shù)用于硬件復(fù)位CAN控制器,主要是CAN模塊掉電,用于省電處理
************************************************************************************************************/
void HwRstCAN(eCANNUM CanNum)
{
PCONP &= ~((INT32U)0x01 << (13+CanNum));
}
/*
***********************************************************************************************************
**函數(shù)原型 : void HwEnCAN (eCANNUM CanNum)
**參數(shù)說(shuō)明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規(guī)定的值
**返回值 : 無(wú)
**說(shuō) 明 : 本函數(shù)用于硬件使能CAN控制器
************************************************************************************************************/
void HwEnCAN(eCANNUM CanNum)
{
CANAFMR.Bits.AccBP_BIT =1;
PCONP |= ((INT32U)0x01 << (13+CanNum));
switch(CanNum)
{
case CAN1:
PINSEL1 &= ~((INT32U)0x03 << 18);
PINSEL1 |= ((INT32U)0x01 << 18);
break;
case CAN2:
PINSEL1 &= ~((INT32U)0x0F << 14);
PINSEL1 |= ((INT32U)0x05 << 14);
break;
/////////////////////////////////////////
#if (CAN_MAX_NUM == 4)
case CAN3:
PINSEL1 &= ~((INT32U)0x0F << 10);
PINSEL1 |= ((INT32U)0x06 << 10);
break;
case CAN4:
PINSEL1 |= ((INT32U)0x0F << 24);
break;
#endif
/////////////////////////////////////////
default:
break;
}
}
/*
***********************************************************************************************************
**函數(shù)原型 : INT32U SoftRstCAN (eCANNUM CanNum)
**參數(shù)說(shuō)明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規(guī)定的值
**返回值 : =0,表示復(fù)位成功; !=0,復(fù)位不成功;
**說(shuō) 明 : 本函數(shù)用于軟件復(fù)位CAN控制器
************************************************************************************************************/
INT32U SoftRstCAN(eCANNUM CanNum)
{
CANMOD(CanNum).Bits.RM_BIT =1;
return(!CANMOD(CanNum).Bits.RM_BIT );
}
/*
***********************************************************************************************************
**函數(shù)原型 : INT32U SoftEnCAN (eCANNUM CanNum)
**參數(shù)說(shuō)明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規(guī)定的值
**返回值 : =0,表示成功使CAN控制器進(jìn)入工作模式; !=0,不成功;
**說(shuō) 明 : 本函數(shù)用于軟件使能CAN控制器
************************************************************************************************************/
INT32U SoftEnCAN(eCANNUM CanNum)
{
CANMOD(CanNum).Bits.RM_BIT =0;
return(CANMOD(CanNum).Bits.RM_BIT );
}
/*
***********************************************************************************************************
**函數(shù)原型 : void CanSendCmd(eCANNUM CanNum,INT32U Cmd,INT32U TxBuf)
**參數(shù)說(shuō)明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規(guī)定的值
Cmd à> 發(fā)送命令字
TxBuf à> 選擇發(fā)送緩沖區(qū)
**返回值 :
**說(shuō) 明 : 本函數(shù)用于發(fā)送命令處理
************************************************************************************************************/
void CanSendCmd(eCANNUM CanNum,INT32U Cmd,INT32U TxBuf)
{
uCANCMR Temp;
Temp.Word =0;
Temp.Bits.STB1_BIT = TxBuf&0x00000001;
Temp.Bits.STB2_BIT = (TxBuf&0x00000002)>>1;
Temp.Bits.STB3_BIT = (TxBuf&0x00000004)>>2;
switch(Cmd)
{
case 1:
Temp.Bits.AT_BIT =1; //單次發(fā)送
Temp.Bits.TR_BIT =1;
break;
case 2:
case 3:
if(CANMOD(CanNum).Bits.STM_BIT == 0) //自發(fā)自收
{
CANMOD(CanNum).Word =1;
CANMOD(CanNum).Bits.STM_BIT =1;
CANMOD(CanNum).Bits.RM_BIT =0;
}
Temp.Bits.SRR_BIT =1;
if(Cmd == 3) //單次自發(fā)自收
{
Temp.Bits.AT_BIT =1;
}
break;
case 0:
default: //正常發(fā)送
Temp.Bits.TR_BIT =1;
break;
}
CANCMR(CanNum) = Temp;
}
/*
***********************************************************************************************************
**函數(shù)原型 : INT32U WriteCanTxBuf(eCANNUM CanNum,INT32U TxBufNum,
INT32U TPM,P_stcTxBUF Buf) ;
**參數(shù)說(shuō)明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規(guī)定的值
TxBufNum à> 選擇發(fā)送緩沖區(qū)
TPM à> 發(fā)送優(yōu)先級(jí)模式
Buf à> 發(fā)送到總線的數(shù)據(jù)
**返回值 : =0;成功將數(shù)據(jù)寫(xiě)入發(fā)送緩沖區(qū)
!=0;寫(xiě)發(fā)送緩沖區(qū)操作失敗
**說(shuō) 明 : 本函數(shù)用于向CAN發(fā)送緩沖區(qū)TxBUF寫(xiě)入發(fā)送數(shù)據(jù)
***********************************************************************************************************
*/
INT32U WriteCanTxBuf(eCANNUM CanNum,INT32U TxBufNum,INT32U TPM,P_stcTxBUF Buf)
{
INT32U status=0;
switch(TxBufNum)
{
case SEND_TX_BUF1:
//判斷發(fā)送緩沖區(qū)是否被鎖定或者正在發(fā)送信息
if((0== CANSR(CanNum).Bits.TS1_BIT)&&(0 != CANSR(CanNum).Bits.TBS1_BIT))
{
CANTFI1(CanNum)=Buf->TxFrameInfo; //寫(xiě)入幀信息
CANTID1(CanNum)=Buf->TxCANID; //寫(xiě)入幀ID
CANTDA1(CanNum)=Buf->CANTDA; //寫(xiě)入前1-4字節(jié)
CANTDB1(CanNum)=Buf->CANTDB; //寫(xiě)入后5-8字節(jié)
}
else
{
status = 0x01;
}
break;
case SEND_TX_BUF2:
if((0== CANSR(CanNum).Bits.TS2_BIT)&&(0 !=CANSR(CanNum).Bits.TBS2_BIT))
{
CANTFI2(CanNum)=Buf->TxFrameInfo;
CANTID2(CanNum)=Buf->TxCANID;
CANTDA3(CanNum)=Buf->CANTDA;
CANTDB2(CanNum)=Buf->CANTDB;
}
else
{
status = 0x01;
}
break;
case SEND_TX_BUF3:
if((0== CANSR(CanNum).Bits.TS3_BIT)&&(0 != CANSR(CanNum).Bits.TBS3_BIT))
{
CANTFI3(CanNum)=Buf->TxFrameInfo;
CANTID3(CanNum)=Buf->TxCANID;
CANTDA3(CanNum)=Buf->CANTDA;
CANTDB3(CanNum)=Buf->CANTDB;
}
else
{
status = 0x01;
}
break;
default:
status = 0x01;
break;
}
if(TPM == 1)
{
CANMOD(CanNum).Bits.TPM_BIT =1; //發(fā)送優(yōu)先級(jí)由幀的優(yōu)先級(jí)域決定
}
return(status);
}
/*
***********************************************************************************************************
**函數(shù)原型 : void ReadCanRxBuf(eCANNUM CanNum,P_stcRxBUF Buf)
**參數(shù)說(shuō)明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規(guī)定的值
Buf à> 接收CAN總線數(shù)據(jù)
**返回值 :
**說(shuō) 明 : 本函數(shù)用于從CAN控制器RxBuf中讀取數(shù)據(jù)
***********************************************************************************************************
*/
void ReadCanRxBuf(eCANNUM CanNum,P_stcRxBUF Buf)
{
Buf->CANRcvFS =CANRFS(CanNum);
Buf->RxCANID =CANRID(CanNum);
Buf->CANRDA =CANRDA(CanNum);
Buf->CANRDB =CANRDB(CanNum);
}
/*
***********************************************************************************************************
**函數(shù)原型 : INT32U CanEntrySM(CanNum)
**參數(shù)說(shuō)明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規(guī)定的值
**返回值 : =0;成功進(jìn)入睡眠狀態(tài);
!=0;不能進(jìn)入睡眠狀態(tài);
**說(shuō) 明 : 本函數(shù)用于使CAN控制器進(jìn)入休眠模式
***********************************************************************************************************
*/
INT32U CanEntrySM(eCANNUM CanNum)
{
CANMOD(CanNum).Bits.SM_BIT = 1;
return(!CANMOD(CanNum).Bits.SM_BIT);
}
/*
***********************************************************************************************************
**函數(shù)原型 : INT32U CanQuitSM(eCANNUM CanNum)
**參數(shù)說(shuō)明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規(guī)定的值
**返回值 : =0;成功退出睡眠狀態(tài);
!=0;不能退出睡眠狀態(tài);
**說(shuō) 明 : 本函數(shù)用于使CAN控制器退出休眠模式
***********************************************************************************************************
*/
INT32U CanQuitSM(eCANNUM CanNum)
{
uCANMod i;
i=CANMOD(CanNum);
CANMOD(CanNum).Bits.RM_BIT=1;
CANMOD(CanNum).Bits.SM_BIT = 0;
CANMOD(CanNum).Bits.RM_BIT=i.Bits.RM_BIT;
return(CANMOD(CanNum).Bits.SM_BIT);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -