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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13195|回復: 13
打印 上一主題 下一主題
收起左側

基于樹莓派的can總線MCP2515驅動源程序(波形很好)

  [復制鏈接]
跳轉到指定樓層
樓主
ID:312814 發(fā)表于 2018-4-21 01:51 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
工作項目用到了can總線,是在樹莓派的板子上運行的。用的can芯片是mcp2515。效果還不錯,波形很好。



單片機源程序如下:
  1. #define        CAN_10Kbps        0x31
  2. #define CAN_25Kbps        0x13
  3. #define CAN_50Kbps        0x09
  4. #define CAN_100Kbps        0x04
  5. #define CAN_125Kbps        0x03
  6. #define CAN_250Kbps        0x01
  7. #define        CAN_500Kbps        0x00

  8. #define SCK 14
  9. #define SI 12
  10. #define SO 13
  11. #define CS 10   //CE0       
  12. #define INTIN 3
  13. #define RST 4
  14. #define TXREQ_M 0b11110111
  15. #define CH 0

  16. #include "MCP2515.h"
  17. #include "bcm2835.h"
  18. #include <wiringPi.h>
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <time.h>

  22. //#include <wiringPiSPI.h>

  23. //采用bcm2835spi

  24. void MCP2515_WriteByte(unsigned char addr,unsigned char dat)
  25. {
  26.         unsigned char buf = CAN_WRITE;
  27.         unsigned char spiDat[] = {CAN_WRITE,addr,dat};
  28.         digitalWrite(CS,LOW);                        //置MCP2515的CS為低電平
  29.         bcm2835_spi_transfern(spiDat,3);
  30.         digitalWrite(CS,HIGH);                                //置MCP2515的CS為高電平
  31.         }

  32. unsigned char MCP2515_ReadByte(unsigned char addr)
  33. {
  34.         unsigned char rByte = 0;
  35.         unsigned char spiDat[] = {CAN_READ,addr,0xff};
  36.         digitalWrite(CS,LOW);                                //置MCP2515的CS為低電平
  37.         bcm2835_spi_transfern(spiDat,3);
  38.         digitalWrite(CS,HIGH);                        //置MCP2515的CS為高電平
  39.                 rByte = spiDat[2];
  40.         return rByte;                                //返回讀到的一個字節(jié)數(shù)據(jù)

  41. }

  42. void MCP2515_Reset(void)
  43. {
  44.         digitalWrite(RST,LOW);
  45.         delay(100);
  46.         digitalWrite(RST,HIGH);
  47.         delay(100);
  48. }

  49. //void IntHandle()
  50. //{
  51. //        char temp=0;
  52. //        //中斷處理函數(shù),MCU清除中斷FLAG,重新使能INTE,并且輸出RXB
  53. //        //digitalWrite(28,HIGH);
  54. //  printf("into the interrupt mode\nINT-IN is: %d\n",digitalRead(INTIN));
  55. ////        temp = MCP2515_ReadByte(CANINTF);
  56. //        //MCP2515_WriteByte(CANINTF,0x00);
  57. //  printf("into the interrupt mode\nINT-IN is: %d\n",digitalRead(INTIN));
  58. //        printf("RXB0SIDH  :  %02x\n",MCP2515_ReadByte(RXB0SIDH));
  59. //        printf("RXB0SIDL  :  %02x\n",MCP2515_ReadByte(RXB0SIDL));
  60. //        printf("RXB0D0  :  %02x\n",MCP2515_ReadByte(RXB0D0));
  61. //        printf("RXB0D1  :  %02x\n",MCP2515_ReadByte(RXB0D1));
  62. //        printf("RXB0D2  :  %02x\n",MCP2515_ReadByte(RXB0D2));
  63. //        printf("RXB0D3  :  %02x\n",MCP2515_ReadByte(RXB0D3));       
  64. //        printf("RXB0D4  :  %02x\n",MCP2515_ReadByte(RXB0D4));
  65. //        printf("RXB0D5  :  %02x\n",MCP2515_ReadByte(RXB0D5));       
  66. //        printf("RXB0D6  :  %02x\n",MCP2515_ReadByte(RXB0D6));
  67. //        printf("RXB0D7  :  %02x\n",MCP2515_ReadByte(RXB0D7));       
  68. //        printf("\n\n");
  69. //        exit(1);
  70. //}

  71. void MCP2515_Init(void)
  72. {
  73.         unsigned char temp=1;

  74.         MCP2515_Reset();        //發(fā)送復位指令軟件復位MCP2515
  75.         printf("Reset OK \n");
  76. // delay(1);        //Delay_Nms(1);                //通過軟件延時約nms(不準確)

  77.         //設置波特率為125Kbps
  78.         //set CNF1,SJW=00,長度為1TQ,BRP=49,TQ=[2*(BRP+1)]/Fsoc=2*50/8M=12.5us
  79.         MCP2515_WriteByte(CNF1,CAN_125Kbps);

  80.         //set CNF2,SAM=0,在采樣點對總線進行一次采樣,PHSEG1=(2+1)TQ=3TQ,PRSEG=(0+1)TQ=1TQ
  81.         MCP2515_WriteByte(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);
  82.         //set CNF3,PHSEG2=(2+1)TQ=3TQ,同時當CANCTRL.CLKEN=1時設定CLKOUT引腳為時間輸出使能位
  83.         MCP2515_WriteByte(CNF3,PHSEG2_3TQ);
  84.        

  85.         MCP2515_WriteByte(RXB0CTRL,0x20);//接收 過濾器信息
  86.         MCP2515_WriteByte(RXB0DLC,DLC_8);//設置接收數(shù)據(jù)的長度為8個字節(jié)
  87.         MCP2515_WriteByte(RXF0SIDH,0x12);//配置驗收濾波寄存器n標準標識符高位
  88.         MCP2515_WriteByte(RXF0SIDL,0x11);//配置驗收濾波寄存器n標準標識符低位
  89.         MCP2515_WriteByte(RXM0SIDH,0xFF);//配置驗收屏蔽寄存器n標準標識符高位
  90.         MCP2515_WriteByte(RXM0SIDL,0xE0);//配置驗收屏蔽寄存器n標準標識符低位
  91.        
  92. //        MCP2515_WriteByte(RXB0SIDH,0x00);//清空接收緩沖器0的標準標識符高位
  93. //        MCP2515_WriteByte(RXB0SIDL,0x00);//清空接收緩沖器0的標準標識符低位
  94.        
  95.         MCP2515_WriteByte(CANINTE,0x01);//配置CAN中斷使能寄存器的接收緩沖器0滿中斷使能,其它位禁止中斷
  96.         MCP2515_WriteByte(CANINTF,0x00);//清空CAN中斷標志寄存器的所有位(必須由MCU清空)
  97.        
  98.         MCP2515_WriteByte(CANCTRL,REQOP_LOOPBACK|CLKOUT_ENABLED);//將MCP2515設置為環(huán)回模式,退出配置模式
  99.        
  100.         temp=MCP2515_ReadByte(CANSTAT);//讀取CAN狀態(tài)寄存器的值
  101.        
  102.         while(OPMODE_LOOPBACK!=(temp & 0xE0))//判斷MCP2515是否已經(jīng)進入環(huán)回模式
  103.         {
  104.           //MCP2515_WriteByte(CANCTRL,REQOP_LOOPBACK|CLKOUT_ENABLED);//再次將MCP2515設置為環(huán)回模式,退出配置模式
  105.                 temp=MCP2515_ReadByte(CANSTAT);
  106.                
  107.         }
  108.         printf("MCP2515 loopback mode OK\n");
  109. }


  110. void LOOPTest()
  111. {
  112.         printf("LoopTest begin\n");

  113.         MCP2515_WriteByte(TXB0DLC,DLC_8);//設置發(fā)送數(shù)據(jù)長度為8
  114.         MCP2515_WriteByte(TXB0SIDH,0x12);//發(fā)送緩沖器0標準標識符高位
  115.         MCP2515_WriteByte(TXB0SIDL,0x11);//發(fā)送緩沖器0標準標識符低位
  116.         MCP2515_WriteByte(TXB0CTRL,0x02);  //高優(yōu)先級
  117.         MCP2515_WriteByte(TXB0D0,0x83);    //數(shù)據(jù)
  118.         MCP2515_WriteByte(TXB0D1,0x83);
  119.         MCP2515_WriteByte(TXB0D2,0x83);
  120.         MCP2515_WriteByte(TXB0D3,0x87);
  121.         MCP2515_WriteByte(TXB0D4,0x87);
  122.         MCP2515_WriteByte(TXB0D5,0x87);
  123.         MCP2515_WriteByte(TXB0D6,0x84);
  124.         MCP2515_WriteByte(TXB0D7,0x84);

  125.         printf("TXB0D0  :  %02x\n",MCP2515_ReadByte(TXB0D0));
  126.         printf("TXB0D1  :  %02x\n",MCP2515_ReadByte(TXB0D1));
  127.         printf("TXB0D2  :  %02x\n",MCP2515_ReadByte(TXB0D2));
  128.         printf("TXB0D3  :  %02x\n",MCP2515_ReadByte(TXB0D3));       
  129.         printf("TXB0D4  :  %02x\n",MCP2515_ReadByte(TXB0D4));
  130.         printf("TXB0D5  :  %02x\n",MCP2515_ReadByte(TXB0D5));       
  131.         printf("TXB0D6  :  %02x\n",MCP2515_ReadByte(TXB0D6));
  132.         printf("TXB0D7  :  %02x\n",MCP2515_ReadByte(TXB0D7));       
  133.        
  134.        
  135.         printf("RXB0SIDH  :  %02x\n",MCP2515_ReadByte(RXB0SIDH));
  136.         printf("RXB0SIDL  :  %02x\n",MCP2515_ReadByte(RXB0SIDL));
  137.         printf("RXB0D0  :  %02x\n",MCP2515_ReadByte(RXB0D0));
  138.         printf("RXB0D1  :  %02x\n",MCP2515_ReadByte(RXB0D1));
  139.         printf("RXB0D2  :  %02x\n",MCP2515_ReadByte(RXB0D2));
  140.         printf("RXB0D3  :  %02x\n",MCP2515_ReadByte(RXB0D3));       
  141.         printf("RXB0D4  :  %02x\n",MCP2515_ReadByte(RXB0D4));
  142.         printf("RXB0D5  :  %02x\n",MCP2515_ReadByte(RXB0D5));       
  143.         printf("RXB0D6  :  %02x\n",MCP2515_ReadByte(RXB0D6));
  144.         printf("RXB0D7  :  %02x\n",MCP2515_ReadByte(RXB0D7));       
  145.         printf("\n\n");


  146.         char temp = 0;
  147.        

  148.         temp = MCP2515_ReadByte(TXB0CTRL);

  149.         MCP2515_WriteByte(TXB0CTRL,(temp| (~TXREQ_M )));  //請求發(fā)送
  150.        
  151.         int cnt = 0;
  152.         while(MCP2515_ReadByte(TXB0CTRL)&(0b00001000) != 0x00)
  153.         {
  154.                 cnt++;
  155.                 if(cnt>=100000)
  156.                 {
  157.                         printf("trasmission failed\n");
  158.                         exit(1);
  159.                 }
  160.         }
  161.         delay(100);
  162.         printf("RXB0SIDH  :  %02x\n",MCP2515_ReadByte(RXB0SIDH));
  163.         printf("RXB0SIDL  :  %02x\n",MCP2515_ReadByte(RXB0SIDL));
  164.         printf("RXB0D0  :  %02x\n",MCP2515_ReadByte(RXB0D0));
  165.         printf("RXB0D1  :  %02x\n",MCP2515_ReadByte(RXB0D1));
  166.         printf("RXB0D2  :  %02x\n",MCP2515_ReadByte(RXB0D2));
  167.         printf("RXB0D3  :  %02x\n",MCP2515_ReadByte(RXB0D3));       
  168.         printf("RXB0D4  :  %02x\n",MCP2515_ReadByte(RXB0D4));
  169.         printf("RXB0D5  :  %02x\n",MCP2515_ReadByte(RXB0D5));       
  170.         printf("RXB0D6  :  %02x\n",MCP2515_ReadByte(RXB0D6));
  171.         printf("RXB0D7  :  %02x\n",MCP2515_ReadByte(RXB0D7));       
  172.         printf("\n\n");
  173.        
  174. }

  175. void bcm2835_SPISetup(void)
  176. {
  177.         if (!bcm2835_init())
  178.     {
  179.       printf("bcm2835_init failed. Are you running as root??\n");
  180.       exit(1);
  181.     }

  182.     if (!bcm2835_spi_begin())
  183.     {
  184.       printf("bcm2835_spi_begin failed. Are you running as root??\n");
  185.       exit(1);
  186.     }
  187.     bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);      // The default
  188.     bcm2835_spi_setDataMode(BCM2835_SPI_MODE0);                   // The default
  189.     bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_65536); // The default
  190.     bcm2835_spi_chipSelect(BCM2835_SPI_CS0);                      // The default
  191.     bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);      // the default
  192. ……………………

  193. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
MCP2515.rar (25.34 KB, 下載次數(shù): 116)




評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:315814 發(fā)表于 2018-4-24 22:50 | 只看該作者
感謝樓主熱心分享
回復

使用道具 舉報

板凳
ID:329716 發(fā)表于 2018-5-14 16:40 | 只看該作者

感謝樓主熱心分享!!!
回復

使用道具 舉報

地板
ID:329716 發(fā)表于 2018-5-14 16:59 | 只看該作者
非常感謝樓主分享,我找了好多地方,都不是專門針對樹莓派。自己寫因為不熟悉又太花時間了
回復

使用道具 舉報

5#
ID:380699 發(fā)表于 2018-7-30 13:00 | 只看該作者
挺好的 參考參考
回復

使用道具 舉報

6#
ID:385727 發(fā)表于 2018-8-13 11:43 | 只看該作者
謝謝分享,
回復

使用道具 舉報

7#
ID:342519 發(fā)表于 2018-9-17 16:30 | 只看該作者
樓主好,很感謝你的分享。但是我想問一下那個printf()串口打印是MCP2515和CAN收發(fā)器之間的CAN串口,還是單純的MCU的串口。謝謝
回復

使用道具 舉報

8#
ID:342519 發(fā)表于 2018-9-17 16:31 | 只看該作者
請回復一下,初學者2677957815
回復

使用道具 舉報

9#
ID:413508 發(fā)表于 2018-12-11 16:43 | 只看該作者
謝謝分享
回復

使用道具 舉報

10#
ID:446581 發(fā)表于 2019-1-14 13:12 | 只看該作者
謝謝分享, 學習一下
回復

使用道具 舉報

11#
ID:470794 發(fā)表于 2019-1-20 10:38 | 只看該作者
多謝樓主分享
回復

使用道具 舉報

12#
ID:434390 發(fā)表于 2019-5-7 14:15 | 只看該作者
正好需要擴一路CAN,感謝分享
回復

使用道具 舉報

13#
ID:306454 發(fā)表于 2019-11-18 13:57 | 只看該作者

感謝樓主熱心分享
回復

使用道具 舉報

14#
ID:555216 發(fā)表于 2020-5-19 20:39 | 只看該作者
非常感謝,熱心分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产专区免费 | 中文字幕高清在线 | 男人天堂网av| 国产一区视频在线 | 久久国产精品一区二区三区 | 天天干天天爱天天操 | 国产精品a免费一区久久电影 | 国产精品中文字幕在线 | 亚洲午夜精品一区二区三区他趣 | 91成人| 亚洲美女网站 | www.色婷婷 | 中文字幕一区二区三 | 精品美女久久久 | 欧美九九九 | 国产一区二区三区 | 国产成人免费视频 | 精品国产一区二区在线 | 成年人视频免费在线观看 | 久久精品二区 | 在线亚洲一区二区 | 特级特黄特色的免费大片 | 国产精品久久久久久久久久免费看 | 在线观看免费av网站 | 国产亚洲精品精品国产亚洲综合 | 欧美一级免费看 | 国产操操操 | 视频一二三区 | 久久综合久久久 | 亚洲第一色站 | 亚洲精品自在在线观看 | 国产精品视频久久久久久 | 99久久国产综合精品麻豆 | 国产精品高清在线 | 国产在线精品免费 | 精品国产免费一区二区三区五区 | 久久久成人动漫 | 国产成人综合在线 | 久久精品99 | 国产三级一区二区 | 国产精品成人国产乱 |