欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
關于CAN總線控制器MCP2515的程序 MSP430單片機
[打印本頁]
作者:
XUXUN
時間:
2020-12-23 10:39
標題:
關于CAN總線控制器MCP2515的程序 MSP430單片機
單片機源程序如下:
//配置波特率代碼:
//MCP2515ByteWrite(CNF1, 3);
//MCP2515ByteWrite(CNF2, 0x80|PHSEG1_3TQ|PRSEG_1TQ);
//MCP2515ByteWrite(CNF3, PHSEG2_3TQ);
//功能:波特率的設置非常靈活,通過設置CNF1、CNF2、CNF3寄存器實現。
//CNF1中的bit5~0為分頻數BRP,其對晶振頻率FOSC進行分配得到TQ(時間份額)。TQ=2*(BRP+1)/FOSC當BRP=3,FOSC=8M,則TQ=2*(3+1)/8M=1us
//如為達到BRT=125kbps,位時間Tbit為波特率的倒數,Tbit=1/BRT=8us,上圖4段加起來總數應等于8(當TQ=1us時)。
//同步段固定為1;若PPRSEG取1;S1和PS2占大多數,分別為3。則采樣點位置為(1+1+3)/8=62.5%,采樣點位置應確保在60%~90%。
//同步段:該段持續時間為 1 TQ。
//傳播段:傳播段的長度可編程設定為 1~8 TQ。
//相位緩沖段1(PS1):PS1 可編程設定為 1~8 TQ
//相位緩沖段2(PS2): PS2 可編程設定為 2~8 TQ
//采樣點:
//同步跳轉寬度 SJW SJW 可通過編程設定為 1~4 TQ 一般情況下,SJW 取值 1 T Q 即可滿足要求(SJW =00)。
//CFG1 ((MCP_SJW_Mask & MCP_SJW_1TQ )|(MCP_BRP_Mask & 0x31))
// SJW同步跳轉寬度位(1TQ) SJW=00 BRP波特率預分頻 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數, bit2~0(PRSEG)+1為傳播段PRSEG的TQ數。
//相位緩沖段PS2:開啟 SAM=0,在采樣點對總線進行一次采樣, PHSEG1=(2+1)TQ=3TQ, PRSEG=(0+1)TQ=1TQ
//PS2由CNF3及決定 SAM:總線進行一次采樣 PS2相位緩沖段:2 傳播段長度:0
//CFG3 (MCP_SOF_ENABLE)|(MCP_WAKFIL_ENABLE)|(MCP_PHSEG2_Mask & 0x00)
//CNF3的bit2~0 (PHSEG2)+1位相位緩沖段PS2的TQ數。
//SOF :起始幀信號位 WAKFIL:喚醒濾波使能位 PS2相位緩沖段PS2
//PHSEG2=(2+1)TQ=3TQ, 同時當CANCTRL.CLKEN=1時設定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 在采樣點進行一次采樣
#define MCP_20MHz_125kbps_CFG3 (0x05)////CF3 PS2=6TQ
//-----------------------------------------------------------------------------------------------------------------
/*******************************************************************
* CAN SPI commands *
*******************************************************************/
//--------------------------MCP2515的SPI指令集--------------------------------
#define MCP_SPI_RESET 0xC0 //MCP2515復位 將內部寄存器復位為缺省狀態,并將器件設定為配置模式
#define MCP_SPI_READ 0x03 //從
//指定地址起始的寄存器讀取數據
#define MCP_SPI_WRITE 0x02 //將數據寫入指定地址起始的寄存器。
#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 請求發送功能
#define MCP_SPI_RTS_TX0 0x81 //TXB0 請求發送
#define MCP_SPI_RTS_TX1 0x82 //TXB1 請求發送
#define MCP_SPI_RTS_TX2 0x84 //TXB2 請求發送
#define MCP_SPI_RTS_ALL 0x87 //TXB0、TXB1、TXB2請求發送報文
//---------------------------------------------------
#define MCP_SPI_READ_RX0 0x90 //快速查詢命令 讀 RX0 緩沖器 注:在拉升CS引腳為高電平后,相關的RX標志位(CANINTF.RX0IF)將被清零
#define MCP_SPI_READ_RX1 0x94 //快速查詢命令 讀 RX1 緩沖器 注:在拉升CS引腳為高電平后,相關的RX標志位(CANINTF.RX1IF)將被清零
//---------------------------------------------------
#define MCP_SPI_READ_STATUS 0xA0 //快速查詢命令 讀取寄存器狀態,可讀取有關發送和接收功能的一些狀態位。
#define MCP_SPI_RX_STATUS 0xB0 //快速查詢命令 RX狀態 ,確定匹配的濾波器和接收報文的類型 (標準幀、擴展幀和 / 或遠程幀)。
//-----------------------------------------------------------------------------------------------------------------
typedef struct //MCP2515發送接收 地址 結構體
{
unsigned char CTRL; //-*-控制寄存器
unsigned char SIDH; //- -標準標識符 高位
unsigned char SIDL; //- -標準標識符 低位 【其中bit3=1 報文將發送擴展標識符】
unsigned char EID8; //- -擴展標識符 高位
unsigned char EID0; //- -擴展標識符 低位
unsigned char DLC; //- -數據長度碼
unsigned char Data[8]; //- -數據
}MCP_Addr_Typedef;
// MCP2515寄存器地址列表
MCP_Addr_Typedef TXB0; //發送緩沖器0 地址 TXB0
MCP_Addr_Typedef TXB1; //發送緩沖器1 地址 TXB1
MCP_Addr_Typedef TXB2; //發送緩沖器2 地址 TXB2
MCP_Addr_Typedef RXB0; //接收緩沖器0 地址 RXB0
MCP_Addr_Typedef RXB1; //接收緩沖器1 地址 RXB1
//--------------------------------------------------------------------------------
typedef struct //MCP2515 CAN 報文數據結構
{
uint32_t StdId; //標準幀 ID 參數值:0~0x7FF StdId—bit10~bit0 共11位
uint32_t ExtId; //拓展幀 ID 參數值:0~0x1FFFFFFF ExtId—bit28~bit0 共29位
char IDE; //SIDL.bit.3 【0—標準幀 ; 1—擴展幀]】
char RTR; // DLC.bit6 【0—數據幀 ; 1—遠程幀】
char DLC; //數據長度 DLC.bit3~0 參數值:0~8
char Data[8]; //數據內容 參數值:0~0xFF
}MCP2515_CAN_MSG;
//---------------------------------------------------
MCP2515_CAN_MSG TXBDATA0; //發送數據 0
MCP2515_CAN_MSG RXBDATA0; //接收數據0
uint32_t CanIdJS=0; //記錄接收到ID上網總數
unsigned char CAN_MCP_Flag=0; //接收到數據標志位
char CAN_ERROR; //CAN總線錯誤代碼
復制代碼
51hei.png
(7.55 KB, 下載次數: 115)
下載附件
2020-12-23 23:04 上傳
所有資料51hei提供下載:
mcp2515.zip
(87.31 KB, 下載次數: 75)
2020-12-23 10:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
kiterShuang
時間:
2022-8-19 20:34
厲害哦,不錯哦
作者:
tiantian_90
時間:
2022-11-8 17:23
不錯,正好需要,下載來學習下
作者:
小白艾世雄
時間:
2022-11-23 14:16
感謝樓主分享!學習一下。
前一段時間想硬改一個電源,后來查資料這個電源是CAN協議通信的,如果是協議控制,就不用動硬件了。
作者:
tailiangti
時間:
2022-12-26 08:53
樓主,想提問一下,我想更改他的拓展幀id,但是幀id的第一位是優先級和pf值,不知道得修改哪個寄存器
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1