CAN总线接口电路程序,关于MCP2515的初始化,要深入的解释(有哪位牛人能帮忙看懂)
#include "config.h"
#include "mcp2515.h"
#include "spi.h"
#include "gpio.h"
void CAN_WriteReg(U8 RegAddr, U8 Data)
{
GPIO_Output(PortA, 0x10, 0x00);
SPI_Tran(CAN_cmd_WriteReg);
SPI_Tran(RegAddr);
SPI_Tran(Data);
GPIO_Output(PortA, 0x10, 0xFF);
}
void CAN_ReadReg(U8 RegAddr, RP8 pData)
{
GPIO_Output(PortA, 0x10, 0x00);
SPI_Tran(CAN_cmd_ReadReg);
SPI_Tran(RegAddr);
SPI_Recv((RP16)pData);
GPIO_Output(PortA, 0x10, 0xFF);
}
void CAN_RTS(U8 TxBuf)
{
GPIO_Output(PortA, 0x10, 0x00);
SPI_Tran(CAN_cmd_RequestSend(TxBuf & 0x07));
GPIO_Output(PortA, 0x10, 0xFF);
}
void CAN_RESET()
{
GPIO_Output(PortA, 0x10, 0x00);
SPI_Tran(CAN_cmd_RESET);
GPIO_Output(PortA, 0x10, 0xFF);
}
void CAN_ModifyBits(U8 RegAddr, U8 Mask, U8 Data)
{
GPIO_Output(PortA, 0x10, 0x00);
SPI_Tran(CAN_cmd_ModifyBits);
SPI_Tran(Mask);
SPI_Tran(Data);
GPIO_Output(PortA, 0x10, 0xFF);
}
ER CAN_ChgMode(U8 Mode)
{
U8 Status;
// CAN_ModifyBits(CANCTRL, CAN_msk_Mode, Mode);
CAN_ReadReg(CANCTRL, &Status);
Status &= ~CAN_msk_Mode;
Status |= Mode;
CAN_WriteReg(CANCTRL, Status);
CAN_ReadReg(CANSTAT, &Status);
if ((Status & CAN_msk_Mode) == Mode)
{
return 0; //Success
}
else
{
return 1; //Faile
}
}
void CAN_WriteID(U8 RegBaseAddr, msgID ID)
{
U8 ID_Transed[4];
int i;
if (ID.Extend)
{
ID_Transed[0] = (U8) (((ID.Id >> 18 ) & 0x7FF) >> 3);
ID_Transed[1] = (U8) (((ID.Id & 0x1C0000) >> 13) | ((ID.Id & 0x30000) >> 16) |CAN_msk_ExtID);
ID_Transed[2] = (U8) (ID.Id & (0x3FFFF) >> 8);
ID_Transed[3] = (U8) (ID.Id & 0xFF);
}
else
{
ID_Transed[0] = (U8) ((ID.Id & 0x7FF) >> 3);
ID_Transed[1] = (U8) (((ID.Id & 0x7FF) << 5) & (~CAN_msk_ExtID));
ID_Transed[2] = 0;
ID_Transed[3] = 0;
}
for(i = 0; i < 4; i++)
{
CAN_WriteReg( (RegBaseAddr + i), ID_Transed[i]);
}
}
void CAN_WriteTxBuf(U8 TxBufNo, msgID ID, BOOL Remote, U8 Priority, RP8 Data, U32 DataSize)
{
U8 tempData;
U8 AddrOffset = TxBufNo * 0x10;
int i;
//设置发送缓冲器标识符
CAN_WriteID( (TXB0SIDH + AddrOffset), ID);
//设置发送缓冲器优先级
CAN_ReadReg((TXB0CTRL + AddrOffset), &tempData);
tempData = (tempData & 0xFC) | Priority;
CAN_WriteReg((TXB0CTRL + AddrOffset), tempData);
//设置发送缓冲器数据长度码
tempData =(DataSize & 0x0F) | ((Remote) ? (CAN_msk_RTR) : 0 );
CAN_WriteReg( (TXB0DLC + AddrOffset), (tempData));
//装载发送数据
for (i = 0; i < DataSize; i++)
{
CAN_WriteReg(TXB0D0 + i, *(Data + i));
}
}
void CAN_Init(const msgID MaskID[2], const msgID FilterID[6] )
{
U8 temp;
//设置为配置模式
CAN_ChgMode(CAN_msk_Mode_Configuration);
//设置控制寄存器 :
// 接收缓冲器只接收符合滤波条件的标准帧
// 使能滚存
CAN_WriteReg(RXB0CTRL, CAN_msk_RxbMode_ExtStd);
if (DEBUG) CAN_ReadReg(RXB0CTRL, &temp);
CAN_WriteReg(RXB1CTRL, CAN_msk_RxbMode_ExtStd);
if (DEBUG) CAN_ReadReg(RXB1CTRL, &temp);
//设置中断使能寄存器:
// 使能接收缓冲器0 和1 的装载报文中断
CAN_WriteReg(CANINTE, CAN_msk_RX0IE | CAN_msk_RX1IE);
if (DEBUG) CAN_ReadReg(CANINTE, &temp);
//设置接收屏蔽标识符
CAN_WriteID(RXM0SIDH, MaskID[0]);
CAN_WriteID(RXM1SIDH, MaskID[1]);
//设置接收滤波标识符
CAN_WriteID(RXF0SIDH, FilterID[0]);
CAN_WriteID(RXF1SIDH, FilterID[1]);
CAN_WriteID(RXF2SIDH, FilterID[2]);
CAN_WriteID(RXF3SIDH, FilterID[3]);
CAN_WriteID(RXF4SIDH, FilterID[4]);
CAN_WriteID(RXF5SIDH, FilterID[5]);
if (DEBUG) CAN_ReadReg(CANSTAT, &temp);
//设置TXRTSCTRL 引脚控制和状态寄存器
//设置RXnBF 引脚控制寄存器和状态寄存器
}
void INT_MCP2515_Handle()
{
}