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

在i.MX8MP开发板上实现SPI转CAN

[复制链接]

该用户从未签到

跳转到指定楼层
1#
 楼主| 发表于 2023-9-11 15:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
本帖最后由 罗罗诺亚 于 2023-9-11 15:24 编辑
, d0 z" b5 a7 |! M/ m
& M* F. y6 _; t& x
) A& j( s+ k+ Q( U: E

% O; T# m% Z% D3 }; k
7 ^- Y7 I3 U. [( E9 a

( Y8 z. B; ^, v3 V. u8 n. s

飞凌嵌入式OKMX8MP-C开发板有两路原生CAN总线,但用户在开发产品时可能需要用到更多的CAN,这该如何解决呢?今天小编将为大家介绍一种SPI转CAN的方法,供各位工程师小伙伴参考。

说明

  • OKMX8MP-C核心板有两路原生的SPI总线,目前是将SPI1的引脚用作了LED和UART3的功能,SPI2做成了正常的SPI2接口。此处以SPI2转CAN为例,移植SPI转CAN芯片;


    " W) n/ R; g! Y. b

4 j2 T+ X* Q: y
  • SPI转CAN芯片型号为:MCP2518,这款芯片可转出CAN-FD,若只需要CAN功能,可参照该方式移植MCP2515或其他芯片;

    2 H; [' Q7 h$ j# u4 ?! n# t, s) l0 P

! u3 C) n0 v, U& W5 \: p8 h
  • 本次移植的MCP2518芯片驱动来源是i.MX8MQ的源码(处理器中默认移植MCP2518芯片)。

    & O+ A! u! G/ O0 p! r. P) `( T
4 ~8 C3 p) ~- n7 U7 T5 V

2 ]# r! s0 O/ W4 o' T4 W

01移植MC2518芯片驱动

在OK8MP-linux-kernel/drivers/net/can/spi/路径下创建一个文件夹——mcp25xxfd,将相关文件(包含.c文件、.h文件、Makefile、Kconfig等)放置到此文件夹中。


' [) ~; [0 z7 d" W9 k" e/ t

02补全对can_rx_offload_add_manual函数的定义

vi OK8MQ-linux-kernel/include/linux/can/rx-offload.h

添加:

[url=]复制[/url]

& S4 y& e: X/ v4 O6 ^
  1. 9 ?) f8 M4 n4 ]. q4 ~2 |
  2. <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,
    / u, X! V1 A' P0 @  \- V+ X# i
  3.     <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
    % e# |# B# B. U+ ~! L0 M
  4.     <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)% @+ z/ d; A# y( c# R; ^, S
复制代码
$ K- n' z' g% k: X! S- x

vi OK8MQ-linux-kernel/drivers/net/can/rx-offload.c

添加:

[url=]复制[/url]

+ W# o7 J5 D0 z& D9 u
  1. . X$ f& I3 `: p4 X
  2. <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,
    $ V* e  Y3 C6 c; q
  3.         <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,6 w. E; \4 F7 _6 R3 z
  4.             <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)! {, @# D5 W& f
  5. {6 i7 G, I) x. A- i+ z' E, K
  6.     <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)  i7 S$ w; [3 B/ S. Y2 ^5 }5 G( }
  7.             <font color="rgb(198, 120, 221)">return</font> -EINVAL;) W. u# M/ n/ \- ?2 D  @' Q8 S
  8.       <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);9 V) V8 M% s$ S; G; j" ]0 N
  9. }" Q7 x/ m1 O- L' j6 m
  10. EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码

3 {, a" J+ S# N# Y2 ?/ U& A% s1 T
7 F5 k6 P; A% D' u! v$ r

03修改上一级目录spi/下的Makefile和Kconfig

vi OK8MP-linux-kernel/drivers/net/can/spi/Makefile

添加:

[url=]复制[/url]

/ }# ?7 Y( c2 D  n/ _  S+ o9 g# L/ |2 s9 _
  1. obj-y     +=  mcp25xxfd/
复制代码

0 [: ]4 K& P. N) t( J/ R$ l7 G" t% W
# R8 `, Y( x1 y" D! h. [: S5 L

vi OK8MP-linux-kernel/drivers/net/can/spi/Kconfig

添加:

[url=]复制[/url]

9 {4 a1 l- v# l
  1. <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码
1 |2 N" \& l  b9 J1 z7 k1 `; e" q
. }) {$ Q) z! _) t% h

04修改驱动配置文件,将MCP2518编译进内核

vi OK8MP-linux-kernel/arch/ARM64/configs/OK8MP-C_defconfig

找到:CONFIG_CAN_MCP251X=y

改为:# CONFIG_CAN_MCP251X is not set

添加:CONFIG_CAN_MCP25XXFD=y


# m  C6 m- b) h* h' H

05在设备树中配置时钟

vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts

添加:​​​​​​​

[url=]复制[/url]
  1. ; F9 _1 ?$ _. B8 A
  2. clocks{
    - z0 @' q9 X0 @1 b
  3.   mcp2518fd_clock: $ h; q8 U0 `) r/ g7 B( B
  4.   mcp2518fd_clock{
    $ B  m' ?5 T5 R& d7 }
  5.     compatible = "fixed-clock";) N7 o* c+ X; @
  6.     #clock-cells = <0>;
    ) |6 j& W7 \5 Y3 `. L2 M
  7.     clock-frequency = <40000000>;$ }. ~% ~+ T4 z2 o
  8.     };
    + a$ k5 m' {& z$ ~! B
  9. };
复制代码

" Z+ v9 d- l4 F" Q( c+ r
) Y& S8 E, ~# ?: F* v; N

06找一个引脚用作芯片的中断引脚

此处是将GPIO4_IO21用作了中断引脚。

vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts

添加:​​​​​​​

[url=]复制[/url]

5 d% X4 p6 M/ a# S) u; X% r1 g) t
pinctrl_ecspi2_can: ecspi2can{
3 a) s5 `4 S3 x: B1 h: L% K  fsl,pins = <3 c+ I$ S" l4 u, Y* l9 G1 s) S5 I+ V
  MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21   0x400003 j0 z$ q! A' W6 w( X
  >;
( ]+ ]5 q  |6 {- Y% ~};7 ^9 e, \0 [; P  j% R; o0 _

, Y+ N5 n) w# b' L: a+ P, l

07

在设备树的ecspi2节点中进行修改

vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts

从:​​​​​​​

[url=]复制[/url]
" n/ j9 o3 S5 i7 e; n

. L' _5 i' j" `" M. m
  1. &ecspi2{
    ) x8 v0 |: I; r% c2 C
  2.     #address-cells= <1>;
    / |3 F! Z. ^4 k0 R6 p% @
  3.     #size-cells= <0>;" ^+ v* D4 u$ \5 ]$ S' V0 e7 y
  4.     fsl,spi-num-chipselects= <1>;
    9 e9 W% r% C& ^4 d1 N8 s9 y- p" z
  5.     pinctrl-names= "default";
    4 V$ }& v6 {0 w
  6.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;: B- Z) B" ?; t
  7.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;5 T% H0 F% m2 E( y. R& q4 G5 V
  8.     status= "okay";
    ) h# V7 h8 S3 i5 S. h" {
  9. / |& ]& t" }$ B. Q. z
  10.     spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {
    * T9 j; ?" j8 ~# g' H  b
  11.         reg= <0>;8 J7 r$ _2 h/ U2 l
  12.         compatible= "rohm,dh2228fv";
    0 `8 H7 Y9 ^' I2 T3 M
  13.         spi-max-frequency= <500000>;
    : j, ]9 c" [6 ^; l" x" |/ A
  14.     };
    , u7 N5 Q+ r/ z9 ~7 \
  15. };
复制代码
  1. <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>1 X3 a( z' n# o8 j  w
  2. : P! |0 h& c. T! Y/ a. C/ w0 P
  3. <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:​​​​​​​</font></p><div align="center">, y  S. S8 D  i
  4. <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>
    $ Y7 S0 `* c9 O# D

  5. 3 M, a3 ]; Y& t1 a& ^! q
  6. <div class="blockcode"><blockquote>&ecspi2{
    ) T2 P9 Y2 o6 m. g6 s( C3 R
  7.     #address-cells= <1>;
    + E2 ~: \8 U9 a0 F+ x$ H
  8.     #size-cells= <0>;" i5 V2 H9 N/ L& z7 N; K4 e/ T
  9.     fsl,spi-num-chipselects= <1>;; \/ ^. ~% H7 @
  10.     pinctrl-names= "default";
    ' e9 k7 l7 e  U: s" W9 q" Z. ~
  11.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;4 r4 s7 Z  w1 G
  12.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
    . z' T4 N8 z3 u! @
  13.     status= "okay";
    " h$ D7 }( J# v6 a& s- G( B: O

  14. . w& D, {, Z& d- K8 `4 h
  15. mcp1:mcp2518fd@0{2 f9 {5 @8 k, K9 v& k  ]' Y
  16.             compatible= "microchip,mcp2518fd";
    * Q$ J  m" i0 |0 y' j
  17.             reg= <0>;1 T+ N0 F; r2 b1 y& }1 f% Z
  18.             spi-max-frequency= <20000000>;; U+ f6 h2 ~: {; I9 V8 j" O
  19.             clocks= <&mcp2518fd_clock2>;
    3 w+ L$ K( {8 e# s, g
  20.             interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
    ( Q* @# @4 s9 W1 T9 V
  21.         };# O: I5 M% ?$ p- i9 O! H4 K& f4 Y
  22. };
复制代码
, b0 W/ ]& N2 O+ B  J

3 n9 F6 c! |, i8 W

完成上述修改后即可进行编译,并用新生成的镜像烧写OKMX8MP-C开发板。

, N3 `3 V& P% M3 x1 Q

08

开发板验证

将MCP2518芯片接到SPI2的接口上,启动OKMX8MP-C开发板,启动后使用ifconfig -a命令查看,即可看到多出了1个CAN节点。节点生成后,即可按照用户使用手册【4.18 FlexCAN测试】章节进行测试,验证功能是否正常。


4 y) |: }. k9 X# Q( C' [& n* ~9 U4 k
* p/ ^2 Q$ k7 _

. i. c' k+ x  p[/td][/tr]
; M. s! [& n  u+ I0 u4 u, }[/table]
  • TA的每日心情
    开心
    2023-6-1 15:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2023-9-11 17:18 | 只看该作者
    SPI在控制外设的时候用的比较多
  • TA的每日心情

    2024-4-10 15:19
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    3#
    发表于 2023-10-13 21:08 | 只看该作者
    PCB快速抄板打样,批量加急生产超快样板:8小时样板出货超快批量;24小时 48小时批量加急    电话 微信同号198769163190
    $ [" C# @0 o1 t' M( l
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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