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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 罗罗诺亚 于 2023-9-11 15:24 编辑 3 H- o' i2 ^; L$ t, b

  R) u% `% W/ V; _! ~( u% m$ N1 [( p  n, }6 a. v6 X1 h
/ i! \+ D/ v# b
% T; b% R3 p# M
9 L) i$ U' [  y5 X

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

说明

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

    2 K+ a9 O$ M- _, ]( M& ^

7 M/ W7 u7 I9 O; `# N4 t$ Y
  • SPI转CAN芯片型号为:MCP2518,这款芯片可转出CAN-FD,若只需要CAN功能,可参照该方式移植MCP2515或其他芯片;

    ' G/ b+ w$ q1 j. f5 Z' I9 Y

9 _, c/ _+ P8 F* i1 B2 x! u
  • 本次移植的MCP2518芯片驱动来源是i.MX8MQ的源码(处理器中默认移植MCP2518芯片)。


    - C3 [; ?2 v* F4 E# ]2 `/ Q
& ]2 P2 u. _3 z8 ^- u, P
! \  x, s. }0 V! E

01移植MC2518芯片驱动

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

' C! B, q3 G; \8 ^* h

02补全对can_rx_offload_add_manual函数的定义

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

添加:

[url=]复制[/url]

0 `2 H* q) }# ~8 X8 C

  1. ) S( ]2 w8 @6 R0 P8 @  s# 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,
    . J3 l( m; g7 S/ r; i; U
  3.     <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
    - z8 k/ K$ Y  T3 J" y' @
  4.     <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)# ?# `9 F6 R. z+ P; V
复制代码
( d% Z9 w' ~5 L! j0 r: E( ~

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

添加:

[url=]复制[/url]

% O9 M! `% b, Z9 w% ^9 g

  1. # T, O9 H! Q6 |' k- d
  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,2 z# Y1 C- U$ t- v, t) c9 O2 {
  3.         <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,: t4 C1 I. R5 R  f
  4.             <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)( C  p" j1 T8 S/ X% ^  F
  5. {! m9 d' X* U$ a3 r% g5 g8 j4 n7 k! j; h
  6.     <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)5 e9 w1 u4 [" j7 W% y
  7.             <font color="rgb(198, 120, 221)">return</font> -EINVAL;  K: }! r+ a; p9 e
  8.       <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);% I! |; H! r( Z9 t2 ?
  9. }& H6 o8 D, G; v0 W1 c: i
  10. EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码

+ h3 ?8 I# e2 i, @; @' m
  D. m& ~% Y' R+ d5 P% q

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

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

添加:

[url=]复制[/url]

) h! j* F0 `8 G, R1 Z4 a- f' g& j* c  a" }  o4 q
  1. obj-y     +=  mcp25xxfd/
复制代码

5 Q1 y! F5 n/ ~3 I3 D; [; i& X7 x" v1 X* b

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

添加:

[url=]复制[/url]
8 ^1 F  W1 K+ @4 r- y- L3 `1 j4 _
  1. <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码

0 D  j7 p- }3 I6 R) E' N. X) j2 ]" R( }# t

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' A2 M% E/ H4 d

05在设备树中配置时钟

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

添加:​​​​​​​

[url=]复制[/url]

  1. 0 E2 e" m! k  @+ F' ]7 T
  2. clocks{
    ; ?+ c, x) F& f& n% l
  3.   mcp2518fd_clock:
    $ W+ q  s0 \! G! V, C1 d) }9 M% l
  4.   mcp2518fd_clock{
    0 b6 `* O2 F& D5 H# Z- P$ p
  5.     compatible = "fixed-clock";
    * o$ |& ^# F1 v0 P3 l+ t  P" O5 B
  6.     #clock-cells = <0>;
      ?) t6 c2 }% \. k# v
  7.     clock-frequency = <40000000>;
    % M/ }7 R2 O3 Y
  8.     };2 V1 c& P- T6 Z5 z7 S* I2 _' i3 c
  9. };
复制代码

0 V. A3 ^0 q2 l7 j- x! d! Q5 K& V% e$ w; Y. r, ~  D7 j

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

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

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

添加:​​​​​​​

[url=]复制[/url]
' K# a6 V; r! ^; k
2 f2 `) U& j7 D9 s$ }' |1 `) {
pinctrl_ecspi2_can: ecspi2can{5 `: R$ y( G3 q1 q  `8 J9 @
  fsl,pins = <
) m& `" |0 |- a  K8 _" }4 [! c   MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21   0x40000
- y0 B! a9 H$ A' V! Q   >;3 U& i! v) v  h& y( C
};4 v3 _. v4 n5 ?$ J0 n* T/ g

% K" V% e9 F/ S3 |

07

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

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

从:​​​​​​​

[url=]复制[/url]

% G- w2 C: J4 G; I1 l; y* E% n  ]9 H) T: D. l% Y5 r
  1. &ecspi2{" N! Y3 V" c& v: I  D" Y$ n! m
  2.     #address-cells= <1>;
    & x, O$ x& n( j5 I9 Y
  3.     #size-cells= <0>;: x+ i1 S- ^2 p) J6 s
  4.     fsl,spi-num-chipselects= <1>;
      P! a8 l' }2 X" f  _. o. e1 N' {* ?1 g
  5.     pinctrl-names= "default";
      h9 G, b2 C- L8 t' S5 y$ W" }2 q
  6.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;; W: ^; M* V1 {9 `) O( Q: G2 ?6 X5 I
  7.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;! b2 \3 X7 D0 H9 C
  8.     status= "okay";+ e! ?7 [; W' L/ h
  9. 6 K4 P  w- i3 u1 d8 j
  10.     spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {
    ) E$ o# _! i7 A6 [' M9 u* r5 a
  11.         reg= <0>;* b# N  G, \! N4 U& H
  12.         compatible= "rohm,dh2228fv";
    4 x( v0 K7 p) |3 e; F" d
  13.         spi-max-frequency= <500000>;
    : @: l8 H1 G& x! n
  14.     };
    + }4 ~2 w+ ?8 M  a. j8 I
  15. };
复制代码
  1. <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>
      L% d0 b7 N: |$ @/ l- R

  2. 3 _. l; X: X( |# v6 k9 o- Q1 _5 Z
  3. <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:​​​​​​​</font></p><div align="center">' K2 N) K! A7 y
  4. <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>% ~/ ^# x; }- ^  n
  5. : |/ @( h! R) x# p
  6. <div class="blockcode"><blockquote>&ecspi2{
    % `5 A/ C6 L& f% k) O4 e7 }% }
  7.     #address-cells= <1>;; l1 T) l1 V, }
  8.     #size-cells= <0>;
    & I5 i$ ~) K2 q/ t6 g" O5 l
  9.     fsl,spi-num-chipselects= <1>;
    1 Y3 b  P7 T& z) h5 X
  10.     pinctrl-names= "default";' Z4 u% k, i+ Z4 h
  11.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;
    ! l. K/ ~7 N8 V  q
  12.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;  d1 T$ \" l; e0 _# m; A. N$ [
  13.     status= "okay";* v5 c6 V- i) u* o, j( q
  14. , @' ~5 G8 b- f1 `0 P8 T
  15. mcp1:mcp2518fd@0{$ h7 ]+ w' t$ c9 v4 H+ L
  16.             compatible= "microchip,mcp2518fd";
    7 f/ Y' @8 G( E2 [& M. c% C5 f
  17.             reg= <0>;  g3 Y$ [& \) H) x- F( ~
  18.             spi-max-frequency= <20000000>;
    ' v5 F9 U. g1 k& y3 I" A; C
  19.             clocks= <&mcp2518fd_clock2>;& m) u7 [7 {1 P/ p# M4 w' l) M
  20.             interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
    ; s/ S8 Q3 Q; @# j
  21.         };
    7 u  b+ m  Z3 i/ u, C( B; c
  22. };
复制代码

9 ?# c3 V$ B) A* F) y4 y. a
% ?$ `: x3 s5 v

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

; q: X- O1 ]9 T1 ]$ d; T

08

开发板验证

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

% P3 [: b; _+ a3 r8 \% }5 G( A
' P& N9 o& r5 T. ]% Z3 n2 r8 H5 t3 l) v
1 ^" t  B+ N# E4 e3 r
0 b$ X4 k! d! b$ ^. R1 d
[/td][/tr]. D3 J& T, ~' m. N: v; l* h  g) q$ Y
[/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& E/ \1 H% ]$ c
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-19 14:32 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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