|
具體詳見附件
51hei.png (125.15 KB, 下載次數(shù): 89)
下載附件
2021-4-5 15:16 上傳
單片機源程序如下:
- #include "AT91RM9200.h"
- #include "lib_AT91RM9200.h"
- #include "AT91_SPI.h"
- #include "MCP2515.h"
- /*****************************************************************************
- 函數(shù)功能:MCP2515初始化
- 入口參數(shù):無
- 返 回:無
- 備 注:無
- ******************************************************************************/
- void MCP2515_Init()
- {
- //復(fù)位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 );
-
- //配置相關(guān)引腳
- 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);
-
- //設(shè)置波特率(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 );
-
- //復(fù)位MCP2515的錯誤標(biāo)志寄存器
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->EFLG)), EFLG_INIT_VAL, ARG_UNUSED);
-
- //配置TXBnCTRL(發(fā)送緩沖器控制寄存器)
- 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 ****************************/
- /*****************************************************************************
- 函數(shù)功能:MCP2515相關(guān)命令操作
- 入口參數(shù):cmd: 對MCP2515的相關(guān)命令; add: 地址信息; arg1,arg2: 命令的相關(guān)參數(shù)
- 返 回:若命令要求有返回值,則返回相應(yīng)的數(shù)據(jù);如果沒有返回值的,則返回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 ****************************/
- /*****************************************************************************
- 函數(shù)功能:MCP2515發(fā)送一幀數(shù)據(jù)
- 入口參數(shù):TXnBuf: 選擇發(fā)送緩沖器; IDType: 標(biāo)準(zhǔn)幀或者擴展幀選擇; id: 發(fā)送數(shù)據(jù)的ID號;
- DataLen: 發(fā)送的數(shù)據(jù)長度; SendData: 指向要發(fā)送數(shù)據(jù)的首地址
- 返 回:無
- 備 注:無
- ******************************************************************************/
- 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;
- }
-
- //發(fā)送幀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 );
- }
-
- //判別數(shù)據(jù)長度,若數(shù)據(jù)長度大于8,則取前8個數(shù)據(jù)
- if( DataLen>8 )
- DataLen = 8;
- //發(fā)送數(shù)據(jù)長度
- MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0DLC))+offset, DataLen, ARG_UNUSED );
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
51hei.png (7.65 KB, 下載次數(shù): 87)
下載附件
2021-4-5 15:17 上傳
所有資料51hei提供下載:
AT91_MCP2515_INT.rar
(547.79 KB, 下載次數(shù): 38)
2021-4-5 13:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|