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

標題: 基于樹莓派的can總線MCP2515驅動源程序(波形很好) [打印本頁]

作者: jhaa9793    時間: 2018-4-21 01:51
標題: 基于樹莓派的can總線MCP2515驅動源程序(波形很好)
工作項目用到了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;                                //返回讀到的一個字節數據

  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. //        //中斷處理函數,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();        //發送復位指令軟件復位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);//設置接收數據的長度為8個字節
  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設置為環回模式,退出配置模式
  99.        
  100.         temp=MCP2515_ReadByte(CANSTAT);//讀取CAN狀態寄存器的值
  101.        
  102.         while(OPMODE_LOOPBACK!=(temp & 0xE0))//判斷MCP2515是否已經進入環回模式
  103.         {
  104.           //MCP2515_WriteByte(CANCTRL,REQOP_LOOPBACK|CLKOUT_ENABLED);//再次將MCP2515設置為環回模式,退出配置模式
  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);//設置發送數據長度為8
  114.         MCP2515_WriteByte(TXB0SIDH,0x12);//發送緩沖器0標準標識符高位
  115.         MCP2515_WriteByte(TXB0SIDL,0x11);//發送緩沖器0標準標識符低位
  116.         MCP2515_WriteByte(TXB0CTRL,0x02);  //高優先級
  117.         MCP2515_WriteByte(TXB0D0,0x83);    //數據
  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 )));  //請求發送
  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, 下載次數: 116)





作者: kenchen    時間: 2018-4-24 22:50
感謝樓主熱心分享
作者: jiawei_zhong    時間: 2018-5-14 16:40

感謝樓主熱心分享!!!
作者: jiawei_zhong    時間: 2018-5-14 16:59
非常感謝樓主分享,我找了好多地方,都不是專門針對樹莓派。自己寫因為不熟悉又太花時間了
作者: 北緯30度    時間: 2018-7-30 13:00
挺好的 參考參考
作者: lalalala256    時間: 2018-8-13 11:43
謝謝分享,
作者: ZTG_5930    時間: 2018-9-17 16:30
樓主好,很感謝你的分享。但是我想問一下那個printf()串口打印是MCP2515和CAN收發器之間的CAN串口,還是單純的MCU的串口。謝謝

作者: ZTG_5930    時間: 2018-9-17 16:31
請回復一下,初學者2677957815
作者: hongyeluzhu    時間: 2018-12-11 16:43
謝謝分享
作者: askloser    時間: 2019-1-14 13:12
謝謝分享, 學習一下
作者: xiguaxiao    時間: 2019-1-20 10:38
多謝樓主分享
作者: snni00    時間: 2019-5-7 14:15
正好需要擴一路CAN,感謝分享
作者: 捍衛者    時間: 2019-11-18 13:57

感謝樓主熱心分享
作者: contactdeshine    時間: 2020-5-19 20:39
非常感謝,熱心分享




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲一区二区三区 | 亚洲 中文 欧美 日韩 在线观看 | 日韩高清中文字幕 | 国产区在线观看 | 久久一热| 成人a视频片观看免费 | 日韩视频―中文字幕 | 综合中文字幕 | 9久久精品| 国产99热精品| 欧美精品在线视频 | 精品久久久久久亚洲精品 | 国产精品一区在线播放 | 精品一级电影 | 中国xxxx性xxxx产国 | 国产伊人精品 | 偷牌自拍 | 美女人人操 | 亚洲国产精品一区在线观看 | 日日操视频 | 色综合天天网 | 成年人的视频免费观看 | 91天堂| 亚洲欧美精品国产一级在线 | 人人干人人舔 | 四虎在线观看 | 日韩精品一区二区三区高清免费 | 国产91在线 | 中日 | 国产高清一区二区三区 | 国产精品日女人 | 欧美性受xxxx白人性爽 | 国产精品电影在线观看 | 欧美日韩在线观看一区二区三区 | 亚洲女人天堂成人av在线 | 日韩精品在线免费观看 | 国产亚洲www | 日韩成人免费视频 | 日韩亚洲欧美综合 | 久久精品国产久精国产 | 一区二区三区四区av | 久久久久久国产精品久久 |