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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4779|回復: 4
收起左側

關于CAN總線控制器MCP2515的程序 MSP430單片機

[復制鏈接]
ID:866106 發表于 2020-12-23 10:39 | 顯示全部樓層 |閱讀模式
單片機源程序如下:
  1. //配置波特率代碼:
  2. //MCP2515ByteWrite(CNF1, 3);
  3. //MCP2515ByteWrite(CNF2, 0x80|PHSEG1_3TQ|PRSEG_1TQ);
  4. //MCP2515ByteWrite(CNF3, PHSEG2_3TQ);
  5. //功能:波特率的設置非常靈活,通過設置CNF1、CNF2、CNF3寄存器實現。


  6. //CNF1中的bit5~0為分頻數BRP,其對晶振頻率FOSC進行分配得到TQ(時間份額)。TQ=2*(BRP+1)/FOSC當BRP=3,FOSC=8M,則TQ=2*(3+1)/8M=1us


  7. //如為達到BRT=125kbps,位時間Tbit為波特率的倒數,Tbit=1/BRT=8us,上圖4段加起來總數應等于8(當TQ=1us時)。
  8. //同步段固定為1;若PPRSEG取1;S1和PS2占大多數,分別為3。則采樣點位置為(1+1+3)/8=62.5%,采樣點位置應確保在60%~90%。


  9. //同步段:該段持續時間為 1 TQ。
  10. //傳播段:傳播段的長度可編程設定為 1~8 TQ。
  11. //相位緩沖段1(PS1):PS1 可編程設定為 1~8 TQ
  12. //相位緩沖段2(PS2): PS2 可編程設定為 2~8 TQ
  13. //采樣點:
  14. //同步跳轉寬度 SJW  SJW 可通過編程設定為 1~4 TQ   一般情況下,SJW 取值 1 T Q 即可滿足要求(SJW =00)。

  15. //CFG1  ((MCP_SJW_Mask & MCP_SJW_1TQ )|(MCP_BRP_Mask & 0x31))
  16. //  SJW同步跳轉寬度位(1TQ) SJW=00   BRP波特率預分頻 0x27 BRP=39
  17. //  TQ=[2*(BRP+1)]/Fsoc=2*(39+1)/8M=10us

  18. //CFG2 (MCP_BTLMODE_EN)|(MCP_SAM_PLE_1X)|(MCP_PHSEG1_Mask & 0x02)|(MCP_PRSEG_Mask & 0x00 )
  19. //CNF2的bit7取1,  bit5~3(PHSEG1)+1為相位緩沖段PS1的TQ數,  bit2~0(PRSEG)+1為傳播段PRSEG的TQ數。
  20. //相位緩沖段PS2:開啟  SAM=0,在采樣點對總線進行一次采樣, PHSEG1=(2+1)TQ=3TQ,  PRSEG=(0+1)TQ=1TQ
  21. //PS2由CNF3及決定   SAM:總線進行一次采樣   PS2相位緩沖段:2  傳播段長度:0

  22. //CFG3 (MCP_SOF_ENABLE)|(MCP_WAKFIL_ENABLE)|(MCP_PHSEG2_Mask & 0x00)
  23. //CNF3的bit2~0  (PHSEG2)+1位相位緩沖段PS2的TQ數。
  24. //SOF :起始幀信號位   WAKFIL:喚醒濾波使能位  PS2相位緩沖段PS2
  25. //PHSEG2=(2+1)TQ=3TQ,  同時當CANCTRL.CLKEN=1時設定CLKOUT引腳為時間輸出使能位


  26. //------------MCP2515 CAN模塊使用的是8M晶振(軟件計算)----------------

  27. // speed 8M

  28. #define MCP_8MHz_1000kbps_CFG1 (0x00)
  29. #define MCP_8MHz_1000kbps_CFG2 (0x80)
  30. #define MCP_8MHz_1000kbps_CFG3 (0x00)

  31. #define MCP_8MHz_500kbps_CFG1 (0x00)
  32. #define MCP_8MHz_500kbps_CFG2 (0x90)
  33. #define MCP_8MHz_500kbps_CFG3 (0x02)

  34. #define MCP_8MHz_250kbps_CFG1 (0x00)
  35. #define MCP_8MHz_250kbps_CFG2 (0xb1)
  36. #define MCP_8MHz_250kbps_CFG3 (0x05)

  37. #define MCP_8MHz_200kbps_CFG1 (0x00)
  38. #define MCP_8MHz_200kbps_CFG2 (0xb4)
  39. #define MCP_8MHz_200kbps_CFG3 (0x06)

  40. #define MCP_8MHz_125kbps_CFG1 (0x01)
  41. #define MCP_8MHz_125kbps_CFG2 (0xb1)
  42. #define MCP_8MHz_125kbps_CFG3 (0x05)

  43. #define MCP_8MHz_100kbps_CFG1 (0x01)
  44. #define MCP_8MHz_100kbps_CFG2 (0xb4)
  45. #define MCP_8MHz_100kbps_CFG3 (0x06)

  46. #define MCP_8MHz_80kbps_CFG1 (0x01)
  47. #define MCP_8MHz_80kbps_CFG2 (0xbf)
  48. #define MCP_8MHz_80kbps_CFG3 (0x07)

  49. #define MCP_8MHz_50kbps_CFG1 (0x03)
  50. #define MCP_8MHz_50kbps_CFG2 (0xb4)
  51. #define MCP_8MHz_50kbps_CFG3 (0x06)

  52. #define MCP_8MHz_40kbps_CFG1 (0x03)
  53. #define MCP_8MHz_40kbps_CFG2 (0xbf)
  54. #define MCP_8MHz_40kbps_CFG3 (0x07)

  55. #define MCP_8MHz_31k25BPS_CFG1 (0x07)
  56. #define MCP_8MHz_31k25BPS_CFG2 (0xa4)
  57. #define MCP_8MHz_31k25BPS_CFG3 (0x04)

  58. #define MCP_8MHz_20kbps_CFG1 (0x07)
  59. #define MCP_8MHz_20kbps_CFG2 (0xbf)
  60. #define MCP_8MHz_20kbps_CFG3 (0x07)

  61. #define MCP_8MHz_10kbps_CFG1 (0x0f)
  62. #define MCP_8MHz_10kbps_CFG2 (0xbf)
  63. #define MCP_8MHz_10kbps_CFG3 (0x07)

  64. #define MCP_8MHz_5kbps_CFG1 (0x1f)
  65. #define MCP_8MHz_5kbps_CFG2 (0xbf)
  66. #define MCP_8MHz_5kbps_CFG3 (0x07)

  67. // speed 16M
  68. #define MCP_16MHz_1000kbps_CFG1 (0x00)
  69. #define MCP_16MHz_1000kbps_CFG2 (0xD0)
  70. #define MCP_16MHz_1000kbps_CFG3 (0x82)

  71. #define MCP_16MHz_666kbps_CFG1 (0x00)
  72. #define MCP_16MHz_666kbps_CFG2 (0xA0)
  73. #define MCP_16MHz_666kbps_CFG3 (0x04)

  74. #define MCP_16MHz_500kbps_CFG1 (0x00)
  75. #define MCP_16MHz_500kbps_CFG2 (0xF0)
  76. #define MCP_16MHz_500kbps_CFG3 (0x86)

  77. #define MCP_16MHz_250kbps_CFG1 (0x41)
  78. #define MCP_16MHz_250kbps_CFG2 (0xF1)
  79. #define MCP_16MHz_250kbps_CFG3 (0x85)

  80. #define MCP_16MHz_200kbps_CFG1 (0x01)
  81. #define MCP_16MHz_200kbps_CFG2 (0xFA)
  82. #define MCP_16MHz_200kbps_CFG3 (0x87)

  83. #define MCP_16MHz_125kbps_CFG1 (0x03)
  84. #define MCP_16MHz_125kbps_CFG2 (0xF0)
  85. #define MCP_16MHz_125kbps_CFG3 (0x86)

  86. #define MCP_16MHz_100kbps_CFG1 (0x03)
  87. #define MCP_16MHz_100kbps_CFG2 (0xFA)
  88. #define MCP_16MHz_100kbps_CFG3 (0x87)

  89. #define MCP_16MHz_95kbps_CFG1 (0x03)
  90. #define MCP_16MHz_95kbps_CFG2 (0xAD)
  91. #define MCP_16MHz_95kbps_CFG3 (0x07)

  92. #define MCP_16MHz_83k3BPS_CFG1 (0x03)
  93. #define MCP_16MHz_83k3BPS_CFG2 (0xBE)
  94. #define MCP_16MHz_83k3BPS_CFG3 (0x07)

  95. #define MCP_16MHz_80kbps_CFG1 (0x03)
  96. #define MCP_16MHz_80kbps_CFG2 (0xFF)
  97. #define MCP_16MHz_80kbps_CFG3 (0x87)

  98. #define MCP_16MHz_50kbps_CFG1 (0x07)
  99. #define MCP_16MHz_50kbps_CFG2 (0xFA)
  100. #define MCP_16MHz_50kbps_CFG3 (0x87)

  101. #define MCP_16MHz_40kbps_CFG1 (0x07)
  102. #define MCP_16MHz_40kbps_CFG2 (0xFF)
  103. #define MCP_16MHz_40kbps_CFG3 (0x87)

  104. #define MCP_16MHz_33kbps_CFG1 (0x09)
  105. #define MCP_16MHz_33kbps_CFG2 (0xBE)
  106. #define MCP_16MHz_33kbps_CFG3 (0x07)

  107. #define MCP_16MHz_31k25BPS_CFG1 (0x0F)
  108. #define MCP_16MHz_31k25BPS_CFG2 (0xF1)
  109. #define MCP_16MHz_31k25BPS_CFG3 (0x85)

  110. #define MCP_16MHz_25kbps_CFG1 (0X0F)
  111. #define MCP_16MHz_25kbps_CFG2 (0XBA)
  112. #define MCP_16MHz_25kbps_CFG3 (0X07)

  113. #define MCP_16MHz_20kbps_CFG1 (0x0F)
  114. #define MCP_16MHz_20kbps_CFG2 (0xFF)
  115. #define MCP_16MHz_20kbps_CFG3 (0x87)

  116. #define MCP_16MHz_10kbps_CFG1 (0x1F)
  117. #define MCP_16MHz_10kbps_CFG2 (0xFF)
  118. #define MCP_16MHz_10kbps_CFG3 (0x87)

  119. #define MCP_16MHz_5kbps_CFG1  (0x3F)
  120. #define MCP_16MHz_5kbps_CFG2  (0xFF)
  121. #define MCP_16MHz_5kbps_CFG3  (0x87)

  122. //20M
  123. #define MCP_20MHz_125kbps_CFG1 (0x04)////CF1    SJW=1TQ    BRP=4
  124. #define MCP_20MHz_125kbps_CFG2 (0xB2)////CF2    PTS=2TQ    PS1=7TQ   在采樣點進行一次采樣
  125. #define MCP_20MHz_125kbps_CFG3 (0x05)////CF3    PS2=6TQ


  126. //-----------------------------------------------------------------------------------------------------------------


  127. /*******************************************************************
  128. *                  CAN SPI commands                               *
  129. *******************************************************************/





  130. //--------------------------MCP2515的SPI指令集--------------------------------

  131. #define     MCP_SPI_RESET           0xC0    //MCP2515復位 將內部寄存器復位為缺省狀態,并將器件設定為配置模式
  132. #define     MCP_SPI_READ            0x03    //從

  133. //指定地址起始的寄存器讀取數據
  134. #define     MCP_SPI_WRITE           0x02    //將數據寫入指定地址起始的寄存器。
  135. #define     MCP_SPI_BitMOD          0x05    //位修改 允許用戶將特殊寄存器中的單獨位置1或置0
  136. //---------------------------------------------------
  137. #define     MCP_SPI_LOAD_TX0        0x40    //裝載 TX0 緩沖器
  138. #define     MCP_SPI_LOAD_TX1        0x42    //裝載 TX1 緩沖器
  139. #define     MCP_SPI_LOAD_TX2        0x44    //裝載 TX2 緩沖器
  140. //---------------------------------------------------
  141. #define     MCP_SPI_RTS             0x80    //TXB  請求發送功能
  142. #define     MCP_SPI_RTS_TX0         0x81    //TXB0 請求發送
  143. #define     MCP_SPI_RTS_TX1         0x82    //TXB1 請求發送
  144. #define     MCP_SPI_RTS_TX2         0x84    //TXB2 請求發送
  145. #define     MCP_SPI_RTS_ALL         0x87    //TXB0、TXB1、TXB2請求發送報文
  146. //---------------------------------------------------
  147. #define     MCP_SPI_READ_RX0        0x90    //快速查詢命令 讀 RX0 緩沖器  注:在拉升CS引腳為高電平后,相關的RX標志位(CANINTF.RX0IF)將被清零
  148. #define     MCP_SPI_READ_RX1        0x94    //快速查詢命令 讀 RX1 緩沖器  注:在拉升CS引腳為高電平后,相關的RX標志位(CANINTF.RX1IF)將被清零
  149. //---------------------------------------------------
  150. #define     MCP_SPI_READ_STATUS     0xA0    //快速查詢命令 讀取寄存器狀態,可讀取有關發送和接收功能的一些狀態位。
  151. #define     MCP_SPI_RX_STATUS       0xB0    //快速查詢命令 RX狀態 ,確定匹配的濾波器和接收報文的類型 (標準幀、擴展幀和 / 或遠程幀)。

  152. //-----------------------------------------------------------------------------------------------------------------

  153. typedef struct      //MCP2515發送接收 地址 結構體
  154. {
  155.      unsigned char CTRL;    //-*-控制寄存器

  156.      unsigned char SIDH;    //- -標準標識符 高位

  157.      unsigned char SIDL;    //- -標準標識符 低位 【其中bit3=1 報文將發送擴展標識符】

  158.      unsigned char EID8;    //- -擴展標識符 高位

  159.      unsigned char EID0;    //- -擴展標識符 低位

  160.      unsigned char DLC;     //- -數據長度碼

  161.      unsigned char Data[8]; //- -數據

  162. }MCP_Addr_Typedef;

  163. //  MCP2515寄存器地址列表

  164. MCP_Addr_Typedef TXB0; //發送緩沖器0 地址 TXB0
  165. MCP_Addr_Typedef TXB1; //發送緩沖器1 地址 TXB1
  166. MCP_Addr_Typedef TXB2; //發送緩沖器2 地址 TXB2

  167. MCP_Addr_Typedef RXB0; //接收緩沖器0 地址 RXB0
  168. MCP_Addr_Typedef RXB1; //接收緩沖器1 地址 RXB1

  169. //--------------------------------------------------------------------------------

  170. typedef struct      //MCP2515 CAN  報文數據結構
  171. {
  172.     uint32_t StdId;      //標準幀 ID  參數值:0~0x7FF       StdId—bit10~bit0 共11位

  173.     uint32_t ExtId;      //拓展幀 ID  參數值:0~0x1FFFFFFF  ExtId—bit28~bit0 共29位

  174.     char  IDE;      //SIDL.bit.3  【0—標準幀 ; 1—擴展幀]】

  175.     char  RTR;      // DLC.bit6   【0—數據幀 ; 1—遠程幀】

  176.     char  DLC;      //數據長度  DLC.bit3~0   參數值:0~8

  177.     char  Data[8];  //數據內容  參數值:0~0xFF

  178. }MCP2515_CAN_MSG;


  179. //---------------------------------------------------


  180. MCP2515_CAN_MSG TXBDATA0; //發送數據 0


  181. MCP2515_CAN_MSG RXBDATA0; //接收數據0

  182. uint32_t CanIdJS=0;      //記錄接收到ID上網總數


  183. unsigned char CAN_MCP_Flag=0;  //接收到數據標志位


  184. char CAN_ERROR;    //CAN總線錯誤代碼
復制代碼
51hei.png
所有資料51hei提供下載:
mcp2515.zip (87.31 KB, 下載次數: 75)

評分

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

查看全部評分

回復

使用道具 舉報

ID:973317 發表于 2022-8-19 20:34 | 顯示全部樓層
厲害哦,不錯哦
回復

使用道具 舉報

ID:450820 發表于 2022-11-8 17:23 | 顯示全部樓層
不錯,正好需要,下載來學習下
回復

使用道具 舉報

ID:1048397 發表于 2022-11-23 14:16 | 顯示全部樓層
感謝樓主分享!學習一下。

前一段時間想硬改一個電源,后來查資料這個電源是CAN協議通信的,如果是協議控制,就不用動硬件了。
回復

使用道具 舉報

ID:586551 發表于 2022-12-26 08:53 | 顯示全部樓層
樓主,想提問一下,我想更改他的拓展幀id,但是幀id的第一位是優先級和pf值,不知道得修改哪個寄存器
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精| 免费一级淫片aaa片毛片a级 | 丝袜美腿一区二区三区动态图 | 久久久www成人免费精品 | 国产一区二区 | 亚洲社区在线 | 国产精品久久久久久久一区二区 | 亚洲视频手机在线 | 一区二区三区欧美 | 在线中文字幕av | 中文字幕日韩欧美一区二区三区 | av手机在线 | 久久久久综合 | 欧美在线资源 | 欧美视频成人 | 国产精品一码二码三码在线 | 国产高清一区二区三区 | 激情 婷婷 | 国产丝袜人妖cd露出 | 国产一区二区三区四区五区3d | 日韩高清www | 国产午夜三级一区二区三 | 国产一级淫片a直接免费看 免费a网站 | 国产一区二区三区视频 | 成人永久免费 | 一区二区在线免费观看视频 | 中文字幕在线免费视频 | 中文字幕三区 | 欧美成人精品在线 | 成人在线视频一区二区三区 | h片在线观看免费 | 日屁网站 | 国产精品久久久久久久久久久久冷 | 国产成人精品网站 | 久草视频在线播放 | 日日操夜夜操天天操 | 精品国产一区二区三区久久 | 成人午夜影院 | 亚洲免费久久久 | 成人婷婷| 亚洲精品在线视频 |