搜索

[活动专区] 【赛元95F】 + 10、SC95F8617 CAN发送测试

[复制链接]
130|1
 楼主 | 2020-3-25 17:17 | 显示全部楼层 |阅读模式
     测试下使用SPI方式驱动MCP2515来实现CAN通信,这次测试下CAN发送数据功能。

    一、电路

   1.1、使用SPI0端口
    102.png

   1.2、CAN通信电路
    101.png

    二、程序

    2.1、main.c
  1. #include "config.h"

  2. void main(void)
  3. {
  4.         uint i=0;
  5.         uchar js=0;
  6.         uchar can_tx_buf[8];
  7.        
  8.         Init_led();
  9.         Init_uart(32, 9600);
  10.         uart_chl(1);   //usb-ttl
  11.         Init_mcp2515();
  12.         while(1)
  13.         {
  14.                 js++;
  15.                 can_tx_buf[7]=js;
  16.                 CAN_Send(can_tx_buf);
  17.                 for(i=0;i<50000;i++);

  18.         }
  19. }
复制代码


    2.2、mcp2515.c
  1. #include "config.h"

  2. bit SPI0Flag;

  3. void SPI0_Init(void)
  4. {
  5.         OTCON |= 0X10;    //SPI0
  6.         US0CON0 = 0x3F;   
  7.         US0CON1 = 0x01;   
  8.         US0CON0 |= 0x80;  
  9.         IE1 |= 0x01;
  10.         EA = 1;
  11. }

  12. void SpiInt(void) interrupt 7   
  13. {          
  14.         if(US0CON1&0X08)   
  15.         {
  16.                 US0CON1 &= ~0X08;
  17.         }
  18.         if(US0CON1&0X80)   
  19.         {
  20.                 US0CON1 &= ~0X80;
  21.                 SPI0Flag = 1;
  22.         }
  23. }

  24. void SPI0_WRITE(uchar dat)
  25. {
  26.         US0CON2 = dat;
  27.         while(!SPI0Flag);
  28.         SPI0Flag = 0;
  29. }


  30. void MCP2515_Reset(void)
  31. {
  32.         CAN_CS=0;
  33.         SPI0_WRITE(CAN_RESET);
  34.         CAN_CS=1;
  35. }

  36. void MCP2515_BitModity(uchar addr, uchar msk, uchar dat)
  37. {
  38.      CAN_CS=0;     
  39.      SPI0_WRITE(CAN_BIT_MODIFY);      
  40.      SPI0_WRITE(addr);                                                         
  41.      SPI0_WRITE(msk);                                                                 
  42.      SPI0_WRITE(dat);                                                         
  43.      CAN_CS=1;
  44.      return;
  45. }

  46. void SPI0_WriteByte(uchar adr,uchar dat)
  47. {
  48.         CAN_CS=0;
  49.         SPI0_WRITE(CAN_WRITE);
  50.         SPI0_WRITE(adr);
  51.         SPI0_WRITE(dat);
  52.         CAN_CS=1;
  53. }

  54. void CAN_Send(uchar *CAN_TX_Buf)
  55. {
  56.         uint i;
  57.         MCP2515_BitModity(TXB0CTRL,0x08,0x00);   
  58.         SPI0_WriteByte(TXB0SIDH,0x55);
  59.         SPI0_WriteByte(TXB0SIDL,0x08);
  60.         SPI0_WriteByte(TXB0EID8,0x55);
  61.         SPI0_WriteByte(TXB0EID0,0x88);

  62.         SPI0_WriteByte(TXB0DLC,DLC_8);         
  63.         SPI0_WriteByte(TXB0D0,CAN_TX_Buf[0]);          
  64.         SPI0_WriteByte(TXB0D1,CAN_TX_Buf[1]);
  65.         SPI0_WriteByte(TXB0D2,CAN_TX_Buf[2]);
  66.         SPI0_WriteByte(TXB0D3,CAN_TX_Buf[3]);
  67.         SPI0_WriteByte(TXB0D4,CAN_TX_Buf[4]);
  68.         SPI0_WriteByte(TXB0D5,CAN_TX_Buf[5]);
  69.         SPI0_WriteByte(TXB0D6,CAN_TX_Buf[6]);
  70.         SPI0_WriteByte(TXB0D7,CAN_TX_Buf[7]);
  71.         CAN_CS=0;
  72.         SPI0_WRITE(CAN_RTS | 0x01);               
  73.         CAN_CS=1;
  74. }

  75. void Init_mcp2515(void)
  76. {
  77.         uint i;
  78.         P0CON &= ~0x02;   //CANCS
  79.         P0CON |= 0x02;
  80.         P0PH |= 0x02;
  81.        
  82.         SPI0_Init();                   //SPI INIT
  83.        
  84.         MCP2515_Reset();
  85.         for(i=0;i<5000;i++);
  86.        
  87.         MCP2515_BitModity(CANCTRL,0xE0,0x80);
  88.         SPI0_WriteByte(CNF1,0x04);         //100k
  89.         SPI0_WriteByte(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);                 
  90.         SPI0_WriteByte(CNF3,PHSEG2_3TQ);                                                                                
  91.         SPI0_WriteByte(CANINTF,0x00);                                                                       
  92.         SPI0_WriteByte(CANINTE,0x03);       
  93.                                        
  94.         MCP2515_BitModity(CANCTRL,0xE0,0x00);
  95. }
复制代码
   
    2.3、mcp2515.h
  1. #ifndef _MCP2515_H_
  2. #define _MCP2515_H_

  3. sbit CAN_CS = P0^1;

  4. #define CANSTAT         0x0E
  5. #define CANCTRL         0x0F
  6. #define BFPCTRL         0x0C
  7. #define TEC             0x1C
  8. #define REC             0x1D
  9. #define CNF3            0x28
  10. #define CNF2            0x29
  11. #define CNF1            0x2A
  12. #define CANINTE         0x2B
  13. #define CANINTF         0x2C
  14. #define E**            0x2D
  15. #define TXRTSCTRL       0x0D

  16. #define RXF0SIDH        0x00
  17. #define RXF0SIDL        0x01
  18. #define RXF0EID8        0x02
  19. #define RXF0EID0        0x03
  20. #define RXF1SIDH        0x04
  21. #define RXF1SIDL        0x05
  22. #define RXF1EID8        0x06
  23. #define RXF1EID0        0x07
  24. #define RXF2SIDH        0x08
  25. #define RXF2SIDL        0x09
  26. #define RXF2EID8        0x0A
  27. #define RXF2EID0        0x0B
  28. #define RXF3SIDH        0x10
  29. #define RXF3SIDL        0x11
  30. #define RXF3EID8        0x12
  31. #define RXF3EID0        0x13
  32. #define RXF4SIDH        0x14
  33. #define RXF4SIDL        0x15
  34. #define RXF4EID8        0x16
  35. #define RXF4EID0        0x17
  36. #define RXF5SIDH        0x18
  37. #define RXF5SIDL        0x19
  38. #define RXF5EID8        0x1A
  39. #define RXF5EID0        0x1B

  40. #define RXM0SIDH        0x20
  41. #define RXM0SIDL        0x21
  42. #define RXM0EID8        0x22
  43. #define RXM0EID0        0x23
  44. #define RXM1SIDH        0x24
  45. #define RXM1SIDL        0x25
  46. #define RXM1EID8        0x26
  47. #define RXM1EID0        0x27

  48. #define TXB0CTRL        0x30
  49. #define TXB0SIDH        0x31
  50. #define TXB0SIDL        0x32
  51. #define TXB0EID8        0x33
  52. #define TXB0EID0        0x34
  53. #define TXB0DLC         0x35
  54. #define TXB0D0          0x36
  55. #define TXB0D1          0x37
  56. #define TXB0D2          0x38
  57. #define TXB0D3          0x39
  58. #define TXB0D4          0x3A
  59. #define TXB0D5          0x3B
  60. #define TXB0D6          0x3C
  61. #define TXB0D7          0x3D
  62.                         
  63. #define TXB1CTRL        0x40
  64. #define TXB1SIDH        0x41
  65. #define TXB1SIDL        0x42
  66. #define TXB1EID8        0x43
  67. #define TXB1EID0        0x44
  68. #define TXB1DLC         0x45
  69. #define TXB1D0          0x46
  70. #define TXB1D1          0x47
  71. #define TXB1D2          0x48
  72. #define TXB1D3          0x49
  73. #define TXB1D4          0x4A
  74. #define TXB1D5          0x4B
  75. #define TXB1D6          0x4C
  76. #define TXB1D7          0x4D

  77. #define TXB2CTRL        0x50
  78. #define TXB2SIDH        0x51
  79. #define TXB2SIDL        0x52
  80. #define TXB2EID8        0x53
  81. #define TXB2EID0        0x54
  82. #define TXB2DLC         0x55
  83. #define TXB2D0          0x56
  84. #define TXB2D1          0x57
  85. #define TXB2D2          0x58
  86. #define TXB2D3          0x59
  87. #define TXB2D4          0x5A
  88. #define TXB2D5          0x5B
  89. #define TXB2D6          0x5C
  90. #define TXB2D7          0x5D
  91.                         
  92. #define RXB0CTRL        0x60
  93. #define RXB0SIDH        0x61
  94. #define RXB0SIDL        0x62
  95. #define RXB0EID8        0x63
  96. #define RXB0EID0        0x64
  97. #define RXB0DLC         0x65
  98. #define RXB0D0          0x66
  99. #define RXB0D1          0x67
  100. #define RXB0D2          0x68
  101. #define RXB0D3          0x69
  102. #define RXB0D4          0x6A
  103. #define RXB0D5          0x6B
  104. #define RXB0D6          0x6C
  105. #define RXB0D7          0x6D
  106.                         
  107. #define RXB1CTRL        0x70
  108. #define RXB1SIDH        0x71
  109. #define RXB1SIDL        0x72
  110. #define RXB1EID8        0x73
  111. #define RXB1EID0        0x74
  112. #define RXB1DLC         0x75
  113. #define RXB1D0          0x76
  114. #define RXB1D1          0x77
  115. #define RXB1D2          0x78
  116. #define RXB1D3          0x79
  117. #define RXB1D4          0x7A
  118. #define RXB1D5          0x7B
  119. #define RXB1D6          0x7C
  120. #define RXB1D7          0x7D
  121.                         
  122. /* TXBnCTRL */
  123. #define TXREQ           0x08
  124. #define TXP             0x03   

  125. /* RXBnCTRL */
  126. #define RXM             0x60
  127. #define BUKT            0x04

  128. /* CANCTRL */
  129. #define REQOP           0xE0
  130. #define ABAT            0x10
  131. #define        OSM                         0x08
  132. #define CLKEN           0x04
  133. #define CLKPRE          0x03

  134. /* CANSTAT */
  135. #define REQOP           0xE0
  136. #define ICOD            0x0E

  137. /* CANINTE */   
  138. #define RX0IE           0x01
  139. #define RX1IE           0x02
  140. #define TX0IE           0x04
  141. #define TX1IE           0x80
  142. #define TX2IE           0x10
  143. #define ERRIE           0x20
  144. #define WAKIE           0x40
  145. #define MERRE           0x80

  146. /* CANINTF */   
  147. #define RX0IF           0x01
  148. #define RX1IF           0x02
  149. #define TX0IF           0x04
  150. #define TX1IF           0x80
  151. #define TX2IF           0x10
  152. #define ERRIF           0x20
  153. #define WAKIF           0x40
  154. #define MERRF           0x80

  155. /* BFPCTRL */
  156. #define B1BFS           0x20
  157. #define B0BFS           0x10
  158. #define B1BFE           0x08
  159. #define B0BFE           0x04
  160. #define B1BFM           0x02
  161. #define B0BFM           0x01

  162. /* CNF1 Masks */
  163. #define SJW             0xC0
  164. #define BRP             0x3F

  165. /* CNF2 Masks */
  166. #define BTLMODE         0x80
  167. #define SAM             0x40
  168. #define PHSEG1          0x38
  169. #define PRSEG           0x07

  170. /* CNF3 Masks */
  171. #define WAKFIL          0x40
  172. #define PHSEG2          0x07

  173. /* TXRTSCTRL Masks */
  174. #define TXB2RTS         0x04
  175. #define TXB1RTS         0x02
  176. #define TXB0RTS         0x01

  177. /* CNF1 */
  178. #define SJW_1TQ         0x40
  179. #define SJW_2TQ         0x80
  180. #define SJW_3TQ         0x90
  181. #define SJW_4TQ         0xC0

  182. /* CNF2 */
  183. #define BTLMODE_CNF3    0x80
  184. #define BTLMODE_PH1_IPT 0x00

  185. #define SMPL_3X         0x40
  186. #define SMPL_1X         0x00

  187. #define PHSEG1_8TQ      0x38
  188. #define PHSEG1_7TQ      0x30
  189. #define PHSEG1_6TQ      0x28
  190. #define PHSEG1_5TQ      0x20
  191. #define PHSEG1_4TQ      0x18
  192. #define PHSEG1_3TQ      0x10
  193. #define PHSEG1_2TQ      0x08
  194. #define PHSEG1_1TQ      0x00

  195. #define PRSEG_8TQ       0x07
  196. #define PRSEG_7TQ       0x06
  197. #define PRSEG_6TQ       0x05
  198. #define PRSEG_5TQ       0x04
  199. #define PRSEG_4TQ       0x03
  200. #define PRSEG_3TQ       0x02
  201. #define PRSEG_2TQ       0x01
  202. #define PRSEG_1TQ       0x00

  203. /* CNF3 */
  204. #define PHSEG2_8TQ      0x07
  205. #define PHSEG2_7TQ      0x06
  206. #define PHSEG2_6TQ      0x05
  207. #define PHSEG2_5TQ      0x04
  208. #define PHSEG2_4TQ      0x03
  209. #define PHSEG2_3TQ      0x02
  210. #define PHSEG2_2TQ      0x01
  211. #define PHSEG2_1TQ      0x00

  212. #define SOF_ENABLED     0x80
  213. #define WAKFIL_ENABLED  0x40
  214. #define WAKFIL_DISABLED 0x00   

  215. /* CANINTE */
  216. #define RX0IE_ENABLED   0x01
  217. #define RX0IE_DISABLED  0x00
  218. #define RX1IE_ENABLED   0x02
  219. #define RX1IE_DISABLED  0x00
  220. #define G_RXIE_ENABLED  0x03
  221. #define G_RXIE_DISABLED 0x00

  222. #define TX0IE_ENABLED   0x04
  223. #define TX0IE_DISABLED  0x00
  224. #define TX1IE_ENABLED   0x08
  225. #define TX2IE_DISABLED  0x00
  226. #define TX2IE_ENABLED   0x10
  227. #define TX2IE_DISABLED  0x00
  228. #define G_TXIE_ENABLED  0x1C
  229. #define G_TXIE_DISABLED 0x00

  230. #define ERRIE_ENABLED   0x20
  231. #define ERRIE_DISABLED  0x00
  232. #define WAKIE_ENABLED   0x40
  233. #define WAKIE_DISABLED  0x00
  234. #define IVRE_ENABLED    0x80
  235. #define IVRE_DISABLED   0x00

  236. /* CANINTF */
  237. #define RX0IF_SET       0x01
  238. #define RX0IF_RESET     0x00
  239. #define RX1IF_SET       0x02
  240. #define RX1IF_RESET     0x00
  241. #define TX0IF_SET       0x04
  242. #define TX0IF_RESET     0x00
  243. #define TX1IF_SET       0x08
  244. #define TX2IF_RESET     0x00
  245. #define TX2IF_SET       0x10
  246. #define TX2IF_RESET     0x00
  247. #define ERRIF_SET       0x20
  248. #define ERRIF_RESET     0x00
  249. #define WAKIF_SET       0x40
  250. #define WAKIF_RESET     0x00
  251. #define IVRF_SET        0x80
  252. #define IVRF_RESET      0x00

  253. /* CANCTRL */
  254. #define REQOP_CONFIG    0x80
  255. #define REQOP_LISTEN    0x60
  256. #define REQOP_LOOPBACK  0x40
  257. #define REQOP_SLEEP     0x20
  258. #define REQOP_NORMAL    0x00

  259. #define ABORT           0x10

  260. #define OSM_ENABLED     0x08
  261. #define CLKOUT_ENABLED  0x04
  262. #define CLKOUT_DISABLED 0x00
  263. #define CLKOUT_PRE_8    0x03
  264. #define CLKOUT_PRE_4    0x02
  265. #define CLKOUT_PRE_2    0x01
  266. #define CLKOUT_PRE_1    0x00
  267. /* CANSTAT */
  268. #define OPMODE_CONFIG   0x80
  269. #define OPMODE_LISTEN   0x60
  270. #define OPMODE_LOOPBACK 0x40
  271. #define OPMODE_SLEEP    0x20
  272. #define OPMODE_NORMAL   0x00
  273. /* RXBnCTRL */
  274. #define RXM_RCV_ALL     0x60
  275. #define RXM_VALID_EXT   0x40
  276. #define RXM_VALID_STD   0x20
  277. #define RXM_VALID_ALL   0x00

  278. #define RXRTR_REMOTE    0x08
  279. #define RXRTR_NO_REMOTE 0x00

  280. #define BUKT_ROLLOVER    0x04
  281. #define BUKT_NO_ROLLOVER 0x00

  282. #define FILHIT0_FLTR_1  0x01
  283. #define FILHIT0_FLTR_0  0x00

  284. #define FILHIT1_FLTR_5  0x05
  285. #define FILHIT1_FLTR_4  0x04
  286. #define FILHIT1_FLTR_3  0x03
  287. #define FILHIT1_FLTR_2  0x02
  288. #define FILHIT1_FLTR_1  0x01
  289. #define FILHIT1_FLTR_0  0x00

  290. /* TXBnCTRL */
  291. #define TXREQ_SET       0x08
  292. #define TXREQ_CLEAR     0x00

  293. #define TXP_HIGHEST     0x03
  294. #define TXP_INTER_HIGH  0x02
  295. #define TXP_INTER_LOW   0x01
  296. #define TXP_LOWEST      0x00
  297.   
  298. #define DLC_0          0x00
  299. #define DLC_1          0x01
  300. #define DLC_2          0x02
  301. #define DLC_3          0x03
  302. #define DLC_4          0x04
  303. #define DLC_5          0x05
  304. #define DLC_6          0x06
  305. #define DLC_7          0x07   
  306. #define DLC_8          0x08

  307. #define CAN_RESET       0xC0                  //????
  308. #define CAN_READ        0x03
  309. #define CAN_WRITE       0x02
  310. #define CAN_RTS         0x80                //??????
  311. #define CAN_RTS_TXB0    0x81
  312. #define CAN_RTS_TXB1    0x82
  313. #define CAN_RTS_TXB2    0x84
  314. #define CAN_RD_STATUS   0xA0
  315. #define CAN_BIT_MODIFY  0x05  
  316. #define CAN_RX_STATUS   0xB0
  317. #define CAN_RD_RX_BUFF  0x90
  318. #define CAN_LOAD_TX     0X40  

  319. #define DUMMY_BYTE      0x00
  320. #define TXB0            0x31
  321. #define TXB1            0x41
  322. #define TXB2            0x51
  323. #define RXB0            0x61
  324. #define RXB1            0x71
  325. #define EXIDE_SET       0x08
  326. #define EXIDE_RESET     0x00

  327. //#define ABTF                6
  328. //#define MLOA                5
  329. //#define TXERR                4
  330. //#define TXREQ                3
  331. #define TXP1                1
  332. #define TXP0                0
  333. #define        EXIDE                3

  334. #define FILHIT2                2
  335. #define FILHIT1                1

  336. #define        SRR                        4
  337. #define        IDE                        3

  338. #define        RTR                        6
  339. #define        DLC3                3
  340. #define        DLC2                2
  341. #define        DLC1                1
  342. #define DLC0                0

  343. void Init_mcp2515(void);
  344. void CAN_Send(uchar *CAN_TX_Buf);
  345.        
  346. #endif
复制代码


    三、测试结果

    通过CAN卡查看接收的数据。
    100.png


使用特权

评论回复
| 2020-3-26 09:46 | 显示全部楼层
感谢分享,奖励您100家园币,家园币可以兑换礼品或抽奖,欢迎体验~

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表