EDA365电子论坛网

标题: 在i.MX8MP开发板上实现SPI转CAN [打印本页]

作者: 罗罗诺亚    时间: 2023-9-11 15:22
标题: 在i.MX8MP开发板上实现SPI转CAN
本帖最后由 罗罗诺亚 于 2023-9-11 15:24 编辑 9 h7 |; D4 U' h; z

$ x& z3 _5 l" R  M$ q2 P+ ]% {
/ i/ o1 g! W) v7 U

! K+ [$ f  v' L: s
+ ^) y7 x! d; Z. n% N. \7 d( e. `( n% U

- y: X+ W6 S0 b0 R! Z

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

说明

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

    ( e2 }$ ^. y$ k

/ H9 D4 R, _% U% V" m
  • SPI转CAN芯片型号为:MCP2518,这款芯片可转出CAN-FD,若只需要CAN功能,可参照该方式移植MCP2515或其他芯片;


    8 i, x& o+ X' Z7 h/ X- A0 [
  J* Z4 }7 [- L" M7 z' w3 f6 A
  • 本次移植的MCP2518芯片驱动来源是i.MX8MQ的源码(处理器中默认移植MCP2518芯片)。


    & p- _. I  N7 g- L* H- D' R

8 F" k$ k& A5 @8 e5 x4 D
. K2 U1 |2 g+ ^3 ?& _: L0 i3 T

01移植MC2518芯片驱动

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

, d2 ?& @2 y' l8 x# f

02补全对can_rx_offload_add_manual函数的定义

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

添加:

[url=]复制[/url]

; a9 T+ r$ v4 c. v3 h
  1. $ a7 G' `6 G! _
  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,
    # k: [6 V# `' C; b& p
  3.     <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,, O* G) _7 [5 L6 d
  4.     <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
    & S6 Q& {3 h9 b% C2 a" v
复制代码

9 C$ T1 ?* g' a6 p# o$ L

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

添加:

[url=]复制[/url]
( \% O' f7 W2 X' Z9 J) U& k/ |2 k
  1. $ N/ C" L# ?( Q' D1 d" N
  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,' L, C" {8 L8 e8 D
  3.         <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
    * G: M) J% C" K/ R
  4.             <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)3 N) F6 n+ q- X1 s$ P1 B
  5. {4 d2 c9 F, R$ u
  6.     <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)
    & l8 h+ _/ n: C
  7.             <font color="rgb(198, 120, 221)">return</font> -EINVAL;
    2 C8 X" `% O$ d: N+ k9 D9 t/ S) E
  8.       <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);
    ! v, G4 c+ u+ {
  9. }4 s# x: z$ _" ^: r4 V( M
  10. EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码
! E* T8 z3 ]1 `/ J7 ]

( K1 X" ], }% x

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

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

添加:

[url=]复制[/url]

$ Y7 g/ z+ Y+ j6 q2 [0 a6 U/ F
# g# a8 P2 d( Y$ r9 {
  1. obj-y     +=  mcp25xxfd/
复制代码

6 E9 W7 k8 b$ L! ~2 k) z) x, p$ X  t

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

添加:

[url=]复制[/url]
% ?9 `: b- j8 p+ j/ e" `% }) p
  1. <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码

; \9 g# y  I" T# x1 j3 Z# T
, U# E! J% r5 L$ |, x$ ^0 H+ Q

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

/ k: _) ~$ I- c+ H' Q* p) c* s

05在设备树中配置时钟

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

添加:​​​​​​​

[url=]复制[/url]
  1. 1 W$ T; e" ~  e8 t! T2 J1 J
  2. clocks{
      @: [; a3 U- P" q
  3.   mcp2518fd_clock:
    , h, N9 j9 m; H: G5 G4 u
  4.   mcp2518fd_clock{
    9 a# g2 [, l! L4 Z3 y' j
  5.     compatible = "fixed-clock";! `3 ]7 `$ Y: g$ b1 A
  6.     #clock-cells = <0>;
    & ]9 ]: N1 N5 W, S' R5 W
  7.     clock-frequency = <40000000>;
    6 S( M, N  Q% ]7 ^. h# x
  8.     };
    + z$ k( X& Z  P2 O2 ^8 H
  9. };
复制代码

# F5 e' k8 _8 ]5 p& T: l. ]1 x2 m/ e8 R! L

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

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

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

添加:​​​​​​​

[url=]复制[/url]

6 D# m$ V; z2 [  D8 I* {
" Q# r: _6 Q6 R2 J! Apinctrl_ecspi2_can: ecspi2can{
1 q& C6 c5 v4 O) K4 q! p# F  fsl,pins = <
  g# W; S9 V: Q4 ~' c0 x$ r% p   MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21   0x40000
' G3 A3 ]7 i6 s; L+ p+ f! ^   >;2 a) |; q4 X/ I0 M6 x* P6 l
};
6 c/ B7 _; ~  o6 P9 E0 q; E
: x' }% L( ?0 `5 U) ^) g

07

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

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

从:​​​​​​​

[url=]复制[/url]
+ n. z" C, K) [8 X/ y7 b

# W1 N& t: l' d& z# ]9 \0 F
  1. &ecspi2{
    ( K4 r0 P( M4 E3 `4 Z  H, h
  2.     #address-cells= <1>;
    ; q. g' d- C0 V2 X( M  y
  3.     #size-cells= <0>;
    1 A2 O) i6 ~6 n
  4.     fsl,spi-num-chipselects= <1>;0 l) n+ F( m! ~( C) x
  5.     pinctrl-names= "default";. ?2 r4 y& D# \% i
  6.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;
    2 J7 C6 C% G2 y& q2 O
  7.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
    , x: C, ^! a3 g+ @6 I1 ?" D% ^
  8.     status= "okay";# f7 P% {0 L3 G7 a( [
  9.   x2 ^) {5 X2 H2 P
  10.     spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {  C6 t: \* A7 u
  11.         reg= <0>;
    $ n" @" c  |: o9 _! }0 n
  12.         compatible= "rohm,dh2228fv";5 \# h) S  J' M+ L4 w; m1 N
  13.         spi-max-frequency= <500000>;
    / w, V) e) N. i  C+ w
  14.     };
    ; u: ^% ?9 ~  j* H+ A2 Y! T& R$ ^9 B
  15. };
复制代码
  1. <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>
    , h# j) n4 T8 X* R: q

  2. , g, E3 c. a3 f1 [2 [6 C% f
  3. <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:​​​​​​​</font></p><div align="center">& @) w# O1 W8 d% E0 j* ^9 Z. e0 c
  4. <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>
    , R4 C7 O$ S% r+ A* i8 d3 r

  5. 1 e4 z$ ?6 G) F; |4 n% S5 X* U
  6. <div class="blockcode"><blockquote>&ecspi2{
    & T& c9 P' O8 X2 `& _, E% }* z
  7.     #address-cells= <1>;
    & {  |9 P" B+ P$ _% _
  8.     #size-cells= <0>;
    ' M2 y" H/ |! K" k, T9 @. r7 l
  9.     fsl,spi-num-chipselects= <1>;
    . W- ]& {: N( r
  10.     pinctrl-names= "default";
    5 O8 x# O# {1 i7 F  Q- f  a3 _6 H
  11.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;& n( [, o! }: b
  12.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;- m; d9 w" n+ J% s
  13.     status= "okay";# S+ i* N, i# U: t  D; v
  14. - L( X& V7 ~2 K5 q) [
  15. mcp1:mcp2518fd@0{; l' O$ H3 A/ D! Z5 D8 r7 C. r# t' J
  16.             compatible= "microchip,mcp2518fd";; V" [& R% J3 g: W, Z- F& K
  17.             reg= <0>;8 R0 |' ^) d" Q- C& A
  18.             spi-max-frequency= <20000000>;
    ( y+ o3 e* ?4 @+ }- J! e  L
  19.             clocks= <&mcp2518fd_clock2>;- U& s; V+ ^1 x6 s
  20.             interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
    5 A% ?5 s2 |# @8 Y- X) M- y
  21.         };+ g# y' O* y+ x  P5 {; P0 d
  22. };
复制代码

1 D- \  o3 C8 I5 E5 f  b" L1 Y# W+ N" I  ]0 A: v

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


' B) r  F. i; f3 L- p) v3 k

08

开发板验证

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


% R0 F7 \$ o4 J  U0 m. s+ p5 C
" M1 q$ m) S) J

( F/ I/ n+ k2 i$ e" s& ^; ]
5 W& J0 W. x& U$ A% j" a4 u[/td][/tr]- O; K8 ^% y6 b3 N7 I" h" d
[/table]

作者: 521li    时间: 2023-9-11 17:18
SPI在控制外设的时候用的比较多
作者: 专业PCB    时间: 2023-10-13 21:08
PCB快速抄板打样,批量加急生产超快样板:8小时样板出货超快批量;24小时 48小时批量加急    电话 微信同号198769163190# G  k0 h6 b% Z+ Z





欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2