1. 程式人生 > >CAN介面晶片MCP2515的波特率和濾波器設定問題

CAN介面晶片MCP2515的波特率和濾波器設定問題

配置波特率程式碼:
    MCP2515ByteWrite(CNF1, 3);
    MCP2515ByteWrite(CNF2, 0x80|PHSEG1_3TQ|PRSEG_1TQ);
    MCP2515ByteWrite(CNF3, PHSEG2_3TQ);
功能:波特率的設定非常靈活,通過設定CNF1、CNF2、CNF3暫存器實現。
其中:
a)CNF1中的bit5~0為分頻數BRP,其對晶振頻率FOSC進行分配得到TQ(時間份額)。
TQ=2*(BRP+1)/FOSC
當BRP=3,FOSC=8M,則TQ=2*(3+1)/8M=1us
b)CNF2的bit7取1,bit5~3(PHSEG1)+1為相位緩衝段PS1的TQ數,bit2~0(PRSEG)+1為傳播段PRSEG的TQ數。

c)CNF3的bit2~0(PHSEG2)+1位相位緩衝段PS2的TQ數。

如為達到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%。

設定接收濾波器
a)濾波過程說明
接收到的幀資料先與RXB0的濾波器進行匹配,如果成功資料進行如RXB0,產生中斷INT(L);如果匹配不成功再與RXB1的濾波器進行匹配,如果成功資料進行如RXB1,產生中斷INT(L)。可查詢CANSTAT或CANINTF判斷資料來自於RXB0還是RXB1。


CANSTAT的bit3~1:110為RXB0;111位RXB1。
CANINTF:bit0為RXB0;bit1位RXB1。為了能產生中斷,需使能設定CANINTE的bit1和bit0。
b)標準幀結構分析
設定濾波器首先要了解CAN資料幀(標準幀和擴充套件幀)的結構。下面只分析標準幀。
標準幀包含11位識別符號,位於標準幀資料的第一個位元組8bit和第二個位元組高3位,對應晶片的TX暫存器為:TXB0SIDH(8位)+TXB0SIDL(高3位);對應RX暫存器為:RXB0SIDH(8位)+RXB0SIDL(3位)。(假設使用TXB0和RXB0)
c)濾波器設定
如果要對這11位都進行濾波器,步驟為:
aa、設定RXM0SIDH(8位)+RXM0SIDL(3位),分別為0xFF和0xE0。

bb、設定RXF0SIDH(8位)+RXF0SIDL(3位),分別為想要接收的標準幀識別符號。
cc、設定RXF1SIDH(8位)+RXF1SIDL(3位),分別為想要接收的標準幀識別符號。如果只接收一個識別符號,RXF1和RXF0設定為一樣的。
dd、寫RXB0CTRL的bit6~5:11為接收所有幀(不濾波);01為只接收標準幀;10為直接收擴充套件幀;00為接收標準幀和擴充套件幀。
如果不需要對11位都進行濾波,將RXM0的相應位置寫0,如0x00為對所有位都不濾波。
RXB0和RXB1分開設定:RXB0可設定RXF0和RXF1;RXB1可設定RXF2~5。
設定濾波器的程式碼參考:
MCP2515ByteWrite( RXM0SIDH, 0xFF );    // 1111 1111 濾波器0對11位都進行濾波
MCP2515ByteWrite( RXM0SIDL, 0xE0 );        // 111X XXXX
MCP2515ByteWrite( RXF0SIDH, 0xAA );// 1010 1010 識別符號應為10101010101的標準幀
MCP2515ByteWrite( RXF0SIDL, 0xA0 );    // 101X XXXX
MCP2515ByteWrite( RXF1SIDH, 0xAA );     // 1010 1010 RXF1和RXF0相同
MCP2515ByteWrite( RXF1SIDL, 0xA0 );    // 101X XXXX
MCP2515ByteWrite( RXM1SIDH, 0xFF );    // 1111 1111 濾波器1對11位都進行濾波
MCP2515ByteWrite( RXM1SIDL, 0xE0 );         // 111X XXXX
    MCP2515ByteWrite( RXF2SIDH, 0xAB );    // 1010 1011 識別符號應為10101011101的標準幀
    MCP2515ByteWrite( RXF2SIDL, 0xA0 );    // 101X XXXX 
MCP2515ByteWrite( RXB0CTRL, 0x20 );        // RXB0只接收標準幀
MCP2515ByteWrite( RXB1CTRL, 0x20 );        // RXB1只接收標準幀

轉載自http://bbs.mydigit.cn/read.php?tid=1994140