標(biāo)題:
關(guān)于CAN總線控制器MCP2515的程序 MSP430單片機(jī)
[打印本頁]
作者:
XUXUN
時間:
2020-12-23 10:39
標(biāo)題:
關(guān)于CAN總線控制器MCP2515的程序 MSP430單片機(jī)
單片機(jī)源程序如下:
//配置波特率代碼:
//MCP2515ByteWrite(CNF1, 3);
//MCP2515ByteWrite(CNF2, 0x80|PHSEG1_3TQ|PRSEG_1TQ);
//MCP2515ByteWrite(CNF3, PHSEG2_3TQ);
//功能:波特率的設(shè)置非常靈活,通過設(shè)置CNF1、CNF2、CNF3寄存器實現(xiàn)。
//CNF1中的bit5~0為分頻數(shù)BRP,其對晶振頻率FOSC進(jìn)行分配得到TQ(時間份額)。TQ=2*(BRP+1)/FOSC當(dāng)BRP=3,F(xiàn)OSC=8M,則TQ=2*(3+1)/8M=1us
//如為達(dá)到BRT=125kbps,位時間Tbit為波特率的倒數(shù),Tbit=1/BRT=8us,上圖4段加起來總數(shù)應(yīng)等于8(當(dāng)TQ=1us時)。
//同步段固定為1;若PPRSEG取1;S1和PS2占大多數(shù),分別為3。則采樣點位置為(1+1+3)/8=62.5%,采樣點位置應(yīng)確保在60%~90%。
//同步段:該段持續(xù)時間為 1 TQ。
//傳播段:傳播段的長度可編程設(shè)定為 1~8 TQ。
//相位緩沖段1(PS1):PS1 可編程設(shè)定為 1~8 TQ
//相位緩沖段2(PS2): PS2 可編程設(shè)定為 2~8 TQ
//采樣點:
//同步跳轉(zhuǎn)寬度 SJW SJW 可通過編程設(shè)定為 1~4 TQ 一般情況下,SJW 取值 1 T Q 即可滿足要求(SJW =00)。
//CFG1 ((MCP_SJW_Mask & MCP_SJW_1TQ )|(MCP_BRP_Mask & 0x31))
// SJW同步跳轉(zhuǎn)寬度位(1TQ) SJW=00 BRP波特率預(yù)分頻 0x27 BRP=39
// TQ=[2*(BRP+1)]/Fsoc=2*(39+1)/8M=10us
//CFG2 (MCP_BTLMODE_EN)|(MCP_SAM_PLE_1X)|(MCP_PHSEG1_Mask & 0x02)|(MCP_PRSEG_Mask & 0x00 )
//CNF2的bit7取1, bit5~3(PHSEG1)+1為相位緩沖段PS1的TQ數(shù), bit2~0(PRSEG)+1為傳播段PRSEG的TQ數(shù)。
//相位緩沖段PS2:開啟 SAM=0,在采樣點對總線進(jìn)行一次采樣, PHSEG1=(2+1)TQ=3TQ, PRSEG=(0+1)TQ=1TQ
//PS2由CNF3及決定 SAM:總線進(jìn)行一次采樣 PS2相位緩沖段:2 傳播段長度:0
//CFG3 (MCP_SOF_ENABLE)|(MCP_WAKFIL_ENABLE)|(MCP_PHSEG2_Mask & 0x00)
//CNF3的bit2~0 (PHSEG2)+1位相位緩沖段PS2的TQ數(shù)。
//SOF :起始幀信號位 WAKFIL:喚醒濾波使能位 PS2相位緩沖段PS2
//PHSEG2=(2+1)TQ=3TQ, 同時當(dāng)CANCTRL.CLKEN=1時設(shè)定CLKOUT引腳為時間輸出使能位
//------------MCP2515 CAN模塊使用的是8M晶振(軟件計算)----------------
// speed 8M
#define MCP_8MHz_1000kbps_CFG1 (0x00)
#define MCP_8MHz_1000kbps_CFG2 (0x80)
#define MCP_8MHz_1000kbps_CFG3 (0x00)
#define MCP_8MHz_500kbps_CFG1 (0x00)
#define MCP_8MHz_500kbps_CFG2 (0x90)
#define MCP_8MHz_500kbps_CFG3 (0x02)
#define MCP_8MHz_250kbps_CFG1 (0x00)
#define MCP_8MHz_250kbps_CFG2 (0xb1)
#define MCP_8MHz_250kbps_CFG3 (0x05)
#define MCP_8MHz_200kbps_CFG1 (0x00)
#define MCP_8MHz_200kbps_CFG2 (0xb4)
#define MCP_8MHz_200kbps_CFG3 (0x06)
#define MCP_8MHz_125kbps_CFG1 (0x01)
#define MCP_8MHz_125kbps_CFG2 (0xb1)
#define MCP_8MHz_125kbps_CFG3 (0x05)
#define MCP_8MHz_100kbps_CFG1 (0x01)
#define MCP_8MHz_100kbps_CFG2 (0xb4)
#define MCP_8MHz_100kbps_CFG3 (0x06)
#define MCP_8MHz_80kbps_CFG1 (0x01)
#define MCP_8MHz_80kbps_CFG2 (0xbf)
#define MCP_8MHz_80kbps_CFG3 (0x07)
#define MCP_8MHz_50kbps_CFG1 (0x03)
#define MCP_8MHz_50kbps_CFG2 (0xb4)
#define MCP_8MHz_50kbps_CFG3 (0x06)
#define MCP_8MHz_40kbps_CFG1 (0x03)
#define MCP_8MHz_40kbps_CFG2 (0xbf)
#define MCP_8MHz_40kbps_CFG3 (0x07)
#define MCP_8MHz_31k25BPS_CFG1 (0x07)
#define MCP_8MHz_31k25BPS_CFG2 (0xa4)
#define MCP_8MHz_31k25BPS_CFG3 (0x04)
#define MCP_8MHz_20kbps_CFG1 (0x07)
#define MCP_8MHz_20kbps_CFG2 (0xbf)
#define MCP_8MHz_20kbps_CFG3 (0x07)
#define MCP_8MHz_10kbps_CFG1 (0x0f)
#define MCP_8MHz_10kbps_CFG2 (0xbf)
#define MCP_8MHz_10kbps_CFG3 (0x07)
#define MCP_8MHz_5kbps_CFG1 (0x1f)
#define MCP_8MHz_5kbps_CFG2 (0xbf)
#define MCP_8MHz_5kbps_CFG3 (0x07)
// speed 16M
#define MCP_16MHz_1000kbps_CFG1 (0x00)
#define MCP_16MHz_1000kbps_CFG2 (0xD0)
#define MCP_16MHz_1000kbps_CFG3 (0x82)
#define MCP_16MHz_666kbps_CFG1 (0x00)
#define MCP_16MHz_666kbps_CFG2 (0xA0)
#define MCP_16MHz_666kbps_CFG3 (0x04)
#define MCP_16MHz_500kbps_CFG1 (0x00)
#define MCP_16MHz_500kbps_CFG2 (0xF0)
#define MCP_16MHz_500kbps_CFG3 (0x86)
#define MCP_16MHz_250kbps_CFG1 (0x41)
#define MCP_16MHz_250kbps_CFG2 (0xF1)
#define MCP_16MHz_250kbps_CFG3 (0x85)
#define MCP_16MHz_200kbps_CFG1 (0x01)
#define MCP_16MHz_200kbps_CFG2 (0xFA)
#define MCP_16MHz_200kbps_CFG3 (0x87)
#define MCP_16MHz_125kbps_CFG1 (0x03)
#define MCP_16MHz_125kbps_CFG2 (0xF0)
#define MCP_16MHz_125kbps_CFG3 (0x86)
#define MCP_16MHz_100kbps_CFG1 (0x03)
#define MCP_16MHz_100kbps_CFG2 (0xFA)
#define MCP_16MHz_100kbps_CFG3 (0x87)
#define MCP_16MHz_95kbps_CFG1 (0x03)
#define MCP_16MHz_95kbps_CFG2 (0xAD)
#define MCP_16MHz_95kbps_CFG3 (0x07)
#define MCP_16MHz_83k3BPS_CFG1 (0x03)
#define MCP_16MHz_83k3BPS_CFG2 (0xBE)
#define MCP_16MHz_83k3BPS_CFG3 (0x07)
#define MCP_16MHz_80kbps_CFG1 (0x03)
#define MCP_16MHz_80kbps_CFG2 (0xFF)
#define MCP_16MHz_80kbps_CFG3 (0x87)
#define MCP_16MHz_50kbps_CFG1 (0x07)
#define MCP_16MHz_50kbps_CFG2 (0xFA)
#define MCP_16MHz_50kbps_CFG3 (0x87)
#define MCP_16MHz_40kbps_CFG1 (0x07)
#define MCP_16MHz_40kbps_CFG2 (0xFF)
#define MCP_16MHz_40kbps_CFG3 (0x87)
#define MCP_16MHz_33kbps_CFG1 (0x09)
#define MCP_16MHz_33kbps_CFG2 (0xBE)
#define MCP_16MHz_33kbps_CFG3 (0x07)
#define MCP_16MHz_31k25BPS_CFG1 (0x0F)
#define MCP_16MHz_31k25BPS_CFG2 (0xF1)
#define MCP_16MHz_31k25BPS_CFG3 (0x85)
#define MCP_16MHz_25kbps_CFG1 (0X0F)
#define MCP_16MHz_25kbps_CFG2 (0XBA)
#define MCP_16MHz_25kbps_CFG3 (0X07)
#define MCP_16MHz_20kbps_CFG1 (0x0F)
#define MCP_16MHz_20kbps_CFG2 (0xFF)
#define MCP_16MHz_20kbps_CFG3 (0x87)
#define MCP_16MHz_10kbps_CFG1 (0x1F)
#define MCP_16MHz_10kbps_CFG2 (0xFF)
#define MCP_16MHz_10kbps_CFG3 (0x87)
#define MCP_16MHz_5kbps_CFG1 (0x3F)
#define MCP_16MHz_5kbps_CFG2 (0xFF)
#define MCP_16MHz_5kbps_CFG3 (0x87)
//20M
#define MCP_20MHz_125kbps_CFG1 (0x04)////CF1 SJW=1TQ BRP=4
#define MCP_20MHz_125kbps_CFG2 (0xB2)////CF2 PTS=2TQ PS1=7TQ 在采樣點進(jìn)行一次采樣
#define MCP_20MHz_125kbps_CFG3 (0x05)////CF3 PS2=6TQ
//-----------------------------------------------------------------------------------------------------------------
/*******************************************************************
* CAN SPI commands *
*******************************************************************/
//--------------------------MCP2515的SPI指令集--------------------------------
#define MCP_SPI_RESET 0xC0 //MCP2515復(fù)位 將內(nèi)部寄存器復(fù)位為缺省狀態(tài),并將器件設(shè)定為配置模式
#define MCP_SPI_READ 0x03 //從
//指定地址起始的寄存器讀取數(shù)據(jù)
#define MCP_SPI_WRITE 0x02 //將數(shù)據(jù)寫入指定地址起始的寄存器。
#define MCP_SPI_BitMOD 0x05 //位修改 允許用戶將特殊寄存器中的單獨位置1或置0
//---------------------------------------------------
#define MCP_SPI_LOAD_TX0 0x40 //裝載 TX0 緩沖器
#define MCP_SPI_LOAD_TX1 0x42 //裝載 TX1 緩沖器
#define MCP_SPI_LOAD_TX2 0x44 //裝載 TX2 緩沖器
//---------------------------------------------------
#define MCP_SPI_RTS 0x80 //TXB 請求發(fā)送功能
#define MCP_SPI_RTS_TX0 0x81 //TXB0 請求發(fā)送
#define MCP_SPI_RTS_TX1 0x82 //TXB1 請求發(fā)送
#define MCP_SPI_RTS_TX2 0x84 //TXB2 請求發(fā)送
#define MCP_SPI_RTS_ALL 0x87 //TXB0、TXB1、TXB2請求發(fā)送報文
//---------------------------------------------------
#define MCP_SPI_READ_RX0 0x90 //快速查詢命令 讀 RX0 緩沖器 注:在拉升CS引腳為高電平后,相關(guān)的RX標(biāo)志位(CANINTF.RX0IF)將被清零
#define MCP_SPI_READ_RX1 0x94 //快速查詢命令 讀 RX1 緩沖器 注:在拉升CS引腳為高電平后,相關(guān)的RX標(biāo)志位(CANINTF.RX1IF)將被清零
//---------------------------------------------------
#define MCP_SPI_READ_STATUS 0xA0 //快速查詢命令 讀取寄存器狀態(tài),可讀取有關(guān)發(fā)送和接收功能的一些狀態(tài)位。
#define MCP_SPI_RX_STATUS 0xB0 //快速查詢命令 RX狀態(tài) ,確定匹配的濾波器和接收報文的類型 (標(biāo)準(zhǔn)幀、擴(kuò)展幀和 / 或遠(yuǎn)程幀)。
//-----------------------------------------------------------------------------------------------------------------
typedef struct //MCP2515發(fā)送接收 地址 結(jié)構(gòu)體
{
unsigned char CTRL; //-*-控制寄存器
unsigned char SIDH; //- -標(biāo)準(zhǔn)標(biāo)識符 高位
unsigned char SIDL; //- -標(biāo)準(zhǔn)標(biāo)識符 低位 【其中bit3=1 報文將發(fā)送擴(kuò)展標(biāo)識符】
unsigned char EID8; //- -擴(kuò)展標(biāo)識符 高位
unsigned char EID0; //- -擴(kuò)展標(biāo)識符 低位
unsigned char DLC; //- -數(shù)據(jù)長度碼
unsigned char Data[8]; //- -數(shù)據(jù)
}MCP_Addr_Typedef;
// MCP2515寄存器地址列表
MCP_Addr_Typedef TXB0; //發(fā)送緩沖器0 地址 TXB0
MCP_Addr_Typedef TXB1; //發(fā)送緩沖器1 地址 TXB1
MCP_Addr_Typedef TXB2; //發(fā)送緩沖器2 地址 TXB2
MCP_Addr_Typedef RXB0; //接收緩沖器0 地址 RXB0
MCP_Addr_Typedef RXB1; //接收緩沖器1 地址 RXB1
//--------------------------------------------------------------------------------
typedef struct //MCP2515 CAN 報文數(shù)據(jù)結(jié)構(gòu)
{
uint32_t StdId; //標(biāo)準(zhǔn)幀 ID 參數(shù)值:0~0x7FF StdId—bit10~bit0 共11位
uint32_t ExtId; //拓展幀 ID 參數(shù)值:0~0x1FFFFFFF ExtId—bit28~bit0 共29位
char IDE; //SIDL.bit.3 【0—標(biāo)準(zhǔn)幀 ; 1—擴(kuò)展幀]】
char RTR; // DLC.bit6 【0—數(shù)據(jù)幀 ; 1—遠(yuǎn)程幀】
char DLC; //數(shù)據(jù)長度 DLC.bit3~0 參數(shù)值:0~8
char Data[8]; //數(shù)據(jù)內(nèi)容 參數(shù)值:0~0xFF
}MCP2515_CAN_MSG;
//---------------------------------------------------
MCP2515_CAN_MSG TXBDATA0; //發(fā)送數(shù)據(jù) 0
MCP2515_CAN_MSG RXBDATA0; //接收數(shù)據(jù)0
uint32_t CanIdJS=0; //記錄接收到ID上網(wǎng)總數(shù)
unsigned char CAN_MCP_Flag=0; //接收到數(shù)據(jù)標(biāo)志位
char CAN_ERROR; //CAN總線錯誤代碼
復(fù)制代碼
51hei.png
(7.55 KB, 下載次數(shù): 115)
下載附件
2020-12-23 23:04 上傳
所有資料51hei提供下載:
mcp2515.zip
(87.31 KB, 下載次數(shù): 75)
2020-12-23 10:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
kiterShuang
時間:
2022-8-19 20:34
厲害哦,不錯哦
作者:
tiantian_90
時間:
2022-11-8 17:23
不錯,正好需要,下載來學(xué)習(xí)下
作者:
小白艾世雄
時間:
2022-11-23 14:16
感謝樓主分享!學(xué)習(xí)一下。
前一段時間想硬改一個電源,后來查資料這個電源是CAN協(xié)議通信的,如果是協(xié)議控制,就不用動硬件了。
作者:
tailiangti
時間:
2022-12-26 08:53
樓主,想提問一下,我想更改他的拓展幀id,但是幀id的第一位是優(yōu)先級和pf值,不知道得修改哪個寄存器
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1