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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 罗罗诺亚 于 2023-9-11 15:24 编辑
! M  v% a. }& O+ g5 o4 ]; v' u6 J. ?/ Q: U4 d
- s$ e1 `/ R+ M/ P1 M4 R& w
$ }6 c0 h; v0 {. G& g
' }* f. c1 v+ k- k3 ?

; z. E) o* j+ I% s" v0 D* i- X

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

说明

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


    5 y% _( g7 g! Z; k# q
; d. \$ J& N' v$ @  i& ?) `
  • SPI转CAN芯片型号为:MCP2518,这款芯片可转出CAN-FD,若只需要CAN功能,可参照该方式移植MCP2515或其他芯片;


    - f8 c' O+ p5 O; f* n
1 N5 \3 m$ v/ p9 S& ^
  • 本次移植的MCP2518芯片驱动来源是i.MX8MQ的源码(处理器中默认移植MCP2518芯片)。

    # l/ N! ~* b5 x. `
8 X7 e; Z+ K5 b( Q) @, R  k: l

* ?" F$ e6 q7 P+ b7 t" R

01移植MC2518芯片驱动

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


" ]! [: K9 s- s: Y1 p5 V( {5 E/ q- a

02补全对can_rx_offload_add_manual函数的定义

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

添加:

[url=]复制[/url]
* A- _& ~: Z+ ?* K1 {) A' X2 q

  1. % R" `5 ~8 K& k7 |
  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,
    / `: \1 r9 y+ z6 W
  3.     <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,' |3 y( _3 }) k
  4.     <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
    + Z$ k0 Z/ q7 Y5 F& M
复制代码

# A+ |( o  B" B0 p# h4 O! i: Y, E- W

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

添加:

[url=]复制[/url]

% H5 ?8 h5 @  p& s! e3 n: Z

  1. $ z3 F& ^& q; I# J# C+ O
  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,
    3 R7 V$ c4 e* r
  3.         <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,8 M% u5 C# D9 A; a
  4.             <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
    9 k7 {# J) ?5 [  K/ i3 W
  5. {- ~9 r  b* h7 l/ K6 E
  6.     <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)
    7 [8 ]2 R; ]5 h: O1 s0 ?
  7.             <font color="rgb(198, 120, 221)">return</font> -EINVAL;# Z  d; w& n; B1 [4 y& a
  8.       <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);6 r* Y; V# H# l/ s# _& C
  9. }
    $ a  B) P  J: B% X
  10. EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码

& _% ]& b' Z( r  s6 F$ k1 Y& y# |7 y+ y: x: G; u8 e( }( l

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

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

添加:

[url=]复制[/url]
) }8 x  A/ i! S4 \0 U# i6 ?" F
4 B! u" _0 R3 y
  1. obj-y     +=  mcp25xxfd/
复制代码
4 k8 e' g0 _/ {* I  d* P# c- q0 I6 Q

7 n3 B8 B, q! z9 S7 ^1 u! n) h5 q9 h

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

添加:

[url=]复制[/url]
$ ?8 V! F6 |/ F$ C4 G4 p
  1. <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码

# ~5 J. Z) G* l. T% Q
; ^  {2 f3 y1 E# a, n; [$ l. F0 a, S& b

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


; i* N9 h0 |- u5 e, I7 c! ?/ E1 N

05在设备树中配置时钟

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

添加:​​​​​​​

[url=]复制[/url]

  1. " P; Q( N" K' u% W; o+ @
  2. clocks{
    2 b* T& R' ~# G; [' P2 [
  3.   mcp2518fd_clock: - g/ d2 |+ f9 r7 B# `
  4.   mcp2518fd_clock{
    * D1 R4 n& S5 a# J, h
  5.     compatible = "fixed-clock";2 `1 z: t+ Q9 L9 g5 I  H) T2 t
  6.     #clock-cells = <0>;# d; q; p4 ^* b  d
  7.     clock-frequency = <40000000>;8 [6 d' o7 r: k- l7 K
  8.     };. x  @/ \. [% e
  9. };
复制代码
8 O4 j5 R8 K6 N1 Y$ D4 _* J4 _$ @7 I
, \  W4 Q7 |! p/ E

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

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

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

添加:​​​​​​​

[url=]复制[/url]

* s( Z8 \+ q: A$ f+ X4 a, f+ C( Y: Q6 ]: T. @
pinctrl_ecspi2_can: ecspi2can{
$ c! d2 P7 D$ G  fsl,pins = <5 l6 ^! p( z, c9 w) P9 w4 ~
  MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21   0x40000
. Z4 N' L1 U3 }9 u3 {8 ~   >;
3 M6 Q& q6 ^' b7 `8 C( b};" Z0 B, P, n. v( O1 ]% \
1 K  e# X  i4 I& W7 \9 F* H

07

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

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

从:​​​​​​​

[url=]复制[/url]
$ ?) K( ^; F1 V8 @
) @* ^+ ?5 h3 d. `* G$ e
  1. &ecspi2{- ^6 ^! }$ j5 n
  2.     #address-cells= <1>;
    ' z# s% z# _) S2 G9 M
  3.     #size-cells= <0>;
      n4 z( O1 Z& y' ?% w2 d
  4.     fsl,spi-num-chipselects= <1>;$ B+ t9 {0 a8 k
  5.     pinctrl-names= "default";, D- d/ y; M2 Y! a8 B# D
  6.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;' d$ f$ N* y, X: G( y2 Y
  7.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
    6 v5 s$ m( n7 y6 D
  8.     status= "okay";$ k7 z: }* W# [  `- z5 f* J& g

  9. # o: y' h  d4 i4 B3 d! c
  10.     spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {) X2 ?, `0 a& q* k9 ^
  11.         reg= <0>;+ X* K# O# R( Q4 o4 h/ z
  12.         compatible= "rohm,dh2228fv";( s1 Q2 Q. z$ h" s8 b9 e
  13.         spi-max-frequency= <500000>;
    + C, o, @. ?+ v
  14.     };* g  F) @7 |. y7 p1 F
  15. };
复制代码
  1. <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>& C1 S0 V8 G$ I
  2. % A' ]9 L5 a7 a+ j$ P8 Q6 M
  3. <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:​​​​​​​</font></p><div align="center">8 [' n6 j" c/ L& k
  4. <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>6 Z; g* w3 K$ D3 T) M4 B
  5. - f( t( R9 r" A+ d
  6. <div class="blockcode"><blockquote>&ecspi2{4 {' w% D9 e6 u- ]% ?1 D+ Z) Y! W
  7.     #address-cells= <1>;. `. N* ]) G- E: ]  |; ^- i6 U
  8.     #size-cells= <0>;
    / n# j, Z6 u' N* X  x
  9.     fsl,spi-num-chipselects= <1>;
    1 ?  |7 [5 w* Q: u1 x
  10.     pinctrl-names= "default";" y, p. Q& Y+ T8 ]- s) Y3 U
  11.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;  G4 _1 Y0 s1 {* |9 n
  12.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
    5 U0 q0 n% h! k
  13.     status= "okay";
    - O8 ]- [6 X2 c) M$ g$ h- m. X

  14. 1 U: y6 e' U/ y: v6 ?& I, U# a
  15. mcp1:mcp2518fd@0{
    . e) w* S. u1 m& B- W- r; k
  16.             compatible= "microchip,mcp2518fd";. g% a: z' g* Q  E1 l4 v7 l
  17.             reg= <0>;' m; k6 B" D9 b6 W& c% N
  18.             spi-max-frequency= <20000000>;/ \+ O9 G5 W) N' b5 q
  19.             clocks= <&mcp2518fd_clock2>;
    / @% m6 W! u! c
  20.             interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;% l3 s/ l/ A' v' L& I4 M
  21.         };
    7 D/ g! ~+ `  n' A
  22. };
复制代码
4 J2 Y& }3 |8 L9 A( p9 L

, p* R" d2 y. M3 k

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


; i, F3 o: C7 c; ?& c$ t

08

开发板验证

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

$ ]& l( Z' H1 s6 t+ p: _9 C& ]

% x2 X7 V% |1 F
3 b, Z! l1 {- \1 k# Z" w- T

; B5 D, W" n8 X[/td][/tr]. ]2 L  a! v% s- x& ~3 z& _5 p
[/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
    - E9 `' M* [7 Z2 d. A
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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