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
    +关注

    关注

    135

    文章

    9499

    浏览量

    388688
  • NXP
    NXP
    +关注

    关注

    61

    文章

    1376

    浏览量

    194727
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1866

    浏览量

    99802
  • 多核异构
    +关注

    关注

    0

    文章

    23

    浏览量

    5611
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    既要稳定性,还要性价比的工业级开发板 — 米尔i.MX91

    之前我介绍过NXPi.MX8系列的开发板,最近它的下一代产品i.MX9系列产品也有了,我就拿到了这个基于NXPi.MX9系列的米尔MYD-LMX91
    的头像 发表于 11-20 08:05 755次阅读
    既要稳定性,还要性价比的工业级<b class='flag-5'>开发板</b> — 米尔<b class='flag-5'>i.MX</b>91

    恩智浦FRDM i.MX 8M Plus开发板详解

    开发高级HMI应用、计算机视觉系统以及边缘AI项目时,开发人员常常面临一个共同挑战:如何在不依赖昂贵且复杂的开发平台的前提下,获得足够的处理能力。这正是FRDM i.MX
    的头像 发表于 11-18 15:07 669次阅读

    恩智浦FRDM i.MX 8M Plus开发板上架

    i.MX 8M Plus应用处理器集成2个或4个Arm Cortex-A53、1个专用于实时控制的Arm Cortex-M7
    的头像 发表于 08-16 17:38 1818次阅读
    恩智浦FRDM <b class='flag-5'>i.MX</b> <b class='flag-5'>8M</b> <b class='flag-5'>Plus</b><b class='flag-5'>开发板</b>上架

    【老法师】多核异构处理器中M程序的启动、编写和仿真

    文章,小编就将以飞凌嵌入式的OKMX8MP-C开发板为例,为大家介绍多核异构处理器M程序的启动
    的头像 发表于 08-13 09:05 3631次阅读
    【老法师】<b class='flag-5'>多核</b><b class='flag-5'>异构</b>处理器中<b class='flag-5'>M</b><b class='flag-5'>核</b>程序的启动、编写和仿真

    【飞凌嵌入式】基于i.MX9352开发板M的FreeRTOS设计例程

    i.MX 9352作为NXP 推出的新一代轻量级边缘AI处理器,集成2个Cortex-A55和1个Cortex-M33实时,其架构设计充分体现了对实时性与复杂任务处理能力的兼顾。为
    的头像 发表于 06-13 16:14 1806次阅读
    【飞凌嵌入式】基于<b class='flag-5'>i.MX</b>9352<b class='flag-5'>开发板</b><b class='flag-5'>M</b><b class='flag-5'>核</b>的FreeRTOS设计例程

    NXP i.MX 91开发板#支持快速创建基于Linux®的边缘器件

    NXP Semiconductors FRDM i.MX 91开发板设计用于评估i.MX 91应用处理器,支持快速创建基于Linux ^®^ 的边缘器件。该开发板还设计用于入门级Lin
    的头像 发表于 05-19 10:55 1994次阅读
    NXP <b class='flag-5'>i.MX</b> 91<b class='flag-5'>开发板</b>#支持快速创建基于Linux®的边缘器件

    米尔瑞芯微多核异构低功耗RK3506核心重磅发布

    近日,米尔电子发布MYC-YR3506核心开发板,基于国产新一代入门级工业处理器瑞芯微RK3506,这款芯片采用三Cortex-A7+单核Cortex-M0
    发表于 05-16 17:20

    米尔基于瑞芯微RK3506核心开发板

    MYC-YR3506核心开发板新一代入门级国产工业处理器RK3506,3A7+单核M0多核异构
    发表于 05-15 16:00 10次下载

    3A7+单核M0多核异构,米尔全新低功耗RK3506核心发布

    近日,米尔电子发布MYC-YR3506核心开发板,基于国产新一代入门级工业处理器瑞芯微RK3506,这款芯片采用三Cortex-A7+单核Cortex-M0
    的头像 发表于 05-15 08:02 1735次阅读
    3<b class='flag-5'>核</b>A7+单核<b class='flag-5'>M</b>0<b class='flag-5'>多核</b><b class='flag-5'>异构</b>,米尔全新低功耗RK3506核心<b class='flag-5'>板</b>发布

    i.MX93和i.MX8M Plus上都使用UART,遇到了RTS/CTS连接问题求解决

    我在 i.MX93和 i.MX8M Plus 上都使用 UART,并遇到了 RTS/CTS 连接问题。 在 i.MX93 上,以下接线工作正常: TX→ RX (RS232) RX←
    发表于 04-04 07:16

    请问在NXP的BSP QA过程中采用了哪些具体的测试方法?

    来更好地了解 QA 流程并在 RSB 3720 上实施它(NXP i.MX8M Plus Cortex-A53® 2.5 英寸 SBC)?
    发表于 03-17 08:04

    分享!基于NXP i.MX 8M Plus平台的OpenAMP间通信方案

    i.MX 8M Plus平台。 OpenAMP架构 AMP(Asymmetric Multi-Processing),即非对称多处理架构。“非对称AMP”双系统是指多个核心相对独立运行不同的操作系统或
    的头像 发表于 02-27 10:44 872次阅读
    分享!基于NXP <b class='flag-5'>i.MX</b> <b class='flag-5'>8M</b> <b class='flag-5'>Plus</b>平台的OpenAMP<b class='flag-5'>核</b>间通信方案

    NXP首款搭载MPU的FRDM产品怎么样?FRDM i.MX93开发板开箱速览

    近期,NXP将i.MX 93系列处理器引入了FRDM系列产品线,推出了FRDM i.MX 93开发板,作为首款配备i.MX MPU的FRDM
    的头像 发表于 02-26 14:56 2364次阅读
    NXP首款搭载MPU的FRDM产品怎么样?FRDM <b class='flag-5'>i.MX</b>93<b class='flag-5'>开发板</b>开箱速览

    恩智浦推出FRDM i.MX 93开发板

    备受嵌入式开发者青睐的恩智浦FRDM开发平台,迎来了一位新成员——FRDM i.MX 93开发板,这也是第一块配备i.MX MPU的FRDM
    的头像 发表于 02-21 14:22 2911次阅读

    i.MX8M Yocto工程更新第三方软件包

    IAC-IMX8MP-Kit开发板为例,介绍如何升级已经配置好的Yocto工程第三方软件包。首先,需要一个已经拉取并编译好的Yocto工程,这个步骤可以参考NXP官方Yocto文档,
    的头像 发表于 02-12 08:11 1270次阅读
    <b class='flag-5'>i.MX8M</b> Yocto工程更新第三方软件包