找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1994|回复: 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, 下载次数: 32)

评分

参与人数 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 单片机教程网

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