具体详见附件
单片机源程序如下:
- #include "AT91RM9200.h"
- #include "lib_AT91RM9200.h"
- #include "AT91_SPI.h"
- #include "MCP2515.h"
- /*****************************************************************************
- 函数功能:MCP2515初始化
- 入口参数:无
- 返 回:无
- 备 注:无
- ******************************************************************************/
- void MCP2515_Init()
- {
- //复位MCP2515
- MCP2515_SPI_CMD( MCP2515_CMD_RESET, ARG_UNUSED, ARG_UNUSED, ARG_UNUSED );
-
- //进入配置模式
- MCP2515_SPI_CMD( MCP2515_CMD_BITMOD, TO_UINT(&(MCP2515_MAP->CANCTRL)), 0xe0, 0x80 );
-
- //配置相关引脚
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->BFPCTRL)), BFPCTRL_INIT_VAL, ARG_UNUSED);
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXRTSCTRL)), TXRTSCTRL_INIT_VAL, ARG_UNUSED);
-
- //设置波特率(125k)
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->CNF1)), CNF1_INIT_VAL, ARG_UNUSED );
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->CNF2)), CNF2_INIT_VAL, ARG_UNUSED );
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->CNF3)), CNF3_INIT_VAL, ARG_UNUSED );
-
- //配置中断
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->CANINTE)), CANINTE_INIT_VAL, ARG_UNUSED );
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->CANINTF)), CANINTF_INIT_VAL, ARG_UNUSED );
-
- //复位MCP2515的错误标志寄存器
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->EFLG)), EFLG_INIT_VAL, ARG_UNUSED);
-
- //配置TXBnCTRL(发送缓冲器控制寄存器)
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0CTRL)), TXBnCTRL_INIT_VAL, ARG_UNUSED );
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB1CTRL)), TXBnCTRL_INIT_VAL, ARG_UNUSED );
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB2CTRL)), TXBnCTRL_INIT_VAL, ARG_UNUSED );
-
- //配置接收缓冲器控制寄存器
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXB0CTRL)), RXB0CTRL_INIT_VAL, ARG_UNUSED );
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXB1CTRL)), RXB1CTRL_INIT_VAL, ARG_UNUSED );
-
- //配置MCP2515的验收滤波寄存器
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXF0SIDL)), RXF0SIDL_INIT_VAL, ARG_UNUSED );
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXF0SIDH)), RXF0SIDH_INIT_VAL, ARG_UNUSED );
-
- //配置MCP2515的验收屏蔽寄存器
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXM0SIDL)), RXM0SIDL_INIT_VAL, ARG_UNUSED );
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXM0SIDH)), RXM0SIDH_INIT_VAL, ARG_UNUSED );
-
- //进入正常工作模式
- MCP2515_SPI_CMD( MCP2515_CMD_BITMOD, TO_UINT(&(MCP2515_MAP->CANCTRL)), 0xe7, 0x04 );
- }
- /******************************** End of Function ****************************/
- /*****************************************************************************
- 函数功能:MCP2515相关命令操作
- 入口参数:cmd: 对MCP2515的相关命令; add: 地址信息; arg1,arg2: 命令的相关参数
- 返 回:若命令要求有返回值,则返回相应的数据;如果没有返回值的,则返回0
- 备 注:无
- ******************************************************************************/
- unsigned char MCP2515_SPI_CMD( unsigned char cmd, unsigned char addr, unsigned char arg1, unsigned char arg2 )
- {
- unsigned char data = 0x00;
-
- switch(cmd)
- {
- case MCP2515_CMD_RESET:
- AT91_SPI_SendByte( MCP2515_CMD_RESET );
- break;
-
- case MCP2515_CMD_BITMOD:
- AT91_SPI_SendByte( MCP2515_CMD_BITMOD );
- AT91_SPI_SendByte( addr );
- AT91_SPI_SendByte( arg1 );
- AT91_SPI_SendByte( arg2 );
- break;
-
- case MCP2515_CMD_WRITE:
- AT91_SPI_SendByte( MCP2515_CMD_WRITE );
- AT91_SPI_SendByte( addr );
- AT91_SPI_SendByte( arg1 );
- break;
-
- case MCP2515_CMD_READ:
- AT91_SPI_SendByte( MCP2515_CMD_READ );
- AT91_SPI_SendByte( addr );
- data = AT91_SPI_ReadByte();
- break;
-
- default:
- data = 0x00;
- break;
- }
- return data;
-
- }
- /******************************** End of Function ****************************/
- /*****************************************************************************
- 函数功能:MCP2515发送一帧数据
- 入口参数:TXnBuf: 选择发送缓冲器; IDType: 标准帧或者扩展帧选择; id: 发送数据的ID号;
- DataLen: 发送的数据长度; SendData: 指向要发送数据的首地址
- 返 回:无
- 备 注:无
- ******************************************************************************/
- void MCP2515_TX( int TXnBuf, int IDType, unsigned int id, int DataLen, unsigned char *SendData )
- {
- int i, offset;
- unsigned flag;
- unsigned char finish;
-
- switch( TXnBuf )
- {
- case TXBUF0:
- offset = 0;
- flag = 0x04;
- break;
-
- case TXBUF1:
- offset = 0x10;
- flag = 0x08;
- break;
-
- case TXBUF2:
- offset = 0x20;
- flag = 0x10;
- break;
- }
-
- //发送帧ID
- if( IDType == STAND_ID )
- {
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0SIDL))+offset, (id<<5)&0xe0, ARG_UNUSED );
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0SIDH))+offset, (id>>3)&0xff, ARG_UNUSED );
- }
- else if( IDType == EXT_ID )
- {
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0EID0))+offset, id&0xff, ARG_UNUSED );
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0EID8))+offset, (id>>8)&0xff, ARG_UNUSED );
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0SIDL))+offset, ((id>>16)&0x03)|((id>>13)&0xe0)|0x08, ARG_UNUSED );
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0SIDH))+offset, (id>>21)&0xff, ARG_UNUSED );
- }
-
- //判别数据长度,若数据长度大于8,则取前8个数据
- if( DataLen>8 )
- DataLen = 8;
- //发送数据长度
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0DLC))+offset, DataLen, ARG_UNUSED );
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
AT91_MCP2515_INT.rar
(547.79 KB, 下载次数: 38)
|