1.首先,MCP2515的资料都在这,里面有MCP2515的数据手册,一些示例代码,有些代码是可以直接拷贝使用的。
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1999&ty=&dty=§ion=&NextRow=&ssUserText=MCP2515
2.SPI指令集
MCP2515有两个接收缓冲器,三个发送缓冲器, SPI 接口。驱动的代码一部分要完成SPI接口的指令集,有表及执行时序。
相应的函数
void MCP2515Reset (void); //复位
uint8 MCP2515Read (uint8 addr); //读
void MCP2515ReadRXBuf (uint8 addr, uint8 *str, uint8 num); //读RX缓冲器
void MCP2515Write (uint8 addr, uint8 data); //写
void MCP2515LoadTXBuf (uint8 addr, uint8 *str, uint8 num); //装载TX缓冲器
void MCP2515ReqTx (uint8 addr); //请求发送报文
uint8 MCP2515RdStus (void); //读状态
uint8 MCP2515RxStus (void); //RX状态
void MCP2515BitModify (uint8 addr, uint8 mask, uint8 data); //位修改
3.就是CAN的收发数据了,共有两个接收缓冲器,三个发送缓冲器,可以通过中断来收发数据,当发送缓冲器满或接收缓冲器有有效数据时产生中断。
BOOL CANSendMsg( int Channel, UINT16 Identifier, UINT8* Msg, UINT8 MsgSize )
BOOL CANGetMsg( int Channel, UINT16* pIdentifier, UINT8* Msg, UINT8* pMsgSize )
注意:一定要确保初始化成功,本人在调试的过程中就遇到,如果初始化没成功,程序会一会执行正确,一会不正常的情况。
改变工作模式时,新的工作模式须等到所有当前报文发送完毕之后才生效。必须通过读取CANSTAT.OPMODE位来验证新的工作模式。
比如:
do{
MCP2515Write( MCP_CANCTRL, 0x80); //CAN工作在配置模式
j = MCP2515Read( MCP_CANSTAT ) & 0xF0; //验证是否已经进入配置模式
}while(j!=0x80);
4.一个代码的例子