热度 11
2023-4-7 10:16
998 次阅读|
0 个评论
SPI(串行外围设备接口)是一种低成本、易使用的接口协议,具备全双工、高速、通讯简单的特点,被广泛应用于微控制器和外围设备芯片之间的通讯。当SPI接口作为主模式时可以连接Flash存储器、AD采样芯片、实时时钟RTC、LCD显示屏、音频芯片以及各种传感器。 随着产品功能的愈加丰富,多处理器使用SPI接口进行通讯的场景开始出现,而多个SPI设备之间通信必须由 主设备(Master) 来控制 从设备(Slave) 。 小编手上的OKMX8MP-C开发板基于NXP i.MX8M Plus多核异构处理器设计,它的M核有1路SPI,因而为实现SPI的相互通讯,我们就需要两块OKMX8MP-C开发板的SPI互作主从设备进行通信。本文小编就将从应用角度为大家讲解M核SPI间通讯的实现方式。 一、SPI主模式 1. SPI初始化 SPI初始化主要包括总线时钟、管脚和相应寄存器的初始化。具体如下: (1)SPI总线时钟:现将SPI总线倍频到800MHz,再10分频到80MHz。 CLOCK_SetRootMux (kCLOCK_RootEcspi2, kCLOCK_EcspiRootmuxSysPll1); //SPI2总线时钟使用PLL1-800MHz CLOCK_SetRootDivider (kCLOCK_RootEcspi2, 2 U, 5 U); //分频因子为2*5=10,设置SPI2总线时钟为80MHz (2)管脚配置:选择SPI2的四个管脚。 IOMUXC_SetPinMux (IOMUXC_ECSPI2_MISO_ECSPI2_MISO, 0 U); // SPI2-MISO IOMUXC_SetPinMux (IOMUXC_ECSPI2_MOSI_ECSPI2_MOSI, 0 U); // SPI2-MOSI IOMUXC_SetPinMux (IOMUXC_ECSPI2_SCLK_ECSPI2_SCLK, 0 U); // SPI2-SCLK IOMUXC_SetPinMux (IOMUXC_ECSPI2_SS0_ECSPI2_SS0, 0 U); // SPI2-SSO (3)SPI速率:设置速率为500K。 # define TRANSFER_BAUDRATE 500000U // 速率 500K (4)数据长度选择:8bit。 burstLength = 8 ; // 数据长度 8bit (5)四种模式选择:CPOL和CPHA的四种组合即为SPI的四种模式。 clockInactiveState = kECSPI_ClockInactiveStateLow; // 时钟SCL: 活动时低电平,空闲时高电平 dataLineInactiveState = kECSPI_DataLineInactiveStateLow; // 数据MOSI&MISO: 活动时低电平,空闲时高电平 chipSlectActiveState = kECSPI_ChipSelectActiveStateLow; // 片选SS: 低电平选中,高电平无效 polarity = kECSPI_PolarityActiveHigh; // 时钟信号极性,即CPOL为0的话 SCLK高电平有效(空闲的时候为低电平),为1的话SCLK低电平有效(空闲的时候为高电平)。 phase = kECSPI_ClockPhaseFirstEdge; // 时钟相位,即CPHA为0的话串行时钟的第一个跳变沿(上升沿或下降沿)采集数据,为1的话串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。 (6)主模式选择:设置SPI为主模式。 channelConfig.channelMode = kECSPI_Master; // 主模式 (7)通道选择:一个 SPI 有四个硬件片选信号,每个片选信号是一个硬件通道,本程序选择通道0。 channel = kECSPI_Channel0; // 通道0 (8)关闭自回环:如果开启了自回环,那么SPI数据会在芯片内回环,不会到外部管脚,在程序调试时可以排除外部端子的干扰,但真实应用时,需要关闭自回环,从外部管脚收发数据。 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= 0 U;i