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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 罗罗诺亚 于 2023-9-11 15:24 编辑
% R6 V0 ~% U- B2 a: x6 Y% \
4 ]0 t6 Z. V+ `' H. ]
& J. P4 z7 N; S" T
* D' q6 w6 I! z5 W# }  f

7 E; M  T5 b7 W2 t0 j. g

: |$ Q( Q9 z( Y) A0 r7 f

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

说明

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

    7 _5 S* O0 b' X
% C3 f- {7 L! O' j8 k
  • SPI转CAN芯片型号为:MCP2518,这款芯片可转出CAN-FD,若只需要CAN功能,可参照该方式移植MCP2515或其他芯片;


    " e, U0 u$ e$ Y# f" c

: l% j/ y. I, r% V" I, ~
  • 本次移植的MCP2518芯片驱动来源是i.MX8MQ的源码(处理器中默认移植MCP2518芯片)。

    ' S$ {% m) g! f( ^: Y$ x
6 R$ o$ ]$ H$ s3 |8 F) Q
  C6 E' r; W/ {6 s; R6 @$ z

01移植MC2518芯片驱动

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


/ g: W+ r1 A. X. b: P) t! m7 N

02补全对can_rx_offload_add_manual函数的定义

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

添加:

[url=]复制[/url]

8 O. U) M9 _2 F$ k3 n; s3 ~

  1. % G1 {% l0 L! j& Y, z
  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," l1 M6 X9 t6 `' A1 N; y
  3.     <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
    ( {7 n4 ~# c! V; i8 M
  4.     <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)2 m2 _' ^4 j! O  @. r
复制代码

% f. d9 I/ H1 @( G1 G$ w

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

添加:

[url=]复制[/url]

& u: o: P  U( T
  1. * Y5 s, F7 e8 s. V& K
  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,
    ' Z- E! L3 U- u- D. i9 Y7 m) a, `
  3.         <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
    " A/ C/ y% o  e
  4.             <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)$ b6 [. I# q$ p% [. j
  5. {2 _! Q' Z( J' ?! o
  6.     <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)$ N6 ?& J- h7 l/ g1 G  K& i. @" q5 I' }
  7.             <font color="rgb(198, 120, 221)">return</font> -EINVAL;
    " w1 x) b! \. m$ B+ w8 Y3 V9 h
  8.       <font color="rgb(198, 120, 221)">return</font> can_rx_offload_init_queue(dev, offload, weight);
    8 f4 W9 @; g* @/ B5 R' O
  9. }( Q: W; D- n8 D( v1 R7 W  U9 j
  10. EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码
7 o. f- z5 X4 E4 m) K

$ G' z' ~$ ?% _: h0 ~

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

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

添加:

[url=]复制[/url]
7 o  K' F) D2 s* u/ s# D
7 r) H) s9 i+ _; ~$ g( [, O" \
  1. obj-y     +=  mcp25xxfd/
复制代码
& ^" C5 G' D3 c( T

- e: E8 M1 z- y& g3 V* F: P

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

添加:

[url=]复制[/url]
, P0 g# f2 ~$ r
  1. <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码

+ B1 \- n# d. D
0 V; ]) n8 M, d  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

1 L, ?" o" Z9 F2 P" v% ]

05在设备树中配置时钟

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

添加:​​​​​​​

[url=]复制[/url]
  1. 8 t4 Z) k0 n0 L0 @) g! i8 c
  2. clocks{8 d: T+ d3 ?  t4 p% V
  3.   mcp2518fd_clock:
    & o( D! Z3 `+ U  ?# \) V) T. I
  4.   mcp2518fd_clock{
    1 q( z9 m: t4 A  ]* i9 R" J
  5.     compatible = "fixed-clock";
    . t) Z& X1 Y# @/ c1 v. u0 G. S: T
  6.     #clock-cells = <0>;& p3 X9 x' v2 G- F
  7.     clock-frequency = <40000000>;. R% Z) D: r6 n4 ?
  8.     };
    % s% V; t. `% P5 Q& O' w- p  t
  9. };
复制代码

/ ~  i1 @. m( l2 M. T0 @
1 Q* S1 }3 ^* @

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

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

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

添加:​​​​​​​

[url=]复制[/url]
* K' Z& s/ v7 `$ R" [' ]6 N; {
# N  n4 L8 R$ ~4 z0 ~: c) n
pinctrl_ecspi2_can: ecspi2can{
2 E# [) o4 I9 t) q  e  fsl,pins = <
8 ?/ u1 i  g" Q% H   MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21   0x40000
5 ]( [; L( o1 O% H( U. P9 w   >;1 R9 o6 f% ^) q
};9 n: z. |+ Z* Q# O' U& B
" V7 j  A( C- v

07

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

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

从:​​​​​​​

[url=]复制[/url]
. Q. K4 A, [$ y) z0 _7 q6 p6 q6 q# ]
4 [2 \  ]+ y( e- P# R) }
  1. &ecspi2{
    * S) p9 O/ d0 v
  2.     #address-cells= <1>;
    9 d' Z( N  D% q( ~
  3.     #size-cells= <0>;- T2 ]% h+ q# G$ U5 \; B: }
  4.     fsl,spi-num-chipselects= <1>;! ]3 c; d' Z7 D/ k4 @! r9 v! d
  5.     pinctrl-names= "default";. a% S( d" e% Y& N) F6 a: M
  6.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;
    : S6 F. o" C0 t+ R' `2 ^) `! y
  7.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
    ( r2 O, L. T) P6 A
  8.     status= "okay";! n9 U8 w, l" I

  9. / E4 O' Q1 i" [6 _+ F2 p
  10.     spidev1:spi<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {, o+ G% g4 }9 |: n+ J9 R5 ]( q; ^# o
  11.         reg= <0>;
    % ?  E) c! r$ G) r9 D+ u- W. Y. P
  12.         compatible= "rohm,dh2228fv";" Y, G7 N' F+ T3 F7 m
  13.         spi-max-frequency= <500000>;. E( O9 j9 e1 }% A* \
  14.     };
    ) q2 ~9 ]& Y: D7 d2 A/ i
  15. };
复制代码
  1. <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>3 h. e) K+ f3 W3 K& _2 s
  2. 5 I# Y& ]6 I0 E% x1 f+ X
  3. <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:​​​​​​​</font></p><div align="center">9 ~9 [; H3 Y/ f2 V# z$ B1 I
  4. <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>* _' B& b( h& ?3 J2 j& _: w

  5. , L, ]+ t3 Y$ J3 W
  6. <div class="blockcode"><blockquote>&ecspi2{
    * A  d0 a3 R, E2 Z3 i( U
  7.     #address-cells= <1>;
    0 q1 p% F! P# L4 c! N
  8.     #size-cells= <0>;
    ' \8 y. D/ M! `2 J( s% @) O, n' R9 _4 i
  9.     fsl,spi-num-chipselects= <1>;7 i3 \1 `( j2 j
  10.     pinctrl-names= "default";
    & [2 K; x6 f+ s" e7 q* D* o1 ?( _' J. o
  11.     pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;0 I; a: x. Z7 H
  12.     cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
    ( H" Q# r5 x# k* @, D7 \
  13.     status= "okay";
    4 |6 ~7 S4 N! D% E

  14. + K/ V1 c/ C# g. z& e$ J
  15. mcp1:mcp2518fd@0{
    ! _8 M- b' t5 n* H/ h
  16.             compatible= "microchip,mcp2518fd";: @9 d% _, I. Q2 n/ s+ |
  17.             reg= <0>;
    ; o# t( C. X# N& S
  18.             spi-max-frequency= <20000000>;
    ) f2 L8 P+ A, P+ g5 D4 A' K
  19.             clocks= <&mcp2518fd_clock2>;
    / Q- P: o$ S8 \# l. J
  20.             interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>;
    ; d" W% q4 ~& c2 {
  21.         };
    + [* F9 h7 m9 ]
  22. };
复制代码
  Z* F) {. L* T2 i
6 [1 P$ U' \2 D, ]2 }9 A( b1 Y  o; z

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


" d; A) X* r% q/ r8 K& t- e

08

开发板验证

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


  R/ P" f1 z, L  r& s3 g- [! V
( ?/ i7 M' P: p5 u, @+ r5 g8 U

) i% o, [1 N8 l1 @1 t( P9 S0 [* A: Z+ v/ L8 i  ~) B: ?- O% t* x
[/td][/tr]& f" d. T  j& C  q! {" 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小时批量加急    电话 微信同号1987691631908 W! ?& g+ o  |$ l* v! O2 U6 M# x
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-9 23:30 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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