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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 飞凌嵌入式 于 2024-12-7 14:49 编辑
8 \; S0 y% L3 B5 Y( K5 V: D1 @( V: C" r+ x- X- N% s9 @, ^
“SPI转CAN-FD”是嵌入式开发领域的常用方法,它极大地促进了不同通信接口之间的无缝连接,并显著降低了系统设计的复杂性。飞凌嵌入式依托瑞芯微RK3562J处理器打造的OK3562J-C开发板因为内置了SPI转CAN-FD驱动,从而原生支持这一功能。该开发板特别设计了一组SPI引脚【P8】,专为SPI转CAN-FD应用而引出,为用户提供了极大的便利。

0 M7 ~8 s( O0 l, ^
MCP2518FD是一款在各行业中都有着广泛应用的CAN-FD控制器芯片,本文就将为大家介绍如何在飞凌嵌入式RK3562J开发板上适配MCP2518FD芯片。

0 Y; i  }. I6 G1、适配驱动
RK3562J的内核中已经具备MCP2518FD的驱动文件,要在配置文件中将驱动配置进内核,在kernel下打开图形化配置界面make menuconfig ARCH=ARM64。

6 U7 E9 `9 `5 w/ M2 J7 G6 M
(1) 按下 ‘/’ 键进入搜索界面,输入 mcp251 可搜索MCP2518驱动:
上图中的CAN_MCP251XFD就是适配MCP2518FD模块的驱动。
/ r' o! L$ A/ L! z3 l* U
(2) 选择 2 将其打 * 编译进内核:

% D1 |8 X! A% ?/ `+ g" m
(3)选择 save 保存配置到defconfig文件,文件路径:
/home/forlinx/3562/OK3562-linuxsource/kernel/arch/arm64/configs/OK3562_Linux_defconfig

3 {  r! W; R6 g0 l" p
2、适配设备树
(1) 飞凌嵌入式RK3562J开发板已引出一组SPI引脚:
(2) 驱动配置完成后要配置的是设备树文件:
OK3562-C-common.dtsi
7 r; x5 `) V% R9 q
(3) 具体的配置信息如下:
  1. diff --git a/arch/arm64/boot/dts/rockchip/OK3562-C-common.dtsi b/arch/arm64/boot/dts/rockchip/OK3562-C-common.dtsi
    7 t) k% b9 e3 V! m
  2. index 158f03d70..671a491bf 100644! a9 R/ _5 j9 G6 O8 ?
  3. --- a/arch/arm64/boot/dts/rockchip/OK3562-C-common.dtsi
    & }) k' l$ |: a8 Z9 b5 v
  4. +++ b/arch/arm64/boot/dts/rockchip/OK3562-C-common.dtsi* R6 @3 {  t, a& ?2 c
  5. @@ -19,6 +19,12 @@
    * I2 p9 n7 q+ W+ P+ \3 b
  6. model = "Forlinx OK3562 Board";( j  ]5 V# i' h  J4 X
  7. compatible = "forlinx,ok3562","rockchip,rk3562";8 L1 W, D9 H2 k6 k* n/ G5 e
  8. + mcp2518_clk: mcp2518-clk {, m, s5 g4 L2 W, [1 e
  9. + compatible = "fixed-clock";! o! G. K: `- y9 e+ @
  10. + #clock-cells = <0>;, D# }. P# f) |) |* [* G, n
  11. + clock-frequency = <40000000>;
    3 r7 l7 I: I& I4 N" q0 [- `4 J
  12. + };$ B" x* {7 b) T, T
  13. +
    / U: m+ l5 v$ i8 X: G' w- q
  14. forlinx-control {3 K4 z% M" y" p: ~4 J) \0 G9 D, C
  15. status = "disabled";/ V  V  e2 p! n7 m4 @' k
  16. disp_type = "mipi"; //mipi or lvds
    ) T( T& O& ]- V5 U% C5 Y
  17. @@ -662,6 +668,13 @@
    8 W+ ^4 q% g5 P  T7 |7 {
  18. };
    7 k, n1 g; i$ t2 B
  19. &pinctrl {
    ; P; v* ]- {, s; Q* s
  20. +/ m: l# E$ q& D+ ]6 I8 f
  21. + mcp2518 {7 G7 I; K& x4 m! V5 y
  22. + mcp2518_irq_pins:mcp2518_irq_pins {
    + t, t. t, l' U1 l- D3 O9 x% {
  23. + rockchip,pins = <4 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>;
    ; f: a* _" Q* `  m  \1 F! S* Q) {4 [
  24. + };$ d8 N/ h" m: M# J
  25. + };1 @( U* K* K: A" J5 h
  26. +
    # Z1 Y+ {5 Q& Z! A+ G
  27. touch {
    ) W) C8 N5 P2 F
  28. gt928_lvds_gpio:gt928-lvds-gpio {$ e9 E! C2 i- [% H9 y
  29. rockchip,pins = <3 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>,
    , {. ~6 l( g6 i. Y3 f
  30. @@ -980,13 +993,24 @@
    ! r: x8 P/ j1 I- j+ T. J
  31. &spi2 {
    - i/ o: z5 C  z
  32. + pinctrl-names = "default";
    : W8 t/ I! f) `/ f! q1 S3 Z: W. [
  33. + pinctrl-0 = <&spi2m0_csn0 &spi2m0_csn1 &spi2m0_pins>;
    7 c. \/ e' T: \4 D' D7 A( g
  34. status = "okay";
      Q9 D# M9 S/ U: Q3 b! H
  35. - spi_dev0: spi@0 {
      `/ d+ k$ R) d/ a" x
  36. +/* spi_dev0: spi@0 {$ w  Y5 e( j' L/ m% A
  37. compatible = "rohm,dh2228fv";. x$ @% [& D. A# X0 K  k3 z
  38. 2 / 5
    7 ?' e4 V) K. P
  39. pl022,com-mode = <1>;
    2 d  f0 W, p% y' e
  40. spi-max-frequency = <10000000>;
    3 O  U4 B$ s8 U' J, U$ A! k% S/ e) `! }
  41. reg = <0>;
    5 [) ^5 t  k' K$ e3 q, d% D7 r
  42. status = "okay";
    ' s# p3 w7 r  R3 U/ y- `
  43. + };*/
    ) _6 a! y  V9 {+ ?. C$ b
  44. + spi@0{
    * B7 R6 X/ ^8 z; m
  45. + compatible = "microchip,mcp2518fd";( u# Y8 R. V) L; f! l- ]7 R/ @
  46. + reg = <0>;: [: w7 }% M6 D) N0 i$ x" e
  47. + clocks = <&mcp2518_clk>;6 K* _  T& ~3 d
  48. + pinctrl-names = "default";7 Y. A* ~6 f) d+ R  \# L9 x( ^4 D5 F
  49. + pinctrl-0 = <&mcp2518_irq_pins>;
    , v' q0 ^8 C# O: n, t
  50. + spi-max-frequency = <20000000>;
    * y' y8 m! [9 d  P: v
  51. + interrupts-extended= <&gpio4 RK_PB0 IRQ_TYPE_LEVEL_LOW>;, h! Z, [, r( J7 \: c: r/ S
  52. };
    - {2 t9 c$ k  i) `1 l1 R5 o
  53. };
      f; |0 J/ C; o! d$ k" {7 _+ V
复制代码

$ z. p1 ]* J7 \0 W
① mcp2518_clk 是时钟频率节点,要匹配模块实际的晶振频率;
② 模块上有的 INT 脚是模块的中断脚,在适配时需要连接一个可控的GPIO引脚作为终端脚;
③ 在 spi2 节点下添加匹配MCP2518驱动的设备树信息,compatible 信息不能出错,这是匹配驱动的重要属性。

0 y/ `6 w& }1 ~2 ^3 p) E
3、编译烧写
将以上的驱动和设备树配置好后,编译内核烧写进开发板就可以测试了:
(1) 在源码目录下单独编译kernel:
forlinx@ubuntu:~/3562/OK3562-linux-source$ ./build.sh kernel
在源码目录下的kernel目录下会生成镜像文件 boot.img
; ~5 C4 t. J/ x. e5 S: R3 ?/ g
(2) 将镜像文件烧录到开发板,需要用到工具 RKDevTool ,此工具在OK3562的资料包里可以找到:
① 打开烧写工具;
② 用Type-C数据线连接PC和开发板底部的Type-C0接口;
③ 按住开发板的Recovery键不要松开,重启开发板;
④ 注意工具会识别到开发板是否进入烧录状态。
⑤ 择之前编译好的 boot.img 镜像文件,在boot选项前面打勾,点击执行进行烧写,烧写完成会自动重启开发板

8 t& V+ Q1 N! a1 r8 P; W
4、功能测试
在开发板内搜索can节点,使用 ifconfig -a 命令
可以看到生成的can0节点。接下来的功能测试,我们采用OK3562J-C和OK3568-C两块开发板的can0进行数据互发测试。
1 q' o: C4 y) W: F
(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驱动的问题,测试不会影响通信。)
+ B3 X- e! ?' A$ }5 e
(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&
; k/ k+ Z3 L( v) |
可以看到,两块开发板可以进行正常的数据互发。以上是飞凌嵌入式RK3562J开发板适配和测试MCP2518FD模块的全部过程,希望能够对大家的项目开发有所帮助。

7 A) ?+ _! V  i3 p: T; w# I

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 22:45 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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