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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 罗罗诺亚 于 2023-9-11 15:24 编辑 $ X" ^5 `  [7 h( G0 a& F

# q6 ^5 b# u! S! N' j; ^" i
8 G. N- v& n/ M' V' x

6 M* c; D1 _5 y

8 M2 K( u' ~. J7 L# T" W; [: E1 U( C

6 }# P- G4 X, V" T: ]& U# {

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

说明

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

    3 |2 I/ R& J. x" i8 f! j" c4 C8 D
+ n% g2 m% [& j8 w* F
  • SPI转CAN芯片型号为:MCP2518,这款芯片可转出CAN-FD,若只需要CAN功能,可参照该方式移植MCP2515或其他芯片;

    ; c3 @+ ~3 v! n2 w
1 L+ e* M$ c; W3 |+ P, V9 \6 z
  • 本次移植的MCP2518芯片驱动来源是i.MX8MQ的源码(处理器中默认移植MCP2518芯片)。


    ' T0 ~! D2 B+ u9 b  Y

7 L1 z) P( r9 B. m
$ Q) Z; _4 z# j0 W9 R8 [

01移植MC2518芯片驱动

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

: ?5 z' u. ?& O) X) S) y

02补全对can_rx_offload_add_manual函数的定义

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

添加:

[url=]复制[/url]

, I/ R. s0 v6 X% y. |. v6 @

  1. 1 A) v. _# r" u6 }
  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,
    7 B+ b/ Z( b, c: V
  3.     <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,3 r; S. U: V; M7 C3 L
  4.     <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
    ; F. I) h* \7 l
复制代码

" z) Y% n# C+ Z; l$ E- X5 _

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

添加:

[url=]复制[/url]

4 z# T* F, {1 U( s1 O

  1. 3 Q' _3 g! R( F- B8 _8 v6 a
  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,
    * S1 ^* X6 L5 z1 |
  3.         <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
    5 s8 ]2 n* b8 D7 d3 {, F
  4.             <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
    , M+ M0 Z% z9 n( X. \' ~* b
  5. {
    / |, \+ X! q: x+ N! h; n
  6.     <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)
    6 H. ?/ |& o) u0 J4 d/ ]9 m
  7.             <font color="rgb(198, 120, 221)">return</font> -EINVAL;
    - ~0 V9 N- i" C- s( O- b% {$ b
  8.       <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);/ H8 {% l0 K% q- L" i! a
  9. }
    ! a9 W3 m' o3 k! w) _; |
  10. EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码

' _" O2 ?. W( x' M/ f& ~
4 _: Q( P; t# ?& d8 T

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

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

添加:

[url=]复制[/url]

, }% a% L2 S/ l, T  v' R$ S( _& {- I: I# d& U  J
  1. obj-y     +=  mcp25xxfd/
复制代码
' U' {. p0 e- b9 q6 H5 W

' H* t2 D- z# K7 u% o

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

添加:

[url=]复制[/url]
  f  |# D) |5 Y
  1. <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码

, H9 l8 V+ f$ z/ \& ^1 s* \2 ], P, Q2 k

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

6 m+ x( H1 j" t" M

05在设备树中配置时钟

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

添加:​​​​​​​

[url=]复制[/url]

  1. # R5 ~  x* b& T( ?  I* q) {: y% z
  2. clocks{: ^( U* H" S* Z& e, N
  3.   mcp2518fd_clock: * Q: w! f: c& a2 [4 b. Z
  4.   mcp2518fd_clock{% R, M6 H% e1 p
  5.     compatible = "fixed-clock";
    % w8 e! [$ g3 H/ W1 E! S. h5 J
  6.     #clock-cells = <0>;- A0 X! {* v0 k8 [7 _" x
  7.     clock-frequency = <40000000>;, J2 C6 K& o$ o
  8.     };3 h+ r' @6 Z5 M3 X  S2 T
  9. };
复制代码
, X4 j( H% e$ `1 V- J7 l
* J; m% H* M! ?6 N  }0 ]

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

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

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

添加:​​​​​​​

[url=]复制[/url]

) q5 V$ e6 m/ p9 o; b2 Z4 m3 }+ c  O" f
: z1 @, m7 L; f0 }  L) @0 }pinctrl_ecspi2_can: ecspi2can{
$ S" R. q9 h- ~5 J: p! @6 |  fsl,pins = <; P4 r0 C7 \! Z
  MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21   0x40000
5 }) l( [6 }% O# j& [2 W   >;
& t- |0 E6 B. ]! K  A};8 M4 C+ e$ _& F' E

. G9 V% g! O+ U+ H

07

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

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

从:​​​​​​​

[url=]复制[/url]
4 F/ c" Q4 D! U$ ]) j3 g
' R/ i- D* e% d
  1. &ecspi2{, [0 `- X' y: `, B1 P2 s/ w
  2.     #address-cells= <1>;
    + l) m5 T4 s$ r& Q( I0 @+ j4 I& {
  3.     #size-cells= <0>;
    & p* O2 ]0 ?+ X2 A# L: F( t
  4.     fsl,spi-num-chipselects= <1>;
    9 ]4 Z& c! |4 H$ r: v
  5.     pinctrl-names= "default";6 r7 Y2 T* {7 V
  6.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;
    % I0 N2 ]& F1 d' R
  7.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;( P5 M9 U( @( W& q* W
  8.     status= "okay";* Z( Y/ f" B* d) f3 B2 V
  9. 2 y" N7 d& T2 p0 x' v
  10.     spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {6 s: I" `- u& Y8 [9 n: c
  11.         reg= <0>;
    ( ]# |0 H* \2 Q  i7 l7 H8 U- i! h
  12.         compatible= "rohm,dh2228fv";6 S; f0 L2 J1 {4 N1 [
  13.         spi-max-frequency= <500000>;% s8 @$ {+ e5 |2 i$ s4 e& Z% W
  14.     };7 Z+ B! z. }8 D% N% p7 |. [0 s" S  P
  15. };
复制代码
  1. <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>
    7 ^+ O* y- z, }% l
  2. ! m! |3 `0 E) ^* \/ c
  3. <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:​​​​​​​</font></p><div align="center">/ c4 f: i0 y6 R" A* U) q- U
  4. <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>: R& ^9 P. S8 L  t( U7 ], j
  5. " d$ B. V3 b5 d# I% H1 k8 `
  6. <div class="blockcode"><blockquote>&ecspi2{4 a2 d4 W7 \# O
  7.     #address-cells= <1>;
    : g# V( w" w3 P( i6 Q: J- \; `
  8.     #size-cells= <0>;
    % F. n! K# W7 M3 P# M( p
  9.     fsl,spi-num-chipselects= <1>;
    - g5 L0 B& C3 ~5 b' y) i
  10.     pinctrl-names= "default";) G0 e4 }" }% [$ F$ {
  11.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;) r- j3 k5 ?+ y, Y8 W# l( s6 O
  12.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
    2 a; w* _" U" s$ u7 `
  13.     status= "okay";2 l7 B& b! U9 G7 k) [
  14. % t+ B& W8 l! E
  15. mcp1:mcp2518fd@0{9 T& M3 Q1 d; I6 I& U
  16.             compatible= "microchip,mcp2518fd";4 G3 T3 x, ]% u7 b
  17.             reg= <0>;, a" i8 i! ]7 p6 s7 n
  18.             spi-max-frequency= <20000000>;, y5 o4 B$ q4 O# G3 K4 e+ Z0 c6 P1 f: {
  19.             clocks= <&mcp2518fd_clock2>;' V; n6 y' Q+ P, h& x8 i) R
  20.             interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
    : \: z9 ?0 n4 y: I# d5 ]
  21.         };! W0 ]9 E3 V* Y* ?- P
  22. };
复制代码
! A: Q% C8 ^6 Q: z9 k: ^

# f1 g* F% U: _* H( F( M* [

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


& d7 T" Z7 y9 ^6 ~) ?+ y$ ~

08

开发板验证

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

; D9 @- ]# N4 Y1 R. V' T

' E7 i" O7 Z7 B8 h, E9 `
: M- F6 l9 j" @* N( b  B
& T9 M6 p4 W) Y8 g; k; ~' x
[/td][/tr]  z9 C7 _- f$ m! J) J0 I% v4 Q
[/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小时批量加急    电话 微信同号1987691631900 y# t' h# _; }& X
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-9-3 15:31 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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