By Toradex秦海

1). 简介

在之前的两篇文章中已经介绍过基于NXP iMX7 异构多核架构进行开发调试,以及iMX7 M4核心PWM驱动开发。本文就继续演示基于iMX7 M4 SPI Slave Mode功能测试。

本文所演示的ARM平台同样来自于Toradex 基于NXP iMX7 ARM处理器的Colibri iMX7 ARM嵌入式平台。

2. 准备

a). Colibri iMX7S ARM核心版配合Colibri Evaluation Board,分别连接A7核心默认调试串口UART1(载板X27)和M4核心默认调试串口UART2(载板X25上)到开发主机方便调试,另外由于iMX7S只支持一个USB接口,需要通过载板X30连接一个USB Hub后来扩展键盘鼠标外设。更多关于Colibri iMX7的说明请参考Datasheet和Linux开发上手指南。

b). 为了测试iMX7 M4 SPI Slave,相应的需要一个SPI Master设备,这里使用Toradex 基于NXP iMX6 ARM处理器的Apalis iMX6 嵌入式模块配合Apalis Evaluation Board 作为SPI Master使用。连接默认调试串口UART1(载板X29)到开发主机方便调试。

c). Colibri iMX7 A7核心系统使用Toradex官方发布的Embedded Linux,更新方法请参考这里。

d). Apalis iMX6核心系统使用Toradex官方发布的Embedded Linux,更新方法请参考这里。

c). 由于本文演示示例使用到了SPI资源,Apalis iMX6和 Colibri iMX7 默认的SPI资源可以参考这里, Apalis iMX6使用SPI1相应管脚,Colibri iMX6使用Colibri默认的SPI管脚,因此需要硬件连接如下:

Apalis Evaluation Board X8 MXM3_221 -> Colibri Evaluation Board X10 SODIMM_88

Apalis Evaluation Board X8 MXM3_223 -> Colibri Evaluation Board X10 SODIMM_90

Apalis Evaluation Board X8 MXM3_225 -> Colibri Evaluation Board X10 SODIMM_92

Apalis Evaluation Board X8 MXM3_227 -> Colibri Evaluation Board X10 SODIMM_86

3). Colibri iMX7 M4核心FreeRTOS基本资料

a). Colibri iMX7 架构基本说明请参考如下:

https://developer.toradex.cn/knowledge-base/freertos-on-the-cortex-m4-of-a-colibri-imx7

b). 本示例中M4核心运行FreeRTOS v8系统,相关的源代码和sample程序请从下面git下载:

http://git.toradex.cn/cgit/freertos-toradex.git/

c). 基本的SDK配置和编译请参考如下:

https://developer.toradex.cn/knowledge-base/freertos-on-the-cortex-m4-of-a-colibri-imx7#Linux_support

d). 编译好的M4 firmware如何在Colibri iMX7上面加载运行请参考如下:

https://developer.toradex.cn/knowledge-base/freertos-on-the-cortex-m4-of-a-colibri-imx7#Running_a_Firmware_on_CortexM4

e). 几个自带的sample代码简单说明请参考如下:

https://developer.toradex.com/knowledge-base/freertos-on-the-cortex-m4-of-a-colibri-imx7#Examples

4). Colibri iMX7 M4核心FreeRTOS SPI Slave Mode示例驱动开发

a). 在上一章节中提到的iMX7 M4 FreeRTOS源代码中,已经包含SPI Interrupt/Polling两种模式的Master Mode驱动示例,但没有包含Slave Mode,因此这里我们需要自己创建,本文只演示基于Interrupt模式的Slave Mode驱动示例。

b). 首先先对 pin_mux 定义进行修改,添加SPI slave的管脚初始化代码

./ 文件为 freertos-toradex/examples/imx7_colibri_m4/ 路径下的pin_mux.h和pin_mux.c 文件,patch参考如下:

https://github.com/simonqin09/iMX7_M4_SPI_Slave_Driver/blob/master/pin_mux.patch

c). 然后在 FreeRTOS 源代码目录下 “v8/freertos-toradex/examples/imx7_colibri_m4/driver_examples/ecspi/ecspi_interrupt/” 创建 slave项目目录,项目包含文件如下:

./ hardware_init.c 文件,硬件初始化配置,具体内容参考如下:

https://github.com/simonqin09/iMX7_M4_SPI_Slave_Driver/blob/master/hardware_init.c

./ armgcc目录,用于编译,几乎和master项目下的armgcc文件是完全一样的,唯一就是修改了 CMakeLists.txt 文件中定义的 ProjectName 为 ecspi_interrupt_slave 以便于和 master 应用区分,具体文件内容可以参考如下:

https://github.com/simonqin09/iMX7_M4_SPI_Slave_Driver/tree/master/armgcc

./ main.c 文件,SPI interrupt slave的核心程序代码,具体内容和一些简单说明如下:

https://github.com/simonqin09/iMX7_M4_SPI_Slave_Driver/blob/master/main.c

// ECSPI_SlaveGetTransferStatus 函数用于标识传输完成

// ECSPI_SlaveConfig 函数用于初始化SPI slave模式的相关参数,使能相关中断,初始化发送寄存器等

// BOARD_ECSPI_HANDLER 函数用于处理中断,这里主要实现接收并保存收到的数据,同时向发送寄存器推送预存的数据

// main 函数为主函数,主要调用上面的初始化函数进行初始化,然后通过一个while循环将接收和发送的数据打印出来。

d). 对iMX7 M4 FreeRTOS代码进行debug的方法请参考这里,本文就不再赘述。

5). Colibri iMX7 M4 SPI Slave驱动示例部署

a). 在部署之前,首先需要确保将本文所使用的 SPI资源从 iMX7 A7 核心 Linux device tree中disable,以免发生资源冲突。有两种方法如下:

./ 参考这里下载A7 Linux kernel源代码,再参考这里修改device tree后重新编译部署。

./ 可以直接在uboot中通过 ”fdt_fixup” 环境变量来临时禁止

-----------------------------

/* set fdt_fixup variable with UARTB and SPI disable */

# setenv fdt_fixup ‘fdt_fixup=fdt addr ${fdt_addr_r} && fdt rm /soc/aips-bus@30800000/spba-bus@30800000/serial@30890000 && fdt rm /soc/aips-bus@30800000/spba-bus@30800000/ecspi@30840000’

-----------------------------

b). 对应的基于Apalis iMX6平台的SPI Master 使用基于Linux kernel自带的 spidev_test 应用来进行测试,部署如下:

./ linux kernel spidev_test 原始源代码请参考这里,为了测试方便,本文应用做了如下修改:

https://github.com/simonqin09/iMX7_M4_SPI_Slave_Driver/blob/master/spidev_test.patch

./ 参考这里的说明对 spidev_test.c 进行编译,生成 spidev_test 可执行程序,将程序复制到 Apalis iMX6模块准备后续使用。

c). 参考上面的相关文档或者之前的文章将SPI slave测试驱动的M4 firmware “ecspi_interrupt_slave.elf” 通过iMX7 uboot进行加载运行,本文通过tftp进行加载测试

------------------------------------------

Colibri iMX7 # tftp ${loadaddr} ecspi_interrupt_slave.elf

Using FEC0 device

TFTP from server 10.20.1.116; our IP address is 10.20.1.10

Filename 'ecspi_interrupt_slave.elf'.

Load address: 0x80800000

Loading: ##################################################  38.3 KiB

4.2 MiB/s

done

Bytes transferred = 39262 (995e hex)

Colibri iMX7 # bootaux ${loadaddr}

## Starting auxiliary core at 0x1FFF80D1 ...

------------------------------------------

d). SPI master和slave 数据传输测试

./ 首先上面的M4 firmware加载运行成功后,M4 调试串口打印信息如下:

------------------------------------------

-------------- ECSPI slave driver example --------------

This example application demonstrates usage of SPI driver in slave mode.

It responses to remote processor in SPI master mode.

SLAVE: Ready to transfer data with Master.

------------------------------------------

./ 然后在Apalis iMX6执行 spidev_test程序,iMX6 调试串口打印信息如下:

------------------------------------------

root@apalis-imx6:~# ./spidev_test_new -H -v

spi mode: 0x1

bits per word: 8

max speed: 500000 Hz (500 KHz)

TX | 01 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | FF __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

TX | 02 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | FE __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | �

TX | 03 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | FD __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | �

TX | 04 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | FC __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | �

TX | 05 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | FB __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | �

TX | 06 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | FA __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | �

TX | 07 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | F9 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | �

TX | 08 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | F8 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | �

TX | 09 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | F7 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | �

TX | 0A __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | F6 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | �

TX | 0B __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | F5 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | �

TX | 0C __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | F4 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | �

TX | 0D __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | F3 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | �

TX | 0E __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | F2 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | �

TX | 0F __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | F1 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | �

TX | 10 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | .

RX | F0 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | �

------------------------------------------

./ 此时 iMX7 M4 调试串口打印信息如下

------------------------------------------

SLAVE: Data transfer result:

Rx data:  0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F 0x10

Tx data:  0xFF 0xFE 0xFD 0xFC 0xFB 0xFA 0xF9 0xF8 0xF7 0xF6 0xF5 0xF4 0xF3 0xF2 0xF1 0xF0

------------------------------------------

./ 对比可以看到,M4 SPI slave 成功收到了 iMX6 SPI master发出的数据,同时也将预存的数据发送给了iMX6 SPI master,并且其也成功正确接收了。

7). 总结

本文简单示例了基于iMX7 M4 SPI Slave模式的驱动供参考。

NXP iMX7 M4 核心 SPI Slave 测试相关推荐

  1. NXP iMX8X M4核心SPI开发

    By Toradex胡珊逢 Colibri iMX8X 计算机模块上的处理器具有 Cortex-A35 和 Cortex-M4F.在  A35 上运行 Linux 操作系统, M4F 通常运行一个实时 ...

  2. NXP iMX7 异构双核心开发调试

    By Toradex秦海 1). 简介 在工业领域,很多时候会遇到实时任务和主控界面同时需要的场景,比如工业自动化的控制器等,通常情况下传统做法是分别使用两个独立的处理器,比如一个Cortex-M4 ...

  3. 基于NXP iMX7 ARM处理器部署FreeRTOS实时操作系统

    1). 简介 FreeRTOS是广泛使用的开源实时操作系统, 被众多芯片厂商包括NXP所支持, 本文就展示在NXP iMX7 ARM处理器上面的M4核心上面部署FreeRTOS. NXP iMX7 A ...

  4. stm32f103 spi slave从机模式miso需要上拉

    stm32f103t8u6 spi slave从机模式 miso管脚需要上拉电阻!! 测试了20K阻值的无效,2K有效!

  5. Esp32 spi slave配置

    最近有个项目是需要用到esp32来做spi slave从机的,主机给从机发送数据,不过相对来说这方面的介绍就比较少了,仅仅只有例程可供参考. 在esp32的SDK中有spi slave的例程,但是这里 ...

  6. 关于 printk() 对 spi slave 内核驱动程序的性能影响

    调试 imx6 的 spi slave 内核驱动,前期调试总免不了得要追一下寄存器的设置,过程函数的调用. 采用了 printk() 打印语句. 1.采用的硬件方法是: 分析 imx6 spi sla ...

  7. testbench常用任务之SPI slave输出数据

    模仿了SPI master从SPI slave读取数据的MiSO数据状态 每8个clk后读取的数据加1 用的一些额外寄存器需要自己声明和初始化 //-------------------------- ...

  8. ESP32 学习笔记(九)SPI - SPI Slave

    SPI Slave SPI Slave 概述 spi_slave 驱动 术语 SPI transactions 使用 spi_slave 驱动 传输数据和主/从机长度不匹配 限制.已知问题 应用示例 ...

  9. 使用 DS-MDK 开发 NXP iMX7

    1). 简介 NXP  i.MX7 处理器是一款具有 Cortex-A7 和 M4 的异构多核处理器.A7能够运行 Linux 等操作系统,完成GUI.网络.文件管理和算法运算等复杂任务,而 M4 则 ...

最新文章

  1. SharePoint 工作流解决方案(一):顺序工作流和状态机工作流
  2. 心系AI的百度,这次能翻身吗?
  3. Symantec Backup Exec System Recovery简明安装手册
  4. 工程制图 (点,线,面)
  5. mysql句柄是什么_MySQL与句柄
  6. win7系统字体模糊发虚不清晰的解决方法
  7. dry的原理_速干面料的原理
  8. [No000014]听说不背单词,考英语会是这种下场-我们为什么必须背单词?
  9. 使用maven打包项目执行clean时报错clean报错Failed to clean project
  10. c语言中结构体习题,C语言之结构体练习题
  11. 机械加工工艺师手册_这些机械加工工艺,你见过吗?
  12. android 菜鸟面单打印_android studio 菜鸟实战项目 之 spnner实现
  13. woff文件 服务器上找不到,字体文件未找到错误:IIS服务器上部署svg/woff/woff2字体 MIMe类型配置...
  14. linux 汇编 preserve8,ARM汇编伪指令
  15. 为李想打call,谋局汽车,美团王兴的外卖终极战竟在这里
  16. 如何使用Origin制作XRD图
  17. Django Lazy LazyObject
  18. 计网——(数据报与虚电路)
  19. 67.220.91.30/forum/index.php,Burp辅助插件之WooyunSearch 乌云漏洞库payload
  20. App推广方式:怎样有效找渠道、引流

热门文章

  1. win10系统CompatTelRunner或task scheduler占用CPU过高的解决方法
  2. 为什么谐振时电抗为0_调频串并联谐振交流耐压试验装置组成及参数
  3. 解决thinkphp6读取sqlserver报Microsoft[SQL Server]对象名 ‘information_schema.tables‘ 无效错误
  4. 如何开启“轻松访问菜单Easy Access Menu”
  5. Centos 7 磁盘管理(LVM)
  6. java常用类库以及集合
  7. 什么是栈溢出和堆溢出
  8. 合唱英文影视组歌《Star Sky》星空——英译汉
  9. 玩转k8s:Pod详解
  10. Xilinx BRAM IP介绍