嵌入式进阶之关于SPI通信的案例分享——基于全志科技T3与Xilinx Spartan-6处理器
本文主要介绍基于全志科技T3与Xilinx Spartan-6的通信案例。
适用开发环境:
Windows开发环境:Windows 7 64bit、Windows 10 64bit
Linux开发环境:Ubuntu18.04.4 64bit
虚拟机:VMware15.1.0
U-Boot:U-Boot-2014.07
Kernel:Linux-3.10.65
LinuxSDK:LinuxSDK_AA_BB_CC_DD(基于T3_LinuxSDK_V1.3_20190122)
评估板硬件资源图解2
1.1案例说明
本案例主要演示全志科技T3(ARM Cortex-A7)与Xilinx Spartan-6(FPGA)处理器之间的SPI通信,采用了创龙科技TLT3-EVM作为评估底板,是一款基于全志科技T3处理器设计的4核ARM Cortex-A7高性能低功耗国产评估板,每核主频高达1.2GHz,由核心板和评估底板组成。
案例源码位于“4-软件资料\Demo\platform-demos\spi_rw\”目录下,具体目录结构说明如下:
文件夹 |
说明 |
|
bin |
ARM端可执行文件 |
|
driver |
boot_package |
boot_package.fex镜像文件 |
dts |
设备树源文件,新增spidev节点,支持与FPGA进行SPI通信 |
|
src |
ARM端案例源码 |
|
bram_spi |
FPGA端程序 |
表1
(1)FPGA端程序实现SPI Slave功能,具体如下:
- FPGA将SPI Master发送的2KByte数据保存到BRAM。
- SPI Master发起读数据时,FPGA从BRAM读取2KByte通过SPI总线传输给SPI Master。
(2)ARM实现SPI Master功能,支持误码率测试和速率测试两种模式,具体如下:
- 误码率测试:ARM通过SPI总线写入2KByte随机数到FPGA BRAM,然后读出数据、进行数据校验,同时打印SPI总线读写速率和误码率。
- 读写速率测试:ARM通过向FPGA发送4KByte随机数,并读取回来。根据命令行传入的参数循环多次,仅测试读写速率,不进行数据检验。每隔5秒钟程序将会打印一次读写平均速率。
(3)本案例使用的设备树源文件为"driver\dts\"目录下的tlt3-evm-spidev.dts。该设备树源文件基于LinuxSDK开发包内核源码中的tlt3-evm.dts设备树进行修改,具体如下所示。
- 关闭SPI FLASH节点。
- 新增spidev0驱动配置,用于生成"/dev/spidev0.0"设备节点,为应用层提供SPI的配置和读写数据的接口。
1.2案例测试
1.2.1硬件连接
由于评估底板拓展接口未预留SPI总线引脚,因此需参考如下方法进行飞线,并且应尽可能使用短线连接。
(1)将评估底板SPI FLASH芯片空贴,并将空贴后的引脚1(SPI CS)、2(SPI MISO)、5(SPI MOSI)、6(SPI CLK)通过飞线引出。
(2)将SPI FLASH飞线引出的引脚与创龙科技TL-HSAD-LX采集卡的拓展接口(KJ2)按照下表对应关系进行连接。
SPI FLASH |
TL-HSAD-LX拓展接口 |
CLK(PIN 6) |
PIN 2 |
CS(PIN 1) |
PIN 4 |
DI(IO0)(PIN 5) |
PIN 6 |
DO(IO1)(PIN 2) |
PIN 8 |
表2
(3)将评估底板EXPORT(J14)拓展接口的第12引脚(GND)连接至TL-HSAD-LX采集卡拓展接口(KJ13)的第1引脚,进行共地。
1.2.2读写功能测试
将案例bin目录下的可执行文件spi_rw、"driver\boot_package\"目录下的boot_package.fex镜像拷贝至评估板文件系统任意目录下。TL-HSAD-LX采集卡上电启动,加载或固化"bram_spi\bin\"目录下的程序可执行文件。
评估板上电启动,在评估板文件系统boot_package.fex文件所在路径下,执行如下:
命令替换原来的固件,并重启评估板。
Target#dd if=boot_package.fex of=/dev/mmcblk1 seek=32800
Target#dd if=boot_package.fex of=/dev/mmcblk1 seek=24576
Target#sync
Target#reboot
评估板重启后,执行如下命令查看新生成的spidev设备节点。
Target# ls /dev/spidev0.0
执行如下命令查询程序命令参数。
Target# ./spi_rw -h
执行如下命令运行程序,ARM通过SPI总线写入2KByte随机数到FPGA BRAM,然后读出数据、进行数据校验,同时打印SPI总线读写速率和误码率,如下图所示。
Target# ./spi_rw -d /dev/spidev0.0 -s 5000000 -OH -S 2048
参数解析:
-d:指定设备节点;
-s:指定通信时钟频率(Hz);
-O:时钟极性反转(CPOL=1);
-H:下降沿采集数据(CPHA=1);
-S:指定传输数据大小。
本次测试指定SPI总线通信时钟频率为5MHz,则理论通信速率为:(5000000/1024/1024/8)MB/s≈0.596MB/s。从上图可见,本次测得写速率为0.531MB/s,读速率为0.576MB/s,误码率为0。
备注:由于本案例硬件采用飞线方式进行连接,如设置SPI总线通信时钟频率超过5MHz,可能会出现误码现象。
1.2.3读写性能测试
执行如下命令运行程序,ARM通过向FPGA发送4096Byte随机数据,并从FPGA读取回来,循环50000次,测试SPI总线读写速率,不进行数据检验。串口终端每隔5秒钟会打印一次读写平均速率,如下图所示。
Target# ./spi_rw -d /dev/spidev0.0 -s 80000000 -OH -S 4096 -c 50000
参数解析:
-d:指定设备节点;
-s:指定通信时钟频率(Hz);
-O:时钟极性反转(CPOL=1);
-H:下降沿采集数据(CPHA=1);
-S:指定传输数据大小;
-c:指定测试循环次数。
根据官方数据手册(如下图),SPI总线通信时钟频率理论值最大为100MHz。但由于当前驱动程序原因,最高可设置为80MHz。本次测试指定SPI总线通信时钟频率为80MHz,则理论速率为:(80000000/1024/1024/8)MB/s≈9.54MB/s。从上图可知,每隔5秒钟程序将会打印一次读写平均速率,以最后一次打印的平均速率为例,读写速率为:(38790.8/1024/8)MB/s≈4.74MB/s。
同时测得进行SPI读写速率测试时,CPU的占用率约为8%,如下图所示。
1.3案例编译
1.3.1ARM端设备树编译
将案例"driver\dts\"目录下tlt3-evm-spidev.dts设备树拷贝至LinuxSDK开发包内核源码"arm/arm/boot/dts/"目录下,替换并重命名为tlt3-evm.dts。
请按照《Linux系统使用手册》文档编译Linux内核、设备树等,并重新执行"./build.sh pack"命令,将会在"tools/pack/out/"目录下生成新的boot_package.fex镜像。将其拷贝至评估板文件系统进行固化,评估板重启后将会加载新的设备树文件,生成"/dev/spidev0.0"设备节点。
1.3.2 ARM端程序编译
将案例src目录下的ARM端程序源码拷贝至Ubuntu工作目录,请先参照Linux系统使用手册安装、编译LinuxSDK,构建适配评估板的GCC编译器。进入ARM端程序源码目录,执行如下命令进行编译。
Host# CC=/home/tronlong/T3/lichee/out/sun8iw11p1/linux/common/buildroot/host/usr/bin/arm-linux-gnueabihf-gcc make
1.4ARM端程序关键代码
(1)打开SPI设备。
(2)配置SPI总线。
(3)误码率测试(single_test)和读写速率测试(multiple_test)功能实现。
图 18
如需获取更多关于创龙科技TLT3-EVM的完整开发资料或有相关疑问,可在评论区留言,感谢您的关注!
嵌入式进阶之关于SPI通信的案例分享——基于全志科技T3与Xilinx Spartan-6处理器的更多相关文章
- 基于FPGA的光口通信开发案例|基于Kintex-7 FPGA SFP+光口的10G UDP网络通信开发案例
前言 自著名华人物理学家高锟先生提出"光传输理论",实用化的光纤传输产品始于1976年,经历了PDH→SDH→DWDM→ASON→MSTP的发展历程.本世纪初期,ASON/OADM ...
- 嵌入式开发之hi3516---GV7601 SPI通信问题
http://blog.csdn.net/qq_29350001/article/details/52669964 http://blog.csdn.net/zqj6893/article/detai ...
- Scala进阶之路-Spark底层通信小案例
Scala进阶之路-Spark底层通信小案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spark Master和worker通信过程简介 1>.Worker会向ma ...
- OLED的波形曲线、进度条、图片显示(STM32 HAL库 模拟SPI通信 5线OLED屏幕)详细篇
少废话,先上效果图 屏幕显示效果 全家福 一.基础认识及引脚介绍 屏幕参数: 尺寸:0.96英寸 分辨率:128*64 驱动芯片:SSD1306 驱动接口协议:SPI 引脚说明: 二. ...
- 理解一下单片机的I2C和SPI通信
应某位网友要求,今天说一下单片机的I2C SPI通信,可能说不清楚,因为这毕竟要做实验才可完全理解. I2C和SPI是两种不同的通信协议. 听到协议,似乎高不可攀,其实协议就是人们定义的一个标准而已, ...
- SPI通信实验---verilog(FPGA作为从机,使用可读可写)
本实验讲究实用性,故设计思想为:主机先向从机发送地址,若是向从机写入数据,则向从机发送数据,若是读取从机数据,则向从机发送时钟,然后在时钟下降沿读取数据即可.cs信号上升沿作为SPI通信的结束信号.r ...
- 嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度
嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度 上一篇笔记介绍了一些绕开排程器(或调度程序,scheduler)来进行时间管理的一些小方法.这一篇详细介绍RTX的任务调度原理. RTX主要有 ...
- SPI通信
SPI是由Motorola公司提出的一种同步串行外围接口:它在速度要求不高,低功耗,需要保存少量参数的智能化传感系统中得到了广泛应用: SPI是一个全双工的同步串行接口,在数据传输过程中,总线上只能是 ...
- 关于SPI通信原理与程序实现
第一次接触SPI是因为当时用到NRF24L01,需要用SPI进行通信.因为2401上面写着MOSI.MISO.SS.RST,当时以为只要用到SPI就肯定有这几个引脚,以至于限制了自己的思维.只认识MI ...
- Java进阶(四十七)Socket通信
Java进阶(四十七)Socket通信 今天讲解一个 Hello Word 级别的 Java Socket 通信的例子.具体通讯过程如下: 先启动Server端,进入一个死循环以便一直监听某端口是 ...
随机推荐
- 一则current日志损坏的数据库恢复实例,隐藏参数的使用
场景 之前写了一篇文章,是redo日志全部丢失的情况下,数据库实例恢复的方式.但是,这次特殊在,实例恢复失败的情况下.非常规打开数据库(数据库已经不一致了,但是可以通过expdp导出,导出重要的数据) ...
- MinDoc 编译安装(linux环境)
目录 MinDoc 简介 项目地址: 下面以 Linux 系统为例: Gomod方式安装 下载项目代码到本地 写入依赖 下载依赖 创建数据库 配置数据库 编译main.go 提升文件权限 初使化数据库 ...
- 异构数据源同步之数据同步 → datax 改造,有点意思
开心一刻 去年在抖音里谈了个少妇,骗了我 9 万 后来我发现了,她怕我报警 她把她表妹介绍给我 然后她表妹又骗了我 7 万 DataX DataX 是什么,有什么用,怎么用 不做介绍,大家自行去官网( ...
- 【U8】 生产订单下bom 提示 “遇到以0做除数错误”错误
一个虚拟件子件的子件为无换算率存货,bom中对应的换算率.辅助基本用量为0,修改为null后正常. 对应 bom_opcomponent表的 ChangeRate 换算率 AuxBaseQtyN 辅助 ...
- 深入解析LinkedHashMap
LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序. ...
- SQLServer如何监控阻塞会话
一.查询阻塞和被阻塞的会话 SELECT r.session_id AS [Blocked Session ID], r.blocking_session_id AS [Blocking Sessio ...
- 云原生时代的"应用级"多云管理
作者:张齐 当前云计算有多种形态公有云.私有云.边缘云.虚拟机等,如何高效管理多云是当前面临的问题,在云原生时代,又该如何利用云原生技术实现多云管理?本文将讲解通过 Rainbond实现"应 ...
- itest(爱测试) 4.5.5 发布,开源BUG 跟踪管理 & 敏捷测试管理&极简项目管理软件
itest 简介 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理4合1,又有丰富的统计分析.可按测试包分配测试用例执行,也可建测试迭代(含任务, ...
- Mysql 创建索引语句
mysql有哪些索引 index 普通索引 alter table table_name add index index_name(column) 最基本的索引,没有任何限制 primary key ...
- webpack externals忽略不打入的包
例如项目中使用从 CDN 引入 jQuery,而不是把它打包进来使用 import $ from 'jquery' webpack.config.js externals: { jquery: 'jQ ...