找回密码
 注册
关于网站域名变更的通知
查看: 240|回复: 1
打印 上一主题 下一主题

【RK3562J开发笔记】MCP2518FD外部CAN-FD控制器的调试方法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
 楼主| 发表于 2024-12-7 14:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 飞凌嵌入式 于 2024-12-7 14:49 编辑
5 i4 Z' \- q$ b: R" c: D1 R! @
5 W2 v- g8 M. H9 R
“SPI转CAN-FD”是嵌入式开发领域的常用方法,它极大地促进了不同通信接口之间的无缝连接,并显著降低了系统设计的复杂性。飞凌嵌入式依托瑞芯微RK3562J处理器打造的OK3562J-C开发板因为内置了SPI转CAN-FD驱动,从而原生支持这一功能。该开发板特别设计了一组SPI引脚【P8】,专为SPI转CAN-FD应用而引出,为用户提供了极大的便利。

! ^* A5 f8 i6 X  h0 Y) P
MCP2518FD是一款在各行业中都有着广泛应用的CAN-FD控制器芯片,本文就将为大家介绍如何在飞凌嵌入式RK3562J开发板上适配MCP2518FD芯片。
* u$ c. j3 n, T( R# c! |: C6 o
1、适配驱动
RK3562J的内核中已经具备MCP2518FD的驱动文件,要在配置文件中将驱动配置进内核,在kernel下打开图形化配置界面make menuconfig ARCH=ARM64。

5 T- X/ K3 ]2 K0 u
(1) 按下 ‘/’ 键进入搜索界面,输入 mcp251 可搜索MCP2518驱动:
上图中的CAN_MCP251XFD就是适配MCP2518FD模块的驱动。

( ]% ]8 x0 l/ d1 h4 h
(2) 选择 2 将其打 * 编译进内核:
$ P% V1 j0 d) {4 G) X4 n
(3)选择 save 保存配置到defconfig文件,文件路径:
/home/forlinx/3562/OK3562-linuxsource/kernel/arch/arm64/configs/OK3562_Linux_defconfig

. Q$ j+ [& M; a3 ]# V& t
2、适配设备树
(1) 飞凌嵌入式RK3562J开发板已引出一组SPI引脚:
(2) 驱动配置完成后要配置的是设备树文件:
OK3562-C-common.dtsi
  l( K. q5 b5 G% u$ V; z
(3) 具体的配置信息如下:
  1. diff --git a/arch/arm64/boot/dts/rockchip/OK3562-C-common.dtsi b/arch/arm64/boot/dts/rockchip/OK3562-C-common.dtsi
    ( n/ B5 d6 a* y) [9 M6 ?
  2. index 158f03d70..671a491bf 1006442 M, z% l( |/ b3 s% @
  3. --- a/arch/arm64/boot/dts/rockchip/OK3562-C-common.dtsi
    ) @2 _/ D: T" C% g
  4. +++ b/arch/arm64/boot/dts/rockchip/OK3562-C-common.dtsi
    1 p, ?) p9 x: L) F; C$ m$ M. C
  5. @@ -19,6 +19,12 @@7 K" ]( {  S* F% O7 I; i8 L% d
  6. model = "Forlinx OK3562 Board";, k: R. ~# `+ f
  7. compatible = "forlinx,ok3562","rockchip,rk3562";
    ' U0 W7 v9 M% p9 B" G
  8. + mcp2518_clk: mcp2518-clk {, S4 v. z% l& o, O( \
  9. + compatible = "fixed-clock";" k3 P* r! ^% l; {" U. H4 C
  10. + #clock-cells = <0>;
    5 N. n7 h  x' \# ^9 }
  11. + clock-frequency = <40000000>;
    % j" @1 A7 N0 v( n" d+ b7 l
  12. + };: i0 P& |5 }# j/ e) U1 `
  13. ++ z+ u: f; V' K3 H2 z8 J9 p
  14. forlinx-control {, {5 y) r& W$ x; H4 c* O
  15. status = "disabled";
    * R/ L9 [( ?4 b4 l
  16. disp_type = "mipi"; //mipi or lvds
    0 \+ ~- j: J) s
  17. @@ -662,6 +668,13 @@
    2 z* U- j+ E" g
  18. };- b) s, D, W9 k* C% r
  19. &pinctrl {8 Z. O2 i2 n- {1 g
  20. +
    & R: S+ c. l% K# |5 w( C2 I" P2 }
  21. + mcp2518 {9 V- I( S$ x* c
  22. + mcp2518_irq_pins:mcp2518_irq_pins {' _- G( K# X2 r2 P" y0 X2 ^  Z
  23. + rockchip,pins = <4 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>;
    $ q6 S  e9 _9 r6 ~( Q% [; y
  24. + };* J6 K% e$ Y1 V4 F/ _7 }; `
  25. + };
    * o* g% `' V) k
  26. +- J6 D1 c0 A4 j8 a' a
  27. touch {3 i# H. i% M: D: ]( M1 O0 k
  28. gt928_lvds_gpio:gt928-lvds-gpio {1 N/ i) x9 e, U% ~. h
  29. rockchip,pins = <3 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>,' I3 @! I, Z; A& K: [9 W4 X
  30. @@ -980,13 +993,24 @@* o6 V& U" m. k) b5 |0 L5 D1 ~
  31. &spi2 {
    : ^- Z' d4 v7 k2 Z
  32. + pinctrl-names = "default";
    6 J* P: W' g3 ]1 k. Z0 r$ w# I
  33. + pinctrl-0 = <&spi2m0_csn0 &spi2m0_csn1 &spi2m0_pins>;
    / b2 c% Y: J" a$ @' L, U+ x
  34. status = "okay";
    ( T" ^, z( u6 P9 r+ K: I
  35. - spi_dev0: spi@0 {4 R, I0 Z+ e" v( y$ `: n5 B. y
  36. +/* spi_dev0: spi@0 {7 k5 y) z! G: k, s- c7 `+ p
  37. compatible = "rohm,dh2228fv";
    1 @' Y3 J! f1 s& X8 y1 |; m- n
  38. 2 / 5
    / ?& \& l! {- Z' t$ E% D  t3 t" H
  39. pl022,com-mode = <1>;0 D! k+ p9 a5 T: F- T2 l# g- p* L
  40. spi-max-frequency = <10000000>;
    ; m+ h, |4 S( G9 m/ m8 K9 l
  41. reg = <0>;
    5 s" R5 _8 Y( i  ]3 x5 G
  42. status = "okay";
    ! C( n3 e# D8 X5 f+ ~) ~. B
  43. + };*/
    3 I2 W" {1 G( u/ j" A8 p/ l6 w; T
  44. + spi@0{
    " x" z% l, W- O/ ^$ h: `
  45. + compatible = "microchip,mcp2518fd";
    1 Q8 X: h( B" l% [1 L6 n8 M
  46. + reg = <0>;
      x$ @8 e- a& Q
  47. + clocks = <&mcp2518_clk>;4 Y8 V. u5 p+ a; U2 |
  48. + pinctrl-names = "default";
    - c' C3 g( f( P4 p- O+ f
  49. + pinctrl-0 = <&mcp2518_irq_pins>;4 s1 n/ I; Y$ d; Q$ W% H( G
  50. + spi-max-frequency = <20000000>;
    3 _& E9 }, [& X  d7 o, ~
  51. + interrupts-extended= <&gpio4 RK_PB0 IRQ_TYPE_LEVEL_LOW>;+ m. ~/ c6 o4 G
  52. };
    7 ~1 Z* t' C- {" R2 J" h
  53. };; c7 L; g! j, r; f3 ]+ P
复制代码

5 N' R! G/ X1 i) {
① mcp2518_clk 是时钟频率节点,要匹配模块实际的晶振频率;
② 模块上有的 INT 脚是模块的中断脚,在适配时需要连接一个可控的GPIO引脚作为终端脚;
③ 在 spi2 节点下添加匹配MCP2518驱动的设备树信息,compatible 信息不能出错,这是匹配驱动的重要属性。
9 t! j: A' X9 N
3、编译烧写
将以上的驱动和设备树配置好后,编译内核烧写进开发板就可以测试了:
(1) 在源码目录下单独编译kernel:
forlinx@ubuntu:~/3562/OK3562-linux-source$ ./build.sh kernel
在源码目录下的kernel目录下会生成镜像文件 boot.img
+ u, X3 Z6 b" ^
(2) 将镜像文件烧录到开发板,需要用到工具 RKDevTool ,此工具在OK3562的资料包里可以找到:
① 打开烧写工具;
② 用Type-C数据线连接PC和开发板底部的Type-C0接口;
③ 按住开发板的Recovery键不要松开,重启开发板;
④ 注意工具会识别到开发板是否进入烧录状态。
⑤ 择之前编译好的 boot.img 镜像文件,在boot选项前面打勾,点击执行进行烧写,烧写完成会自动重启开发板

9 u* X" L' l9 L- e# b" V2 F" g
4、功能测试
在开发板内搜索can节点,使用 ifconfig -a 命令
可以看到生成的can0节点。接下来的功能测试,我们采用OK3562J-C和OK3568-C两块开发板的can0进行数据互发测试。

; }5 j( @. r; o4 i2 L
(1) OK3562J-C开发板接收数据:
① 设置can0的波特率
ip link set can0 type can bitrate 500000
② 打开can0设备,并把can0设置成服务端接收数据
ifconfig can0 up //打开can0设备
candump can0& //can0设备设置成服务端
③ 配置OK3568-C开发板的can0作为客户端,发送信息给OK3562J-C开发板的can0
ifconfig can0 down
ip link set can0 up type can bitrate 500000
ifconfig can0 up
cansend can0 123#1122334aabbccd //发送信息
④ OK3562J-C开发板会收到OK3568发来的消息
(注:上图中出现的报错是MCP2518FD驱动的问题,测试不会影响通信。)

  x& b' U6 n0 J# e( |6 h4 Q
(2) OK3562J-C开发板发送数据:
① 设置波特率等操作同上,在配置功能时要使用 cansend 命令发送数据。
② OK3568-C依照OK3562-C的方法配置成接收数据的服务端。
ifconfig can0 down
ip link set can0 up type can bitrate 500000
ifconfig can0 up
candump can0&

% b- z  I; I; x1 T) |% X
可以看到,两块开发板可以进行正常的数据互发。以上是飞凌嵌入式RK3562J开发板适配和测试MCP2518FD模块的全部过程,希望能够对大家的项目开发有所帮助。
+ M- H3 |; t7 ]" K

该用户从未签到

2#
发表于 2024-12-11 10:36 | 只看该作者
开发板例子程序吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-23 14:00 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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