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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 罗罗诺亚 于 2023-9-11 15:24 编辑
! r/ @9 m% Q; ?1 f  a0 `( q) b& V, S/ b/ c# i" ]3 ~
; Z1 F: u+ |# N3 n$ F4 A2 C5 R

# |7 i! c* g2 M6 `( n

' `5 t3 a; I# @4 L4 l

/ B' L6 D2 v7 ?/ ^8 ~. c

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

说明

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


    4 q- h7 v& z1 ~$ ]8 {  [% S; z
. a: ]' y; m" |% V% d
  • SPI转CAN芯片型号为:MCP2518,这款芯片可转出CAN-FD,若只需要CAN功能,可参照该方式移植MCP2515或其他芯片;


    5 ?# K( z6 i# m/ n$ q

, b! T: O% s: J( p
  • 本次移植的MCP2518芯片驱动来源是i.MX8MQ的源码(处理器中默认移植MCP2518芯片)。

    / E6 ^, a: [8 [. {) ^2 _8 _

1 ?% l9 Q- s+ q( x% G; {9 Q6 U9 D. w+ m% |1 C' Y

01移植MC2518芯片驱动

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

3 R% m' W$ f# g) V- M2 B/ |

02补全对can_rx_offload_add_manual函数的定义

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

添加:

[url=]复制[/url]

- R& ]( u' o' O$ A& p

  1. 9 m/ v' f7 I* h% x& \
  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,  o2 k0 o3 G! @: r! @: |
  3.     <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
    * ~3 O2 \2 J* _! W
  4.     <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)' y. Q& P# n6 z
复制代码
  X; X0 ]" Q  y' c

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

添加:

[url=]复制[/url]

4 F! w7 J6 ]* ~, ]7 T* l, K4 N

  1. & S  p+ r- m. ]( h9 k% B" i( 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,
    9 c6 u0 I7 a# K0 L, y" v, T
  3.         <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
    # Q7 _; P# U8 _9 R; P
  4.             <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)( j6 C6 L  a- F9 X9 f6 O
  5. {
    1 ^# S5 o, M/ _( y+ S: u3 o
  6.     <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)! H9 v" [7 i9 p& C' b1 t2 J
  7.             <font color="rgb(198, 120, 221)">return</font> -EINVAL;
    - [, ^7 F+ ]$ K* J! D
  8.       <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);
    ' ?) `1 g7 C1 a  B& [# t/ A
  9. }) T6 u# J( V, h2 n: w3 W1 u
  10. EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码
1 I2 }+ E- {/ o0 f  R% N
4 N: `6 z5 `6 Y- s% G1 H& K# [

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

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

添加:

[url=]复制[/url]
2 D, h( A1 J6 X3 h  M
6 X4 F, G+ e: s5 L0 v
  1. obj-y     +=  mcp25xxfd/
复制代码
# ~" @) W# ^0 v8 Q1 \; K

: ~  T9 F* R5 A6 H3 K

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

添加:

[url=]复制[/url]
4 v# H  x# T4 s+ R
  1. <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码

- P4 p2 f' ~3 m7 o) [
. L7 y  W4 f. O4 l1 R) r

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

8 J7 D# w4 L( b1 F: ?7 w

05在设备树中配置时钟

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

添加:​​​​​​​

[url=]复制[/url]
  1. ' |4 U- {. }/ S" C
  2. clocks{
    % W) G, ]- C4 t0 D  X
  3.   mcp2518fd_clock: 8 V: g  i2 m- J3 v& i7 I
  4.   mcp2518fd_clock{
    ( w" J9 y6 O  j# Y' d
  5.     compatible = "fixed-clock";; z0 n4 a: }+ R+ M. s+ G' R$ ^
  6.     #clock-cells = <0>;
    + D0 C  A( n/ {
  7.     clock-frequency = <40000000>;: M! {- p5 V+ d* P4 f
  8.     };7 h9 n/ q2 J9 D' J
  9. };
复制代码
4 w+ s9 ]5 E6 E4 j: T" G. [% D

2 b5 f) F. q# K2 V; c, a# D

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

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

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

添加:​​​​​​​

[url=]复制[/url]
8 g/ [: H. [+ Z3 |- q: Z! r- i/ I+ E

  }# T! u' ^3 y- i" \3 kpinctrl_ecspi2_can: ecspi2can{
( m. J4 R$ M( u& ]  fsl,pins = <
% F  K% t- w* I7 X$ f   MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21   0x40000
1 `2 b2 M# H$ j' E- x) Y   >;1 C. F  p  Y5 I( Z
};& P4 o( G5 k6 G9 y- P3 c# P( M

4 t3 N, [" p  F9 R5 H

07

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

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

从:​​​​​​​

[url=]复制[/url]
6 b" v1 i9 T7 e2 [  D6 ?, W

! t7 Q% ^5 D8 a4 I5 G
  1. &ecspi2{
    7 i6 x! P6 L0 ?4 G# d  V1 F
  2.     #address-cells= <1>;; ]; j7 Z: e% c0 [& t
  3.     #size-cells= <0>;
      z: a( \+ D; \0 A
  4.     fsl,spi-num-chipselects= <1>;& n! M0 j3 J- q# q" d% y
  5.     pinctrl-names= "default";
    - B" }6 p! s8 m* Z" H2 D' h) n) ]
  6.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;
      O% U" f, S. H% v- f1 Z# m  P
  7.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
    . i4 A; L7 h7 g7 p
  8.     status= "okay";8 j. d( M$ ~" m  F) n
  9. 7 J8 `1 S* V* b+ k0 \, H
  10.     spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {- T2 U5 J" e7 ?7 c* n! [' U
  11.         reg= <0>;- U# V  b7 Z' N- B
  12.         compatible= "rohm,dh2228fv";# Z. k  Q) q9 o$ y! Z  A3 D9 |  F
  13.         spi-max-frequency= <500000>;
    ; c. J$ y# ~: A, m8 R* T# x
  14.     };& v' m1 i, x" H4 s! v' \, V
  15. };
复制代码
  1. <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>
    ; ~$ n: b8 C. n( X5 u

  2. + X) H5 M. {" N/ q, t. w, _
  3. <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:​​​​​​​</font></p><div align="center">
    ! `6 o! s# b0 L$ F) [/ s
  4. <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>+ ^. ^5 C" N5 ~9 V9 z; n+ R: H
  5. ) q% `; {$ N/ h
  6. <div class="blockcode"><blockquote>&ecspi2{7 G3 r7 C. S2 E# Z8 T5 o- \2 l9 e
  7.     #address-cells= <1>;/ I/ u! L2 \5 @. O% g# x
  8.     #size-cells= <0>;
    7 ~& B8 i  K* ~' }' y- G
  9.     fsl,spi-num-chipselects= <1>;
    5 Y& ]& }+ U# u* R
  10.     pinctrl-names= "default";
    ) _' a4 i5 T/ d) ?
  11.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;
    : X+ V, Q' N  ]7 |
  12.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
    % e' o# G. L- F) t' {- {
  13.     status= "okay";6 }$ U4 |5 H! J) N! V

  14. ! \+ `6 w# t. y5 y4 ~3 ^5 c
  15. mcp1:mcp2518fd@0{
    1 L( }' n' B3 X, p0 g
  16.             compatible= "microchip,mcp2518fd";  i4 j2 R. _  Z0 F: g* C+ X1 n
  17.             reg= <0>;
    / Y* t4 K/ L" T7 c5 r
  18.             spi-max-frequency= <20000000>;
    / A) H! o& J2 H4 A2 P0 Z
  19.             clocks= <&mcp2518fd_clock2>;- `4 ?+ y! O7 A6 z3 Y+ h; {# q
  20.             interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;8 g# j- `. \( N) s6 @! r1 A
  21.         };
    " x! i8 s5 H3 M+ Z3 J# D
  22. };
复制代码

9 q. Q7 I6 X) `8 O  }$ _! t) h( N  i) w# }7 X! A

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

/ B( q/ e8 {3 ]4 N* h5 [

08

开发板验证

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


3 j$ W/ u9 F1 _/ o9 j; V8 C( h6 m, Z8 A# u, L
& n# ?! D; M, R/ d; P5 _' F

: f1 l0 }' v% g+ _  F[/td][/tr]  y' V/ k$ ?, e6 l' n2 b* x
[/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
    ; H- i* [7 v& W0 f1 \" ~
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-13 21:55 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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