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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 罗罗诺亚 于 2023-9-11 15:24 编辑
$ w; ?4 ?2 O' G  J3 T: H8 X2 T" ?" N& c$ @$ W$ W1 {

* ], S& O# i/ w7 H4 q5 ?

& P3 F* ?( _: q! E
" A& I) _7 o. y

7 c! z& K( |; |; D" J) r

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

说明

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

    , D& {8 ]3 M4 P4 _; }  Z* X- V
2 W, V% \+ K/ j- K6 H
  • SPI转CAN芯片型号为:MCP2518,这款芯片可转出CAN-FD,若只需要CAN功能,可参照该方式移植MCP2515或其他芯片;


    4 |7 E6 |( C9 t0 E9 y- t' w
7 w* a5 \5 o9 M1 U: g1 U
  • 本次移植的MCP2518芯片驱动来源是i.MX8MQ的源码(处理器中默认移植MCP2518芯片)。


    % z% x/ |, O: A$ r' \9 r4 W
8 V  `0 ]% S8 a$ {2 w1 V. D

! T, s, {$ C+ z( l) K

01移植MC2518芯片驱动

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


9 G& F& E! Y# N1 s: g; d6 B; t

02补全对can_rx_offload_add_manual函数的定义

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

添加:

[url=]复制[/url]

% n: j' @% `) [2 J
  1. + ?3 S, x) q2 }7 Z) t
  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,8 i- b+ @  Y3 c0 ^
  3.     <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
    , f/ c1 M3 [, |" Q! F, o8 Z
  4.     <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
    1 x' L6 Z3 P* N6 R7 [7 E
复制代码

/ }1 M0 ]3 P5 E# {  ^2 n) A& w+ D

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

添加:

[url=]复制[/url]
/ p$ S8 v& F' G$ M: u- x
  1.   x7 S6 D  j3 w$ `, c+ B% c
  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,$ z# q. q1 F7 u& r, j. S; P6 w3 @
  3.         <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,0 ]2 V8 k: A8 N1 P. P$ ?
  4.             <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
    / k% c) ]+ b) p! R5 V6 m8 j. z8 ?1 `+ F
  5. {
    6 V# P( S. G: I; ^2 S
  6.     <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)
    # O! Q. p' q4 ~4 v) C
  7.             <font color="rgb(198, 120, 221)">return</font> -EINVAL;
    ' g7 w# D/ n4 ?% ?0 M5 z
  8.       <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);
    6 A1 `, E5 U# {8 [+ e8 K7 Y* v' s
  9. }
    4 `2 ^" r2 _( u0 h9 I* Y2 a7 Z
  10. EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码
" U6 C" N0 _% _3 L9 t* P4 S! I

2 X+ t1 h: C, v' I

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

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

添加:

[url=]复制[/url]

0 H- B; E. @! `, U$ G2 [
/ @! p! m( P" z2 y$ v
  1. obj-y     +=  mcp25xxfd/
复制代码
# P: e- t! D. E& `
% P# X1 M) u" h" |2 [# E" d

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

添加:

[url=]复制[/url]
  ~, B- y8 k" q; m6 }% d
  1. <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码

# u9 d. J! E# G1 ~" w0 ]( L& B4 }) V

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


/ n  ?7 j* P; R! T7 u' z: ^

05在设备树中配置时钟

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

添加:​​​​​​​

[url=]复制[/url]
  1. 5 s2 G% D0 U$ S
  2. clocks{2 h0 a, d# S/ _$ h% G0 x! G' @
  3.   mcp2518fd_clock: # J7 h/ N1 X6 S6 \
  4.   mcp2518fd_clock{1 Z7 m9 o# q! n6 [! J. w
  5.     compatible = "fixed-clock";
    / ?; F! p. Z; {# \  `
  6.     #clock-cells = <0>;
    7 w7 S1 D7 D; n
  7.     clock-frequency = <40000000>;1 s" p2 U. f3 G8 e/ |! \: X3 Z
  8.     };! W' ?$ I3 i* W  S2 D7 m  ?# ?
  9. };
复制代码
% {0 w7 T8 k* w2 Y- t- a+ C

( ]3 p, k8 M# D  p

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

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

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

添加:​​​​​​​

[url=]复制[/url]

# a* y  ]7 J8 O3 I$ F  H
6 T( v6 i: e2 a" jpinctrl_ecspi2_can: ecspi2can{
; G+ N  W0 @4 E  q  H6 a1 D  fsl,pins = <
- B& s+ S$ y1 K$ B  q( p0 S   MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21   0x40000
3 I! E% L% L5 l4 {& ^* R   >;5 w! l4 Y2 C& D
};
' Z  J- }8 s" D' O2 w1 F
  f  q& ^0 R9 Z& l2 l

07

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

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

从:​​​​​​​

[url=]复制[/url]
# W; e) ^& |. w: ?. i

7 S& l4 l; g; O3 j; A; `0 w+ k
  1. &ecspi2{
      S3 T8 B; x0 U
  2.     #address-cells= <1>;
    & W( M# z" e6 ?! H, P4 ?: ]0 Q
  3.     #size-cells= <0>;: c) r+ F- r3 a, o' a0 [! V$ K4 U
  4.     fsl,spi-num-chipselects= <1>;, G: D, `4 H, s2 U
  5.     pinctrl-names= "default";0 I3 a$ r" n# g
  6.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;- B7 A% I/ h2 G* P  H  V
  7.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
    ) ~" W0 a& B5 Q7 J8 x6 P* O
  8.     status= "okay";9 j4 R# K) y5 N
  9.   I! V- g3 L  s& _  s3 A7 v# D
  10.     spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {! X$ f/ Z: |: U- a( P0 k& _  e
  11.         reg= <0>;* B; v2 F; X! l+ Q% e5 _) p$ L
  12.         compatible= "rohm,dh2228fv";5 I. ~1 E. m1 m7 r6 `& a0 o! u
  13.         spi-max-frequency= <500000>;- R5 e% k# B4 H- F+ F0 Q
  14.     };
      M1 N# q/ T1 r  \$ ?( ~
  15. };
复制代码
  1. <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>5 a! y0 r* b3 {: f. I1 S  x
  2. . P7 j) \9 z4 ?$ h0 }/ V
  3. <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:​​​​​​​</font></p><div align="center">
    7 b9 Y! c) C! t( W1 i1 _* l
  4. <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>/ n- g3 K* K  H- F) l+ |2 i

  5. ) a% k( t' N5 P# u. a/ t. H3 ?7 ^
  6. <div class="blockcode"><blockquote>&ecspi2{
    . U6 ?+ @2 T8 Y3 e& s/ |: d, l
  7.     #address-cells= <1>;. K/ @, m0 ]# M- t4 o
  8.     #size-cells= <0>;
    : q: a6 s/ A: {' Z  w
  9.     fsl,spi-num-chipselects= <1>;) u3 J# F3 o9 F) i+ O
  10.     pinctrl-names= "default";5 `6 ?! ~5 a+ I& d$ w
  11.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;3 e/ I4 a, x8 P1 ], D  s$ _7 t
  12.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
    ; s2 e0 S4 n# i9 T* M: a8 Z
  13.     status= "okay";7 S/ d% L. D) Q6 l! P- }
  14. ; p' T! x/ r4 l. l
  15. mcp1:mcp2518fd@0{" W/ j, E) b* X$ s8 s
  16.             compatible= "microchip,mcp2518fd";' e3 b0 _  e: U# M) L  d
  17.             reg= <0>;
    , g7 N, F) H4 C- N1 Y
  18.             spi-max-frequency= <20000000>;2 d5 r: Q7 k4 d( }+ u
  19.             clocks= <&mcp2518fd_clock2>;7 J  P1 K$ m8 ?, I" f6 B, ~+ h; o
  20.             interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
    , @4 J& k7 n2 Z& e1 |( s* U' `
  21.         };
      j" w2 B+ E* r% D
  22. };
复制代码
  ?# S+ H! W( T) O7 @6 j2 G
' I3 Y5 K' s5 _' H  p+ H

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


4 y& P1 G; A, p& Y) Y" E

08

开发板验证

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


" k  Q( n1 E* ?4 ?' s' @- y' Z8 ~5 I" w" u
; c. ~2 I2 T9 I9 T; J4 D

. J  @7 ~: k5 ]  s[/td][/tr]
9 X6 u  I( C6 B0 C4 k[/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
    # H. k4 X9 a4 ^
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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