久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3080|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品国产一区 | 欧美久久久久久 | 给我免费的视频在线观看 | av在线一区二区三区 | 久久人爽 | 亚洲一区二区三区在线免费观看 | 日韩二区三区 | 亚洲免费视频在线观看 | 91精品国产色综合久久不卡98 | 欧美成人精品在线 | 亚洲一区二区三区福利 | 国产一区二区三区久久久久久久久 | 狠狠骚 | 羞羞的视频免费观看 | 毛片一区二区三区 | 欧美性久久 | 欧美日韩网站 | 欧美久久久久久久久中文字幕 | 国家aaa的一级看片 h片在线看 | 一区二区伦理电影 | 日韩欧美亚洲 | 色偷偷人人澡人人爽人人模 | 国产一级视频在线播放 | 日韩精品一 | 亚洲一区二区三区在线播放 | 国产欧美日韩一区 | 啪一啪| 欧美精品久久久久久 | 亚洲综合第一页 | 毛片com | 中文字幕 欧美 日韩 | 久久国产精品视频 | 国产亚洲欧美在线视频 | 一区二区三区高清 | 欧美日韩在线一区二区 | 日韩av.com | 国内精品视频 | 69福利影院 | 免费性视频| 亚洲最新网址 | 国产成人精品亚洲日本在线观看 |