📄 drv_can.c
字号:
/**************************************************************************************************
Copyright (C), 2007-2008, wanyi Tech. Co., Ltd.
FileName : drv_can.c
Author : kevin
modify :
Version : 1.0
Date : 2008-4-25
Description : auto design for driver can function
Function List :
void HwEnCAN(eCANNUM CanNum);
unsigned int SoftRstCAN(eCANNUM CanNum);
unsigned int SoftEnCAN(eCANNUM CanNum);
unsigned int CanEntrySM(eCANNUM CanNum);
unsigned int CanQuitSM(eCANNUM CanNum);
void CanSendCmd(eCANNUM CanNum,UINT32 Cmd,UINT32 TxBuf);
unsigned int WriteCanTxBuf(eCANNUM CanNum,UINT32 TxBufNum,UINT32 TPM,P_stcTxBUF Buf) ;
void ReadCanRxBuf(eCANNUM CanNum,P_stcRxBUF Buf);
***************************************************************************************************/
#include "\inc\system.h"
/**************************************************************************************************
Function: // void HwRstCAN (eCANNUM CanNum)
Description: // close can to save power
Calls: // none
Called By: // none
Table Accessed: // none
Table Updated: // none
Input: // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
Output: // none
Return: // void
Others: // none
***************************************************************************************************/
void HwRstCAN(eCANNUM CanNum)
{
PCONP &= ~((unsigned int)0x01 << (13+CanNum)); //close can
}
//=================================================================================================
/**************************************************************************************************
Function: // void HwEnCAN (eCANNUM CanNum)
Description: // open can
Calls: // none
Called By: // none
Table Accessed: // none
Table Updated: // none
Input: // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
Output: // none
Return: // void
Others: // none
***************************************************************************************************/
void HwEnCAN(eCANNUM CanNum)
{
regCANAFMR.Bits.AccBP_BIT =1;
PCONP |= ((unsigned int)0x01 << (13+CanNum)); //open can
}
//=================================================================================================
/**************************************************************************************************
Function: // unsigned int SoftRstCAN(eCANNUM CanNum)
Description: // for software reset can controller
Calls: // none
Called By: // none
Table Accessed: // none
Table Updated: // none
Input: // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
Output: // none
Return: // 0-->reset success; other-->error;
Others: // none
***************************************************************************************************/
unsigned int SoftRstCAN(eCANNUM CanNum)
{
regCANMOD(CanNum).Bits.RM_BIT =1; //reset can
return(!regCANMOD(CanNum).Bits.RM_BIT );
}
//=================================================================================================
/**************************************************************************************************
Function: // unsigned int SoftEnCAN (eCANNUM CanNum)
Description: // for software enable can controller
Calls: // none
Called By: // none
Table Accessed: // none
Table Updated: // none
Input: // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
Output: // none
Return: // 0-->reset success; other-->error;
Others: // none
***************************************************************************************************/
unsigned int SoftEnCAN(eCANNUM CanNum)
{
regCANMOD(CanNum).Bits.RM_BIT =0; //normalize can
return(regCANMOD(CanNum).Bits.RM_BIT );
}
//=================================================================================================
/**************************************************************************************************
Function: // unsigned int CanEntrySM(CanNum)
Description: // set can controller to sleep mode
Calls: // none
Called By: // none
Table Accessed: // none
Table Updated: // none
Input: // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
Output: // none
Return: // 0-->success to sleep; other-->error
Others: // none
***************************************************************************************************/
unsigned int CanEntrySM(eCANNUM CanNum)
{
regCANMOD(CanNum).Bits.SM_BIT = 1; //normal mode
return(!regCANMOD(CanNum).Bits.SM_BIT);
}
//=================================================================================================
/**************************************************************************************************
Function: // unsigned int CanQuitSM(eCANNUM CanNum)
Description: // set can controller out sleep mode
Calls: // none
Called By: // none
Table Accessed: // none
Table Updated: // none
Input: // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
Output: // none
Return: // 0-->success out sleep; other-->error
Others: // none
***************************************************************************************************/
unsigned int CanQuitSM(eCANNUM CanNum)
{
uCANMod i;
i=regCANMOD(CanNum);
regCANMOD(CanNum).Bits.RM_BIT=1; //reset can
regCANMOD(CanNum).Bits.SM_BIT = 0; //sleep mode
regCANMOD(CanNum).Bits.RM_BIT=i.Bits.RM_BIT;
return(regCANMOD(CanNum).Bits.SM_BIT);
}
//=================================================================================================
/**************************************************************************************************
Function: // void CanSendCmd(eCANNUM CanNum,unsigned int Cmd,unsigned int TxBuf)
Description: // can send command
Calls: // none
Called By: // none
Table Accessed: // none
Table Updated: // none
Input: // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
Cmd -->command word
TxBuf -->send buffer
Output: // none
Return: // void
Others: // none
***************************************************************************************************/
void CanSendCmd(eCANNUM CanNum,unsigned int Cmd,unsigned int 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; //cancel all sending data
Temp.Bits.TR_BIT =1; //send request
break;
case 2:
case 3:
if(regCANMOD(CanNum).Bits.STM_BIT ==0) //send infor must be answered
{
regCANMOD(CanNum).Word =1; //only RM=1
regCANMOD(CanNum).Bits.STM_BIT =1; //self test mode
regCANMOD(CanNum).Bits.RM_BIT =0; //can normal work
}
Temp.Bits.SRR_BIT =1;
if(Cmd == 3) //self receive request
{
Temp.Bits.AT_BIT =1; //cancel all sending data
}
break;
case 0:
default:
Temp.Bits.TR_BIT =1; //send request
break;
}
regCANCMR(CanNum) = Temp; //write can command reg
}
//=================================================================================================
/**************************************************************************************************
Function: // unsigned int WriteCanTxBuf(eCANNUM CanNum,unsigned int TxBufNum,unsigned int TPM,P_stcTxBUF Buf)
Description: // write data to buffer"TxBUF"
Calls: // none
Called By: // none
Table Accessed: // none
Table Updated: // none
Input: // CanNum -->the can controller channel,must be <=CAN_MAX_NUM
TxBufNum-->to be writed send buffer channel
TPM -->send priority mode
Buf -->data to be sended to buffer
Output: // none
Return: // 0-->write success; other-->error
Others: // none
***************************************************************************************************/
unsigned int WriteCanTxBuf(eCANNUM CanNum,unsigned int TxBufNum,unsigned int TPM,P_stcTxBUF Buf)
{
unsigned int status=0;
switch(TxBufNum)
{
case SEND_TX_BUF1:
if((0==regCANSR(CanNum).Bits.TS1_BIT)&&(0 != regCANSR(CanNum).Bits.TBS1_BIT))
{
regCANTFI1(CanNum)=Buf->TxFrameInfo;
regCANTID1(CanNum)=Buf->TxCANID;
regCANTDA1(CanNum)=Buf->CANTDA;
regCANTDB1(CanNum)=Buf->CANTDB;
}
else
{
status = 0x01;
}
break;
case SEND_TX_BUF2:
if((0== regCANSR(CanNum).Bits.TS2_BIT)&&(0 !=regCANSR(CanNum).Bits.TBS2_BIT))
{
regCANTFI2(CanNum)=Buf->TxFrameInfo;
regCANTID2(CanNum)=Buf->TxCANID;
regCANTDA3(CanNum)=Buf->CANTDA;
regCANTDB2(CanNum)=Buf->CANTDB;
}
else
{
status = 0x01;
}
break;
case SEND_TX_BUF3:
if((0== regCANSR(CanNum).Bits.TS3_BIT)&&(0 != regCANSR(CanNum).Bits.TBS3_BIT))
{
regCANTFI3(CanNum)=Buf->TxFrameInfo;
regCANTID3(CanNum)=Buf->TxCANID;
regCANTDA3(CanNum)=Buf->CANTDA;
regCANTDB3(CanNum)=Buf->CANTDB;
}
else
{
status = 0x01;
}
break;
default:
status = 0x01;
break;
}
if(TPM == 1)
{
regCANMOD(CanNum).Bits.TPM_BIT =1;
}
return(status);
}
//=================================================================================================
/**************************************************************************************************
Function: // void ReadCanRxBuf(eCANNUM CanNum,P_stcRxBUF Buf)
Description: // read data from buffer"RxBuf"
Calls: // none
Called By: // none
Table Accessed: // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
Buf -->receive buffre data
Table Updated: // none
Input: // none
Output: // none
Return: // void
Others: // none
***************************************************************************************************/
void ReadCanRxBuf(eCANNUM CanNum,P_stcRxBUF Buf)
{
Buf->CANRcvFS =regCANRFS(CanNum);
Buf->RxCANID =regCANRID(CanNum);
Buf->CANRDA =regCANRDA(CanNum);
Buf->CANRDB =regCANRDB(CanNum);
}
//=================================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -