找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2847|回复: 1
打印 上一主题 下一主题
收起左侧

分享一些CAN总线资料和mcp2515程序,项目上用到,供各位参考

  [复制链接]
跳转到指定楼层
楼主
ID:786943 发表于 2020-6-23 09:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分享一些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)

单片机源程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #include "mcp2515.h"
  4. #include "intrins.h"
  5. #include "datadef.h"
  6. //sbit CANSPI_SI  = P0^1;
  7. //sbit CANSPI_SO  = P0^0;
  8. //sbit CAN_RST    = P2^6;
  9. //sbit CANSPI_CS  = P2^7;
  10. //sbit CANSPI_SCK = P0^2;
  11. //sbit CAN_RS     = P2^5;
  12. //sbit CAN_INT    = P3^7;

  13. //sbit LED1       = P1^7;
  14. //sbit LED2       = P1^6;


  15. sbit CANSPI_SI  = P2^6;
  16. sbit CANSPI_SO  = P2^3;
  17. sbit CAN_RST    = P2^1;
  18. sbit CANSPI_CS  = P2^2;
  19. sbit CANSPI_SCK = P2^5;
  20. sbit CAN_RS     = P4^7;

  21. sbit CAN_INT    = P3^4;
  22. sbit CAN_CE     = P2^0;
  23. sbit LED1       = P2^4;
  24. sbit LED2       = P2^7;

  25. sbit PKE_C  = P1^6;
  26. sbit PKE_D  = P1^7;
  27. sbit PKE_A  = P3^3;
  28. sbit PKE_B  = P3^4;
  29. bit B_R2;
  30. bit CAN_OK;

  31. static u8 xdata CAN_READ_BUFF01[15];
  32. static u8 xdata CAN_READ_BUFF02[15];
  33. u8 code SEND_CAN_CODE01[]=             //CAN发送数据流
  34.         {14,                            //数据个数
  35.          COMMAND_WRITE_TXB0SIDH,
  36.          0x2A,0x00,0x00,0x00,0x08,     //ID
  37.          0x12,0x34,0x56,0x78,0x90,0xFF,0xFF,0xFF,  //内容
  38.          COMMAND_RTST0
  39.         };
  40.        
  41. u8 code CAN_INIT_DATA01[]=       //CAN初始化数据流01
  42.         {
  43.          
  44.                         0x02,CANCTRL,     0x80,                 //;进入配置模式

  45.                         0x02,CNF1,        0x04,                        //;CAN速率        100K
  46.                         0x02,CNF2,        0x9E,                        //;CAN速率
  47.                         0x02,CNF3,        0x03,                        //;CAN速率

  48.                         0x02,CANINTE,     0x43,

  49.                         0x02,RXB0CTRL,    0x24,                 //;接收缓冲器0        控制寄存器    24H标准桢、滚存
  50.                         0x02,RXB1CTRL,    0x20,                        //;接收缓冲器1        控制寄存器    20标准桢
  51.                         0x02,BFPCTRL,     0x00,                 //;RXnBF引脚控制和状态寄存器

  52.                         0x02,RXM0SIDH,          0xFF,            //;验收屏蔽寄存器0        标准标识符高位 (验证的是RXB0SIDH,为0的是都接收,为1是开启屏蔽)
  53.                         0x02,RXM0SIDL,          0xE0,                  //;验收屏蔽寄存器0        标准标识符低位
  54.                         0x02,RXM0EID8,          0x00,                  //;验收屏蔽寄存器0        扩展标识符高位
  55.                         0x02,RXM0EID0,          0x00,                  //;验收屏蔽寄存器0        扩展标识符低位

  56.                         0x02,RXM1SIDH,          0xFF,            //;验收屏蔽寄存器1        标准标识符高位
  57.                         0x02,RXM1SIDL,          0xE0,                  //;验收屏蔽寄存器1        标准标识符低位
  58.                         0x02,RXM1EID8,          0x00,            //;验收屏蔽寄存器1        扩展标识符高位
  59.                         0x02,RXM1EID0,          0x00,                  //;验收屏蔽寄存器1        扩展标识符低位
  60.                 //;.........................................................................................


  61.                 //;接收CAN地址 2AH,00H
  62.                         0x02,RXF0SIDH,          0x2A,                  ////;验收滤波寄存器0        标准标识符高位
  63.                         0x02,RXF0SIDL,          0x10,            //;验收滤波寄存器0        标准标识符低位
  64.                         0x02,RXF0EID8,          0x00,                  //;验收滤波寄存器0        扩展标识符高位
  65.                         0x02,RXF0EID0,          0x00,                  //;验收滤波寄存器0        扩展标识符低位

  66.                         0x02,RXF1SIDH,          0xFF,                  //;验收滤波寄存器1        标准标识符高位
  67.                         0x02,RXF1SIDL,          0xE0,                  //;验收滤波寄存器1        标准标识符低位
  68.                         0x02,RXF1EID8,          0x00,                  //;验收滤波寄存器1        扩展标识符高位
  69.                         0x02,RXF1EID0,          0x00,                  //;验收滤波寄存器1        扩展标识符低位
  70.                 //;.........................................................................
  71.                         0x02,RXF2SIDH,          0x00,                  //;验收滤波寄存器2        标准标识符高位
  72.                         0x02,RXF2SIDL,          0x00,                  //;验收滤波寄存器2        标准标识符低位
  73.                         0x02,RXF2EID8,          0x00,                  //;验收滤波寄存器2        扩展标识符高位
  74.                         0x02,RXF2EID0,          0x00,            //;验收滤波寄存器2        扩展标识符低位

  75.                         0x02,RXF3SIDH,          0xFF,                  //;验收滤波寄存器3        标准标识符高位
  76.                         0x02,RXF3SIDL,          0xE0,                  //;验收滤波寄存器3        标准标识符低位
  77.                         0x02,RXF3EID8,          0x00,                  //;验收滤波寄存器3        扩展标识符高位
  78.                         0x02,RXF3EID0,          0x00,            //;验收滤波寄存器3        扩展标识符低位

  79.                         0x02,RXF4SIDH,          0xFF,                   //;验收滤波寄存器4        标准标识符高位
  80.                         0x02,RXF4SIDL,          0xE0,                  //;验收滤波寄存器4        标准标识符低位
  81.                         0x02,RXF4EID8,          0x00,                  //;验收滤波寄存器4        扩展标识符高位
  82.                         0x02,RXF4EID0,          0x00,                  //;验收滤波寄存器4        扩展标识符低位

  83.                         0x02,RXF5SIDH,          0xFF,                  //;验收滤波寄存器5        标准标识符高位
  84.                         0x02,RXF5SIDL,          0xE0,                  //;验收滤波寄存器5        标准标识符低位
  85.                         0x02,RXF5EID8,          0x00,                  //;验收滤波寄存器5        扩展标识符高位
  86.                         0x02,RXF5EID0,          0x00,     //;验收滤波寄存器5        扩展标识符低位

  87.                         0x02,CANCTRL,            0x40               //;模式  00-收发模式   40--自发自收模式
  88.   };
  89. //========================================================================
  90. // 函数:CANSPI_WRITE_BYTE(u8 data_buff)
  91. // 描述:SPI写一个字节
  92. // 参数:data_buff/所传数据
  93. // 返回: none.
  94. //========================================================================
  95. void CANSPI_WRITE_BYTE(u8 data_buff)
  96. {
  97.                 u8 i;
  98.           for(i=0;i<8;i++)        //8位,循环        8次                                                       
  99.           {
  100.                           if(((data_buff << i)&0x80) != 0)  //先传输高位
  101.                                         CANSPI_SI = 1;
  102.                                 else
  103.                                   CANSPI_SI = 0;
  104.                                
  105.                                 _nop_();_nop_(); _nop_(); _nop_(); _nop_();
  106.                                 _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  107.                                 _nop_(); _nop_(); _nop_();
  108.                                
  109.                                 CANSPI_SCK = 1;
  110.                                
  111.                                 _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  112.                                 _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  113.                         _nop_(); _nop_(); _nop_(); _nop_();
  114.                                
  115.                                 CANSPI_SCK = 0;
  116.                                
  117.                                 _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  118.                                 _nop_(); _nop_(); _nop_(); _nop_();
  119.           }
  120. }
  121. //========================================================================
  122. // 函数:CANSPI_READ_BYTE(u8 data_buff)
  123. // 描述:SPI读一个字节
  124. // 参数:none.
  125. // 返回:data_buff/所读数据
  126. //========================================================================
  127. u8 CANSPI_READ_BYTE(void)
  128. {
  129.                 u8 i,data_buff;
  130.           for(i=0;i<8;i++)        //8位,循环        8次                                                       
  131.           {
  132.                           CANSPI_SCK = 1;
  133.                           
  134.                           _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  135.                           _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  136.                           _nop_(); _nop_(); _nop_();
  137.                           data_buff = data_buff << 1;
  138.                           if(CANSPI_SO)
  139.                                 {data_buff |= 0x01;}
  140.                                 else
  141.                                 {data_buff &= 0xfe;}       
  142.                                 _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  143.                                 _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  144.                                 _nop_(); _nop_(); _nop_();
  145.                                
  146.                                 CANSPI_SCK = 0;
  147.                                
  148.                                 _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  149.                         //        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  150.                         //        _nop_(); _nop_(); _nop_();
  151.           }
  152.                 return (data_buff);
  153. }
  154. //========================================================================
  155. // 函数:CAN_COMMAND_OUT(u8 *P)
  156. // 描述:CAN发送数据子程序
  157. // 参数:发送数据首地址指针
  158. // 返回:none;
  159. //========================================================================
  160. void CAN_COMMAND_OUT(u8 *p)
  161. {
  162.                 u8 i;
  163.           CANSPI_CS = 0;
  164.                 for(i=0;i<14;i++)
  165.           {
  166.                    CANSPI_WRITE_BYTE(p[i+1]);  
  167.           }
  168.           CANSPI_CS = 1;
  169.           _nop_();_nop_();_nop_();
  170.           CANSPI_CS = 0;
  171.           CANSPI_WRITE_BYTE(p[15]);
  172.                 CANSPI_CS = 1;
  173. }
  174. //========================================================================
  175. // 函数:CAN_BUS_INIT(u8 *P)
  176. // 描述:CAN初始化子程序
  177. // 参数:发送数据首地址指针
  178. // 返回:none;
  179. //========================================================================
  180. void CAN_BUS_INIT(u8 *p,u8 num)
  181. {
  182.                 u8 i;
  183.           CANSPI_CS = 0;
  184.                 for(i=0;i<num;i++)
  185.           {
  186.                           CANSPI_CS = 0;
  187.                                 CANSPI_WRITE_BYTE(p[i*3]);
  188.                                 CANSPI_WRITE_BYTE(p[(i*3)+1]);
  189.                                 CANSPI_WRITE_BYTE(p[(i*3)+2]);
  190.                                 CANSPI_CS = 1;
  191.           }
  192.                 for(i=0;i<15;i++)
  193.                 {
  194.                                 CAN_READ_BUFF01[i] = 0;
  195.         CAN_READ_BUFF02[i] = 0;   
  196.                 }
  197. }
  198. //========================================================================
  199. // 函数:CL_ERRB()
  200. // 描述:清除错误标志寄存器
  201. //      每次接收完数据,执行此子程序,清除接收区
  202. // 参数:
  203. // 返回:none;
  204. //========================================================================
  205. void CL_ERRB()
  206. {
  207.                 CANSPI_CS = 0;
  208.           CANSPI_WRITE_BYTE(COMMAND_BITMDF);
  209.           CANSPI_WRITE_BYTE(EFLG);
  210.           CANSPI_WRITE_BYTE(0xC0);
  211.           CANSPI_WRITE_BYTE(0x00);
  212.           CANSPI_CS = 1;
  213. }
  214. //========================================================================
  215. // 函数:CAN_DATA_CONTRAST(u8 *p)
  216. // 描述:CAN接收数据对比子程序
  217. // 参数:接收数据存放指针
  218. // 返回:none;
  219. //========================================================================
  220. //void CAN_DATA_CONTRAST(u8 *p)
  221. //{
  222. //               
  223. //}
  224. //========================================================================
  225. // 函数:CAN_RECEIVE_DATA()
  226. // 描述:CAN接收子程序
  227. // 参数:
  228. // 返回:none;
  229. //========================================================================
  230. void CAN_RECEIVE_DATA()
  231. {
  232.                 u8 i,RXIF_DATA;
  233.                 CAN_RS = 0;
  234.     CAN_OK = 0;
  235.           B_R2   = 0;
  236.           CANSPI_CS = 0;
  237.           CANSPI_WRITE_BYTE(COMMAND_READ);
  238.           CANSPI_WRITE_BYTE(CANINTF);
  239.           RXIF_DATA = CANSPI_READ_BYTE();
  240.           CANSPI_CS = 1;
  241.           RXIF_DATA &= 0x03;
  242.           switch(RXIF_DATA)
  243.                 {
  244.                          case 1:
  245.                                             CANSPI_CS = 0;
  246.                                                         CANSPI_WRITE_BYTE(COMMAND_READ_RXB0SIDH);
  247.                                                         for(i=0;i<13;i++)
  248.                                                         {
  249.                                                                         CAN_READ_BUFF01[i] = CANSPI_READ_BYTE();
  250.                                                         }
  251.                                                         CAN_READ_BUFF01[1] &= 0xf0;
  252.                                                         CAN_READ_BUFF01[2] = 0x00;
  253.                                                         CAN_READ_BUFF01[3] = 0x00;
  254.                                                         CANSPI_CS = 1;
  255.                                                        
  256.                                                         if(CAN_READ_BUFF01[0] == 0x2A)
  257.                                                         {                  
  258.                                                                   if((CAN_READ_BUFF01[5] == 0x12)&&
  259.                                                                                  (CAN_READ_BUFF01[6] == 0x34)&&
  260.                                                                            (CAN_READ_BUFF01[7] == 0x56)&&
  261.                                                                            (CAN_READ_BUFF01[8] == 0x78)&&
  262.                                                                            (CAN_READ_BUFF01[9] == 0x90))
  263.                                                                         {
  264.                                                                                         CAN_OK = 1;
  265.                                                                                
  266.                                                                         }
  267.                   CL_ERRB();
  268.                                                         }
  269.                                                         else
  270.                                                         {       
  271.                                                                  if(!B_R2)
  272.                                                                  {
  273.                                                                                  CL_ERRB();
  274.                                                                  }
  275.                                                                  else
  276.                                                                  {
  277.                                                                                  B_R2 = 0;
  278.                                                                            CANSPI_CS = 0;
  279.                                                                            CANSPI_WRITE_BYTE(COMMAND_READ_RXB1SIDH);
  280.                                                                            for(i=0;i<13;i++)
  281.                                                                                  {
  282.                                                                                                 CAN_READ_BUFF02[i] = CANSPI_READ_BYTE();
  283.                                                                                  }
  284.                                                                                  CAN_READ_BUFF02[1] &= 0xf0;
  285.                                                                                  CAN_READ_BUFF02[2] = 0x00;
  286.                                                                                  CAN_READ_BUFF02[3] = 0x00;
  287.                                                                                  CANSPI_CS = 1;
  288.                                                                                  if(CAN_READ_BUFF01[0] == 0x2A)
  289.                                                                                  {
  290.                                                                                                  if((CAN_READ_BUFF02[5] == 0x12)&&
  291.                                                                                                           (CAN_READ_BUFF02[6] == 0x34)&&
  292.                                                                                                           (CAN_READ_BUFF02[7] == 0x56)&&
  293.                                                                                                           (CAN_READ_BUFF02[8] == 0x78)&&
  294.                                                                                                           (CAN_READ_BUFF02[9] == 0x90))
  295.                                                                                                  {
  296.                                                                                                                  CAN_OK = 1;
  297.                                                                                                  }
  298.                                                                                                  CL_ERRB();
  299.                                                                                  }                 
  300.                                                          }
  301.                                                         }
  302.                                                                
  303.                                                         break;
  304.                          case 2:      
  305.                                              B_R2 = 0;
  306.                                                                            CANSPI_CS = 0;
  307.                                                                            CANSPI_WRITE_BYTE(COMMAND_READ_RXB1SIDH);
  308.                                                                            for(i=0;i<13;i++)
  309.                                                                                  {
  310.                                                                                                 CAN_READ_BUFF02[i] = CANSPI_READ_BYTE();
  311.                                                                                  }
  312.                                                                                  CAN_READ_BUFF02[1] &= 0xf0;
  313.                                                                                  CAN_READ_BUFF02[2] = 0x00;
  314.                                                                                  CAN_READ_BUFF02[3] = 0x00;
  315.                                                                                  if(CAN_READ_BUFF02[0] == 0x2A)
  316.                                                                                  {   
  317.                                                                                                  if((CAN_READ_BUFF02[5] == 0x12)&&
  318.                                                                                                           (CAN_READ_BUFF02[6] == 0x34)&&
  319.                                                                                                           (CAN_READ_BUFF02[7] == 0x56)&&
  320.                                                                                                           (CAN_READ_BUFF02[8] == 0x78)&&
  321.                                                                                                           (CAN_READ_BUFF02[9] == 0x90))
  322.                                                                                                  {
  323.                                                                                                                  CAN_OK = 1;
  324.                                                                                                  }
  325.                                                                                                  CL_ERRB();
  326.                                                                                  }
  327.                                                         break;
  328.                          case 3:B_R2 = 1;
  329.                                                         CANSPI_CS = 0;
  330.                                                         for(i=0;i<13;i++)
  331.                                                         {
  332.                                                                         CAN_READ_BUFF01[i] = CANSPI_READ_BYTE();
  333.                                                         }
  334.                                                         CAN_READ_BUFF01[1] &= 0xf0;
  335.                                                         CAN_READ_BUFF01[2] = 0x00;
  336.                                                         CAN_READ_BUFF01[3] = 0x00;
  337.                                                         CANSPI_CS = 1;
  338.                                                         if(CAN_READ_BUFF01[0] == 0x2A)
  339.                                                         {
  340.                                                                         if((CAN_READ_BUFF01[5] == 0x12)&&
  341.                                                                                  (CAN_READ_BUFF01[6] == 0x34)&&
  342.                                                                            (CAN_READ_BUFF01[7] == 0x56)&&
  343.                                                                            (CAN_READ_BUFF01[8] == 0x78)&&
  344.                                                                            (CAN_READ_BUFF01[9] == 0x90))
  345. ……………………

  346. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


评分

参与人数 2黑币 +55 收起 理由
SKYLAR123 + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:278170 发表于 2021-4-17 13:52 | 只看该作者
正需要这块的资料,多谢楼主分享,学习 .
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表