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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 罗罗诺亚 于 2023-9-11 15:24 编辑
. l  |, _& z! U4 n" k" d
& u" ]* G' M  F1 ?, @" _3 i: M
* @) u9 N' A8 g9 f

! _. G3 j3 D- }

/ d3 E5 ?# h2 Z  y& Q  k7 D2 O
6 N. Z# Y! ~9 ~' [# H/ p9 P0 n

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

说明

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

    " ?7 k9 K; o: N3 V: ^" D
( y* ~. F5 i0 J) n
  • SPI转CAN芯片型号为:MCP2518,这款芯片可转出CAN-FD,若只需要CAN功能,可参照该方式移植MCP2515或其他芯片;


    " O' M9 H2 Q, `

& M2 b' `+ H  I, W2 R# B
  • 本次移植的MCP2518芯片驱动来源是i.MX8MQ的源码(处理器中默认移植MCP2518芯片)。


    , i% m. Z4 \; V! ~# m# q' s
" u* D8 T3 u: A

( B: O; G# |+ ~7 c* h( O

01移植MC2518芯片驱动

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

0 o' x1 k: u8 d5 j

02补全对can_rx_offload_add_manual函数的定义

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

添加:

[url=]复制[/url]
" ^" T/ S! N6 a9 e5 ~  j
  1. # O+ U7 q  @. e9 L( R% Z) f: L
  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,
    6 f2 s9 T: I: ^4 l% ?
  3.     <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,. j$ H$ e" {6 n; u! Q
  4.     <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight): [: z% ]; X3 I
复制代码
; c( A2 X/ ]0 z6 L5 Z

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

添加:

[url=]复制[/url]
. _- D. t" [% p  {) H0 i/ j7 \
  1. ) o0 H" t# b, V) _" \1 V2 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,
    , P* g4 W5 m' |" H" [3 q9 |, J; I
  3.         <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
    8 G6 o& X& G2 B5 y) |
  4.             <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)* ^6 i& x4 M$ h( I8 M  C+ N$ t& ^
  5. {
    6 w  i  b+ o3 y1 W  V
  6.     <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)5 s- C4 ]! w% x1 X  C+ Z
  7.             <font color="rgb(198, 120, 221)">return</font> -EINVAL;
    $ }2 J' k* Z# B) R5 j
  8.       <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);
    . q$ r7 {3 l% O8 _: C
  9. }
    ! W& n9 o  D' ~( |. C
  10. EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码

0 ]+ E6 d! k: F6 K' J) N9 n( J7 w7 }* @/ |

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

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

添加:

[url=]复制[/url]

7 q" x7 C  H5 S- E5 L- Y1 H+ ^* O5 v( x, o+ m
  1. obj-y     +=  mcp25xxfd/
复制代码

1 |' N0 o' L$ z, ~7 R8 S
: `' f4 \1 q8 R5 R8 P+ t

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

添加:

[url=]复制[/url]
* x% K; R! |  t7 x$ D5 A- r2 C
  1. <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码

! d; |3 h. d4 W/ S
4 V& P7 i4 |2 L8 v; ]. S

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

& ]$ w- `0 J8 A$ h# P, E6 c

05在设备树中配置时钟

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

添加:​​​​​​​

[url=]复制[/url]
  1. 2 [* L% E5 M$ R! N
  2. clocks{- C6 W: f! n0 @0 ?$ l) n
  3.   mcp2518fd_clock: ! Q6 L- f: s5 c0 [% u4 o: Z* ^
  4.   mcp2518fd_clock{4 n$ p7 @) a( v& ]. p
  5.     compatible = "fixed-clock";. K( r' p# a7 s* @% T3 u
  6.     #clock-cells = <0>;
    $ D. M0 q  L4 i/ _+ X
  7.     clock-frequency = <40000000>;
    1 C% C3 N! }( I( r6 w* G
  8.     };% n1 s& e# D! s3 Y
  9. };
复制代码
6 d& ^; t, x* H. A4 L- [: d  U' F4 _
* [/ a- W7 d9 K# ~# J% @5 d' S  J

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

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

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

添加:​​​​​​​

[url=]复制[/url]

8 B; V0 T  E7 P5 G2 d$ Z" Y0 m& \# R4 z+ F, M( K
pinctrl_ecspi2_can: ecspi2can{
/ H% t" m" i( a4 L2 J* p  fsl,pins = <5 W3 y- x3 Q. Z7 n% ^" S
  MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21   0x40000
: `* }; _7 z& h- ^& e   >;
" W' M2 x- d- n! c: r3 y8 w! f  R};2 j; [$ w; i- |; I. E0 B/ j

$ {- u1 V$ Y- ?1 Z

07

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

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

从:​​​​​​​

[url=]复制[/url]
( u* U5 X; N( K) p* |& A3 n
; D. @! G9 M' L4 O3 a6 m' b
  1. &ecspi2{
    - _6 |5 F! `1 S3 ~
  2.     #address-cells= <1>;0 E9 k# w: Q+ }  ?
  3.     #size-cells= <0>;+ t' N# W5 X7 V$ E+ f
  4.     fsl,spi-num-chipselects= <1>;
    ! {; O' C; u) ^
  5.     pinctrl-names= "default";
    - U: l0 r2 J5 P
  6.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;
    0 F$ Z) k2 a& r8 ^9 j
  7.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;7 W' P0 x. ^: T  n9 O0 D
  8.     status= "okay";) K  ^7 W0 s3 ^. C& \; K

  9. + V7 g: b- Y- }7 Z' |% ?
  10.     spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {8 g( w6 B! w7 P
  11.         reg= <0>;
    # A! N/ m$ m* l' S0 W
  12.         compatible= "rohm,dh2228fv";& M$ H7 V$ r9 \3 H3 Z) n# \
  13.         spi-max-frequency= <500000>;
    ' n8 q8 s/ T* N/ p# _0 b* x( ~
  14.     };
    ! q) t# W7 G# g  P4 W
  15. };
复制代码
  1. <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>
    & Z( f* Q+ i" W; w- i& F" p+ r
  2. 9 j' K6 z4 N8 r) B4 A
  3. <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:​​​​​​​</font></p><div align="center">
    " n1 C8 _6 `2 e- ?9 b. Z, ]$ `
  4. <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>
    . D$ j2 `9 b5 \9 F
  5. 8 [$ Z* F, p- }: @4 O. K
  6. <div class="blockcode"><blockquote>&ecspi2{
    : R0 D! q& k+ v) B3 w- u8 y! w
  7.     #address-cells= <1>;
    ' L) r# I! u. E  x& n0 c' Z
  8.     #size-cells= <0>;9 u- j8 o5 f# N+ D; g
  9.     fsl,spi-num-chipselects= <1>;
    $ X5 q7 ~+ l7 v* p* j( N/ o# f, X
  10.     pinctrl-names= "default";& f  g" Y* r2 u, ]" r' E  C
  11.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;
    : i; q& }3 _6 D% V* L7 N8 k
  12.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
    * g7 S; F3 ~3 w; @& s2 L
  13.     status= "okay";9 ^! Y% [+ t' O# |4 C2 `6 n

  14. . c( i+ u8 y7 H2 g3 k+ A& R+ z  ]
  15. mcp1:mcp2518fd@0{
    3 a$ e1 C2 f7 z9 w) G
  16.             compatible= "microchip,mcp2518fd";; k( D# ~- R0 l
  17.             reg= <0>;2 W, C9 [$ i" x
  18.             spi-max-frequency= <20000000>;
    % `, |+ {6 I( R; {  {9 f- `  [
  19.             clocks= <&mcp2518fd_clock2>;8 I, S& P& W- F* k6 f
  20.             interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
    : \0 q7 e; t$ H0 L* L  q
  21.         };
    $ l8 y4 ?' S6 h8 W# J
  22. };
复制代码
; r  F% J" ~2 s& z! x: S% R' X3 p

! L! [' w' w; t

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

0 ^' p2 e) q# t3 s% Z( n* S

08

开发板验证

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


' z9 E) Q/ {3 v7 r
4 h7 Z# M$ _4 A& ~: k, U

4 Y, e  M7 Z- K( B$ r$ E9 `# z$ T$ t, N! C0 {
[/td][/tr]. ]0 i9 R& m, R. r/ ^5 e
[/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/ c$ r0 l4 n
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-23 16:37 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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