分享一些CAN总线资料,项目上可以用到,供大家参考
CAN_C程序.zip
(108.05 KB, 下载次数: 120)
can入门教程.pdf
(1.82 MB, 下载次数: 46)
CAN总线协议讲解.pdf
(4.71 MB, 下载次数: 42)
MCP2515-CAN 中文数据手册.pdf
(1.19 MB, 下载次数: 57)
PCA82C250应用指南中文资料.pdf
(663.56 KB, 下载次数: 30)
STM32CAN发送和接收过滤详解.pdf
(252.93 KB, 下载次数: 57)
单片机源程序如下:
- #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黑下载附件…………
复制代码
|