分享一些CAN總線資料,項目上可以用到,供大家參考
CAN_C程序.zip
(108.05 KB, 下載次數: 120)
2020-6-23 09:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
can入門教程.pdf
(1.82 MB, 下載次數: 46)
2020-6-23 09:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
CAN總線協議講解.pdf
(4.71 MB, 下載次數: 42)
2020-6-23 09:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
MCP2515-CAN 中文數據手冊.pdf
(1.19 MB, 下載次數: 57)
2020-6-23 09:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
PCA82C250應用指南中文資料.pdf
(663.56 KB, 下載次數: 30)
2020-6-23 09:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
STM32CAN發送和接收過濾詳解.pdf
(252.93 KB, 下載次數: 57)
2020-6-23 09:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
單片機源程序如下:
- #include "reg51.h"
- #include "intrins.h"
- #include "mcp2515.h"
- #include "intrins.h"
- #include "datadef.h"
- //sbit CANSPI_SI = P0^1;
- //sbit CANSPI_SO = P0^0;
- //sbit CAN_RST = P2^6;
- //sbit CANSPI_CS = P2^7;
- //sbit CANSPI_SCK = P0^2;
- //sbit CAN_RS = P2^5;
- //sbit CAN_INT = P3^7;
- //sbit LED1 = P1^7;
- //sbit LED2 = P1^6;
- sbit CANSPI_SI = P2^6;
- sbit CANSPI_SO = P2^3;
- sbit CAN_RST = P2^1;
- sbit CANSPI_CS = P2^2;
- sbit CANSPI_SCK = P2^5;
- sbit CAN_RS = P4^7;
- sbit CAN_INT = P3^4;
- sbit CAN_CE = P2^0;
- sbit LED1 = P2^4;
- sbit LED2 = P2^7;
- sbit PKE_C = P1^6;
- sbit PKE_D = P1^7;
- sbit PKE_A = P3^3;
- sbit PKE_B = P3^4;
- bit B_R2;
- bit CAN_OK;
- static u8 xdata CAN_READ_BUFF01[15];
- static u8 xdata CAN_READ_BUFF02[15];
- u8 code SEND_CAN_CODE01[]= //CAN發送數據流
- {14, //數據個數
- COMMAND_WRITE_TXB0SIDH,
- 0x2A,0x00,0x00,0x00,0x08, //ID
- 0x12,0x34,0x56,0x78,0x90,0xFF,0xFF,0xFF, //內容
- COMMAND_RTST0
- };
-
- u8 code CAN_INIT_DATA01[]= //CAN初始化數據流01
- {
-
- 0x02,CANCTRL, 0x80, //;進入配置模式
- 0x02,CNF1, 0x04, //;CAN速率 100K
- 0x02,CNF2, 0x9E, //;CAN速率
- 0x02,CNF3, 0x03, //;CAN速率
- 0x02,CANINTE, 0x43,
- 0x02,RXB0CTRL, 0x24, //;接收緩沖器0 控制寄存器 24H標準楨、滾存
- 0x02,RXB1CTRL, 0x20, //;接收緩沖器1 控制寄存器 20標準楨
- 0x02,BFPCTRL, 0x00, //;RXnBF引腳控制和狀態寄存器
- 0x02,RXM0SIDH, 0xFF, //;驗收屏蔽寄存器0 標準標識符高位 (驗證的是RXB0SIDH,為0的是都接收,為1是開啟屏蔽)
- 0x02,RXM0SIDL, 0xE0, //;驗收屏蔽寄存器0 標準標識符低位
- 0x02,RXM0EID8, 0x00, //;驗收屏蔽寄存器0 擴展標識符高位
- 0x02,RXM0EID0, 0x00, //;驗收屏蔽寄存器0 擴展標識符低位
- 0x02,RXM1SIDH, 0xFF, //;驗收屏蔽寄存器1 標準標識符高位
- 0x02,RXM1SIDL, 0xE0, //;驗收屏蔽寄存器1 標準標識符低位
- 0x02,RXM1EID8, 0x00, //;驗收屏蔽寄存器1 擴展標識符高位
- 0x02,RXM1EID0, 0x00, //;驗收屏蔽寄存器1 擴展標識符低位
- //;.........................................................................................
- //;接收CAN地址 2AH,00H
- 0x02,RXF0SIDH, 0x2A, ////;驗收濾波寄存器0 標準標識符高位
- 0x02,RXF0SIDL, 0x10, //;驗收濾波寄存器0 標準標識符低位
- 0x02,RXF0EID8, 0x00, //;驗收濾波寄存器0 擴展標識符高位
- 0x02,RXF0EID0, 0x00, //;驗收濾波寄存器0 擴展標識符低位
- 0x02,RXF1SIDH, 0xFF, //;驗收濾波寄存器1 標準標識符高位
- 0x02,RXF1SIDL, 0xE0, //;驗收濾波寄存器1 標準標識符低位
- 0x02,RXF1EID8, 0x00, //;驗收濾波寄存器1 擴展標識符高位
- 0x02,RXF1EID0, 0x00, //;驗收濾波寄存器1 擴展標識符低位
- //;.........................................................................
- 0x02,RXF2SIDH, 0x00, //;驗收濾波寄存器2 標準標識符高位
- 0x02,RXF2SIDL, 0x00, //;驗收濾波寄存器2 標準標識符低位
- 0x02,RXF2EID8, 0x00, //;驗收濾波寄存器2 擴展標識符高位
- 0x02,RXF2EID0, 0x00, //;驗收濾波寄存器2 擴展標識符低位
- 0x02,RXF3SIDH, 0xFF, //;驗收濾波寄存器3 標準標識符高位
- 0x02,RXF3SIDL, 0xE0, //;驗收濾波寄存器3 標準標識符低位
- 0x02,RXF3EID8, 0x00, //;驗收濾波寄存器3 擴展標識符高位
- 0x02,RXF3EID0, 0x00, //;驗收濾波寄存器3 擴展標識符低位
- 0x02,RXF4SIDH, 0xFF, //;驗收濾波寄存器4 標準標識符高位
- 0x02,RXF4SIDL, 0xE0, //;驗收濾波寄存器4 標準標識符低位
- 0x02,RXF4EID8, 0x00, //;驗收濾波寄存器4 擴展標識符高位
- 0x02,RXF4EID0, 0x00, //;驗收濾波寄存器4 擴展標識符低位
- 0x02,RXF5SIDH, 0xFF, //;驗收濾波寄存器5 標準標識符高位
- 0x02,RXF5SIDL, 0xE0, //;驗收濾波寄存器5 標準標識符低位
- 0x02,RXF5EID8, 0x00, //;驗收濾波寄存器5 擴展標識符高位
- 0x02,RXF5EID0, 0x00, //;驗收濾波寄存器5 擴展標識符低位
- 0x02,CANCTRL, 0x40 //;模式 00-收發模式 40--自發自收模式
- };
- //========================================================================
- // 函數:CANSPI_WRITE_BYTE(u8 data_buff)
- // 描述:SPI寫一個字節
- // 參數:data_buff/所傳數據
- // 返回: none.
- //========================================================================
- void CANSPI_WRITE_BYTE(u8 data_buff)
- {
- u8 i;
- for(i=0;i<8;i++) //8位,循環 8次
- {
- if(((data_buff << i)&0x80) != 0) //先傳輸高位
- CANSPI_SI = 1;
- else
- CANSPI_SI = 0;
-
- _nop_();_nop_(); _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_();
-
- CANSPI_SCK = 1;
-
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_(); _nop_();
-
- CANSPI_SCK = 0;
-
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_(); _nop_();
- }
- }
- //========================================================================
- // 函數:CANSPI_READ_BYTE(u8 data_buff)
- // 描述:SPI讀一個字節
- // 參數:none.
- // 返回:data_buff/所讀數據
- //========================================================================
- u8 CANSPI_READ_BYTE(void)
- {
- u8 i,data_buff;
- for(i=0;i<8;i++) //8位,循環 8次
- {
- CANSPI_SCK = 1;
-
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_();
- data_buff = data_buff << 1;
- if(CANSPI_SO)
- {data_buff |= 0x01;}
- else
- {data_buff &= 0xfe;}
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_();
-
- CANSPI_SCK = 0;
-
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- // _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- // _nop_(); _nop_(); _nop_();
- }
- return (data_buff);
- }
- //========================================================================
- // 函數:CAN_COMMAND_OUT(u8 *P)
- // 描述:CAN發送數據子程序
- // 參數:發送數據首地址指針
- // 返回:none;
- //========================================================================
- void CAN_COMMAND_OUT(u8 *p)
- {
- u8 i;
- CANSPI_CS = 0;
- for(i=0;i<14;i++)
- {
- CANSPI_WRITE_BYTE(p[i+1]);
- }
- CANSPI_CS = 1;
- _nop_();_nop_();_nop_();
- CANSPI_CS = 0;
- CANSPI_WRITE_BYTE(p[15]);
- CANSPI_CS = 1;
- }
- //========================================================================
- // 函數:CAN_BUS_INIT(u8 *P)
- // 描述:CAN初始化子程序
- // 參數:發送數據首地址指針
- // 返回:none;
- //========================================================================
- void CAN_BUS_INIT(u8 *p,u8 num)
- {
- u8 i;
- CANSPI_CS = 0;
- for(i=0;i<num;i++)
- {
- CANSPI_CS = 0;
- CANSPI_WRITE_BYTE(p[i*3]);
- CANSPI_WRITE_BYTE(p[(i*3)+1]);
- CANSPI_WRITE_BYTE(p[(i*3)+2]);
- CANSPI_CS = 1;
- }
- for(i=0;i<15;i++)
- {
- CAN_READ_BUFF01[i] = 0;
- CAN_READ_BUFF02[i] = 0;
- }
- }
- //========================================================================
- // 函數:CL_ERRB()
- // 描述:清除錯誤標志寄存器
- // 每次接收完數據,執行此子程序,清除接收區
- // 參數:
- // 返回:none;
- //========================================================================
- void CL_ERRB()
- {
- CANSPI_CS = 0;
- CANSPI_WRITE_BYTE(COMMAND_BITMDF);
- CANSPI_WRITE_BYTE(EFLG);
- CANSPI_WRITE_BYTE(0xC0);
- CANSPI_WRITE_BYTE(0x00);
- CANSPI_CS = 1;
- }
- //========================================================================
- // 函數:CAN_DATA_CONTRAST(u8 *p)
- // 描述:CAN接收數據對比子程序
- // 參數:接收數據存放指針
- // 返回:none;
- //========================================================================
- //void CAN_DATA_CONTRAST(u8 *p)
- //{
- //
- //}
- //========================================================================
- // 函數:CAN_RECEIVE_DATA()
- // 描述:CAN接收子程序
- // 參數:
- // 返回:none;
- //========================================================================
- void CAN_RECEIVE_DATA()
- {
- u8 i,RXIF_DATA;
- CAN_RS = 0;
- CAN_OK = 0;
- B_R2 = 0;
- CANSPI_CS = 0;
- CANSPI_WRITE_BYTE(COMMAND_READ);
- CANSPI_WRITE_BYTE(CANINTF);
- RXIF_DATA = CANSPI_READ_BYTE();
- CANSPI_CS = 1;
- RXIF_DATA &= 0x03;
- switch(RXIF_DATA)
- {
- case 1:
- CANSPI_CS = 0;
- CANSPI_WRITE_BYTE(COMMAND_READ_RXB0SIDH);
- for(i=0;i<13;i++)
- {
- CAN_READ_BUFF01[i] = CANSPI_READ_BYTE();
- }
- CAN_READ_BUFF01[1] &= 0xf0;
- CAN_READ_BUFF01[2] = 0x00;
- CAN_READ_BUFF01[3] = 0x00;
- CANSPI_CS = 1;
-
- if(CAN_READ_BUFF01[0] == 0x2A)
- {
- if((CAN_READ_BUFF01[5] == 0x12)&&
- (CAN_READ_BUFF01[6] == 0x34)&&
- (CAN_READ_BUFF01[7] == 0x56)&&
- (CAN_READ_BUFF01[8] == 0x78)&&
- (CAN_READ_BUFF01[9] == 0x90))
- {
- CAN_OK = 1;
-
- }
- CL_ERRB();
- }
- else
- {
- if(!B_R2)
- {
- CL_ERRB();
- }
- else
- {
- B_R2 = 0;
- CANSPI_CS = 0;
- CANSPI_WRITE_BYTE(COMMAND_READ_RXB1SIDH);
- for(i=0;i<13;i++)
- {
- CAN_READ_BUFF02[i] = CANSPI_READ_BYTE();
- }
- CAN_READ_BUFF02[1] &= 0xf0;
- CAN_READ_BUFF02[2] = 0x00;
- CAN_READ_BUFF02[3] = 0x00;
- CANSPI_CS = 1;
- if(CAN_READ_BUFF01[0] == 0x2A)
- {
- if((CAN_READ_BUFF02[5] == 0x12)&&
- (CAN_READ_BUFF02[6] == 0x34)&&
- (CAN_READ_BUFF02[7] == 0x56)&&
- (CAN_READ_BUFF02[8] == 0x78)&&
- (CAN_READ_BUFF02[9] == 0x90))
- {
- CAN_OK = 1;
- }
- CL_ERRB();
- }
- }
- }
-
- break;
- case 2:
- B_R2 = 0;
- CANSPI_CS = 0;
- CANSPI_WRITE_BYTE(COMMAND_READ_RXB1SIDH);
- for(i=0;i<13;i++)
- {
- CAN_READ_BUFF02[i] = CANSPI_READ_BYTE();
- }
- CAN_READ_BUFF02[1] &= 0xf0;
- CAN_READ_BUFF02[2] = 0x00;
- CAN_READ_BUFF02[3] = 0x00;
- if(CAN_READ_BUFF02[0] == 0x2A)
- {
- if((CAN_READ_BUFF02[5] == 0x12)&&
- (CAN_READ_BUFF02[6] == 0x34)&&
- (CAN_READ_BUFF02[7] == 0x56)&&
- (CAN_READ_BUFF02[8] == 0x78)&&
- (CAN_READ_BUFF02[9] == 0x90))
- {
- CAN_OK = 1;
- }
- CL_ERRB();
- }
- break;
- case 3:B_R2 = 1;
- CANSPI_CS = 0;
- for(i=0;i<13;i++)
- {
- CAN_READ_BUFF01[i] = CANSPI_READ_BYTE();
- }
- CAN_READ_BUFF01[1] &= 0xf0;
- CAN_READ_BUFF01[2] = 0x00;
- CAN_READ_BUFF01[3] = 0x00;
- CANSPI_CS = 1;
- if(CAN_READ_BUFF01[0] == 0x2A)
- {
- if((CAN_READ_BUFF01[5] == 0x12)&&
- (CAN_READ_BUFF01[6] == 0x34)&&
- (CAN_READ_BUFF01[7] == 0x56)&&
- (CAN_READ_BUFF01[8] == 0x78)&&
- (CAN_READ_BUFF01[9] == 0x90))
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
|