标题:
分享一些CAN总线资料和mcp2515程序,项目上用到,供各位参考
[打印本页]
作者:
青春V未央
时间:
2020-6-23 09:10
标题:
分享一些CAN总线资料和mcp2515程序,项目上用到,供各位参考
分享一些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黑下载附件…………
复制代码
作者:
sxtz531
时间:
2021-4-17 13:52
正需要这块的资料,多谢楼主分享,学习 .
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1