0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【玩转多核异构】i.MX8M Plus开发板的M核SPI主从模式通讯

飞凌嵌入式 2023-04-07 17:08 次阅读

为了能够让更多工程师朋友了解多核异构处理器飞凌嵌入式特别推出了【玩转多核异构】专题,帮助大家解决在多核异构处理器的开发过程中遇到的问题。专题持续更新中,欢迎您的订阅关注。

SPI(串行外围设备接口)是一种低成本、易使用的接口协议,具备全双工、高速、通讯简单的特点,被广泛应用于微控制器和外围设备芯片之间的通讯。当SPI接口作为主模式时可以连接Flash存储器、AD采样芯片、实时时钟RTC、LCD显示屏、音频芯片以及各种传感器

d1234a56-d4c9-11ed-ad0d-dac502259ad0.png

随着产品功能的愈加丰富,多处理器使用SPI接口进行通讯的场景开始出现,而多个SPI设备之间通信必须由主设备(Master)来控制从设备(Slave)。小编手上的OKMX8MP-C开发板基于NXPi.MX8MPlus多核异构处理器设计,它的M核有1路SPI,因而为实现SPI的相互通讯,我们就需要两块OKMX8MP-C开发板的SPI互作主从设备进行通信。本文小编就将从应用角度为大家讲解M核SPI间通讯的实现方式。

d135e684-d4c9-11ed-ad0d-dac502259ad0.jpg

一、SPI主模式

1. SPI初始化

SPI初始化主要包括总线时钟、管脚和相应寄存器的初始化。具体如下:

(1)SPI总线时钟:现将SPI总线倍频到800MHz,再10分频到80MHz。

CLOCK_SetRootMux(kCLOCK_RootEcspi2,kCLOCK_EcspiRootmuxSysPll1);//SPI2总线时钟使用PLL1-800MHz

(2)管脚配置:选择SPI2的四个管脚。

IOMUXC_SetPinMux(IOMUXC_ECSPI2_MISO_ECSPI2_MISO, 0U); // SPI2-MISO IOMUXC_SetPinMux(IOMUXC_ECSPI2_MOSI_ECSPI2_MOSI, 0U); // SPI2-MOSI IOMUXC_SetPinMux(IOMUXC_ECSPI2_SCLK_ECSPI2_SCLK, 0U); // SPI2-SCLK IOMUXC_SetPinMux(IOMUXC_ECSPI2_SS0_ECSPI2_SS0, 0U); // SPI2-SSO

(3)SPI速率:设置速率为500K。

#define TRANSFER_BAUDRATE 500000U // 速率 500K

(4)数据长度选择:8bit。

config->burstLength=8;//数据长度8bit

(5)四种模式选择:CPOL和CPHA的四种组合即为SPI的四种模式。

config->clockInactiveState = kECSPI_ClockInactiveStateLow; // 时钟SCL: 活动时低电平,空闲时高电平 config->dataLineInactiveState = kECSPI_DataLineInactiveStateLow;// 数据MOSI&MISO: 活动时低电平,空闲时高电平 config->chipSlectActiveState = kECSPI_ChipSelectActiveStateLow;// 片选SS: 低电平选中,高电平无效 config->polarity = kECSPI_PolarityActiveHigh; // 时钟信号极性,即CPOL为0的话 SCLK高电平有效(空闲的时候为低电平),为1的话SCLK低电平有效(空闲的时候为高电平)。 config->phase = kECSPI_ClockPhaseFirstEdge; // 时钟相位,即CPHA为0的话串行时钟的第一个跳变沿(上升沿或下降沿)采集数据,为1的话串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。

(6)主模式选择:设置SPI为主模式。

config->channelConfig.channelMode = kECSPI_Master; // 主模式

(7)通道选择:一个SPI有四个硬件片选信号,每个片选信号是一个硬件通道,本程序选择通道0。

config->channel = kECSPI_Channel0; // 通道0

(8)关闭自回环:如果开启了自回环,那么SPI数据会在芯片内回环,不会到外部管脚,在程序调试时可以排除外部端子的干扰,但真实应用时,需要关闭自回环,从外部管脚收发数据。

Config->enableLoopBack = false; // 不回环,使用外部管脚

2. SPI收发流程

我们分别将两块OKMX8MP-C开发板命名为开发板1和开发板2,并且将开发板1的SPI接口采用主模式,使能收发中断;将开发板2的SPI接口采用从模式,使能收发中断。

SPI主发送64字节数据,SPI从接收后,将数据回传。SPI主接收回传信息后,比对接收和发送的数据是否一致,输出比对结果。如一致,本次传输结束,等待输入任何按键启动下一次传输。

(1)SPI发送数据:EXAMPLE_ECSPI_MASTER_BASEADDR 表示为SPI2,g_m_handle为SPI实例,包含了发送接收中断及其回调函数,masterXfer为要发送的64字节数据。

ECSPI_MasterTransferNonBlocking(EXAMPLE_ECSPI_MASTER_BASEADDR, &g_m_handle, &masterXfer); //主模式中断方式发送数据

(2)SPI接收数据:SPI总线的发送和接收都是主模式控制的,因此接收函数的过程和发送是一致的。

(3)接收和发送数据对比:

for (i = 0U; i < TRANSFER_SIZE; i++) { if (masterTxData[i] != masterRxData[i]) { errorCount++; } }

二、SPI从模式

1. SPI初始化

SPI从模式初始化与主模式要保持一致,除了将工作模式设为从模式,其他设置均一样。主从模式选择:设置SPI为从模式。

config->channelConfig.channelMode = kECSPI_Slave; //从模式

2. SPI收发流程

开发板2的SPI接口采用从模式,使能收发中断。

SPI从进入等待接收状态,在片选有效后,通过接收中断获取数据,并回传信息,再次进入接收状态。

(1)SPI接收数据:EXAMPLE_ECSPI_SLAVE_BASEADDR表示为SPI2,g_m_handle为SPI实例,包含了发送接收中断及其回调函数,slaveXfer存储接收的数据。

ECSPI_SlaveTransferNonBlocking(EXAMPLE_ECSPI_SLAVE_BASEADDR, &g_s_handle, &slaveXfer); //从模式中断方式接收数据

(2)SPI发送数据:SPI总线的发送和接收都是主模式控制的,因此接收函数的过程和发送是一致的。

三、A核修改

A核设备树中若保留SPI2,内核解析设备树,在/dev下生成设备文件spidev1.0。这样待M核运行后,A核将重新对SPI2初始化,造成M核SPI功能异常,因此需要去除A核对SPI的控制。

1.修改设备树

(1)在设备树OK8MP-C.dts中,删除SPI2设备节点相关信息。

&ecspi2 { #address-cells = <1>; #size-cells = <0>; fsl,spi-num-chipselects = <1>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>; cs-gpios = <&gpio5 13 GPIO_ACTIVE_LOW>; status = "okay"; spidev1: spi@0 { reg = <0>; compatible = "rohm,dh2228fv"; spi-max-frequency = <500000>; }; }; pinctrl_ecspi2: ecspi2grp { fsl,pins = < MX8MP_IOMUXC_ECSPI2_SCLK__ECSPI2_SCLK 0x82 MX8MP_IOMUXC_ECSPI2_MOSI__ECSPI2_MOSI 0x82 MX8MP_IOMUXC_ECSPI2_MISO__ECSPI2_MISO 0x82 >; }; pinctrl_ecspi2_cs: ecspi2cs { fsl,pins = < MX8MP_IOMUXC_ECSPI2_SS0__GPIO5_IO13 0x40000 >; };

(2)编译生成新的内核镜像Image及设备树OK8MP-C.dtb。

(3)将生成的OK8MP-C.dtb和Image拷贝至开发板/run/media/mmcblk2p1/目录下,输入sync命令,重启开发板。

(4)输ls /dev查看发现没有SPI2设备文件spidev1.0。

四、程序验证

1.硬件连接

使用杜邦线将两块OKMX8MP-C开发板的SPI一一对应连接,线序如下:

开发板1--SPI主模式

开发板2--SPI从模式

管脚名称

开发板位置

管脚名称

开发板位置

MISO

P40-10

MISO

P40-10

MOSI

P40-8

MOSI

P40-8

SCK

P40-1

SCK

P40-1

SS0

P40-3

SS0

P40-3

GND

P40-4/P40-7

GND

P40-4/P40-7

2. M核程序

修改uboot环境变量设置M核自启动,同时将M核程序forlinx_m7_tcm_firmware.bin

放到/run/media/mmcblk2p1/目录下。注意,SPI主模式程序须放入开发板1,SPI从模式程序须放入开发板2。

3. 实际测试

(1)开发板2先上电,M核程序启动,完成SPI初始化后,进入接收等待状态;

(2)开发板1后上电,M核程序启动,完成SPI初始化后,主动发送64字节数据;

(3)开发板2SPI接收数据,通过串口打印接收的数据,并将接收的数据再次发送;

d158ebac-d4c9-11ed-ad0d-dac502259ad0.png

(4)开发板1的SPI接收到回传信息,通过串口打印接收的数据。和发送数据比对,输出结果。

d16b5df0-d4c9-11ed-ad0d-dac502259ad0.png

(5)此时在开发板1调试串口输入任意键,即可开启新一轮的SPI发送和接收流程。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8653

    浏览量

    361831
  • NXP
    NXP
    +关注

    关注

    60

    文章

    1214

    浏览量

    177274
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1615

    浏览量

    89620
  • 多核异构
    +关注

    关注

    0

    文章

    13

    浏览量

    5422
收藏 人收藏

    评论

    相关推荐

    迅为i.MX8M开发板添加RIL驱动程序库

    下,如下图所示: 然后将 apns-conf.xml 拷贝到 android_build/device/fsl/imx8m/evk_8mm/下,如下图所示: 更多文档可以查看 B站搜索-北京迅为i.MX8M
    发表于 10-24 09:56

    标准系统:OSWare 大牛-8M Mini

    开发板名称(芯片型号) OSWare 大牛-8M Mini 芯片架构 CPU频率 介绍(字数请控制在200字以内) NXP i.MX 8M Mini是一款集成4
    发表于 10-19 10:53

    迅为i.MX8M Mini开发板一些功能

    )、Linux4.14.78 + Qt5.10.1Yocto、Ubuntu20、Debian9系统 07、迅为特别推出《嵌入式Liunx开发指南》 倾心力作! i.MX8MM开发板指南,涵盖范围广,覆盖
    发表于 09-05 10:30

    专用M4F+四A53,异构多核AM62x让工业控制“更实时、更安全”

    Cortex-M4F + Cortex-A53异构多核给工业控制带来何种意义?创龙科技SOM-TL62x工业核心搭载TI AM62x最新处理器,因其Cortex-
    发表于 06-15 17:18

    NXP i.MX 8M Plus工业核心规格书(四ARM Cortex-A53 + 单核ARM Cortex-M7,主频1.6GHz)

    1 核心简介创龙科技SOM-TLIMX8MP是一款基于NXP i.MX 8M Plus的四A
    发表于 06-13 17:01

    如何构建OpenVG程序并在i.MX8MPlus上运行它们?

    与 OpenVG 相关的示例代码,但我不确定如何将它与i.MX8M Plus 的 SDK。如果您有关于如何在 i.MX8M Plus 平台上构建和运行此示例代码的说明或资源
    发表于 05-31 12:16

    i.MX8m plus如何在ICC配置文件之间进行转换?

    我知道 NXP OpenCV fork 集成了 eIQ,用于 i.MX8m plus 上的硬件加速神经图像处理。 但是,非机器学习图像处理又如何呢,例如在 ICC 配置文件之间进行转换?NXP
    发表于 05-31 06:02

    i.MX8MSPI通信,SPI在长传输中停止的情况是什么原因造成的?

    所以我正在开发与 NXP i.MX8MSPI 通信(使用 spidev 设备),我遇到了 SPI 在长传输(&gt; 4096 字节)中停止的情况。我还发现这是一个 uP
    发表于 05-31 06:02

    如何在i.MX8M Plus设备上对音频DSP进行编程?

    我们可以使用 MCUXpresso 对 i.MX8M Plus 设备上的 DSP 进行编程吗? 如果没有,我们如何对 DSP 进行编程?
    发表于 05-29 07:33

    有Pico-iTX外形规格NXP® i.MX8M 系列 (ND108T) 的手册和Python库吗?

    我为树莓编译了一个 python 脚本来管理带中断的 GPIO。 我必须在 NXP i.MX8M 上测试相同的功能。有 Pico-iTX 外形规格 NXP® i.MX8M 系列 (ND108T) 的手册和 Python 库吗?还有任何示例/指南吗?
    发表于 05-22 08:39

    如何在i.MX8M迷你上运行qt3d?

    -tools,qtsvg ,qttools,qttools-plugins,qttools-tools,qtxmlpatterns 在我的 yocto 构建中。那么如何在我的 i.MX8M 上运行 qt3d
    发表于 05-22 07:43

    如何为i.MX8M Plus构建SCFW?

    我们正在推出一款基于 i.MX8M Plus 的新。我找到了技术说明 AN13275.pdf,其中包含有关编译所有软件的说明。 我目前被困在 SCFW 上。我已经下载了 SCFW 移植工具包,其中
    发表于 05-17 12:58

    i.MX8M Plus Android构建映像的生产闪存怎么解决?

    我们正在寻求为生产基于 i.MX8M Plus 的产品准备好一切,我遇到了一个障碍,有人可能会提供帮助。目前的计划是在将 eMMC 放到电路上之前对其进行闪存。这个过程需要一个完整的芯片图像,我
    发表于 05-10 07:51

    I.MX8M Plus如何选择BSP?

    我公司是一家医疗器械制造商,目前计划采用NXP的imx8m Plus作为产品的主控芯片。但是,我们不确定要使用哪个版本的 BSP。您有长期支持的恩智浦 imx8m Plus 稳定版吗?
    发表于 05-06 07:36

    如何在i.MX8M Plus上为13MP摄像头启用双摄像头流?

    i.MX8M Plus 非常适合启用双流 高性能:采用 Arm Cortex-A53 四 CPU、Cortex-M7 实时处理器和专用神经处理单元 (NPU) 来处理复杂的视觉任
    发表于 05-05 08:34