全国产T3+FPGA的SPI与I2C通信方案分享

近年来,随着中国新基建、中国制造2025规划的持续推进,单arm处理器越来越难胜任工业现场的功能要求,特别是如今能源电力、工业控制、智慧医疗等行业,往往更需要arm + fpga架构的处理器平台来实现例如多路/高速ad采集、多路网口、多路串口、多路/高速并行di/do、高速数据并行处理等特定功能,因此arm + fpga架构处理器平台愈发受市场欢迎。
因此,创龙科技一年前正式推出了国产化率100%的arm + fpga工业核心板,它基于全志t3 + 紫光同创logos处理器设计。
全志t3为准车规级芯片,四核arm cortex-a7架构,主频高达1.2ghz,支持双路网口、八路uart、sata大容量存储接口,同时支持4路显示、gpu以及1080p h.264视频硬件编解码。另外,创龙科技已在t3平台适配国产嵌入式系统翼辉sylixos,真正实现软硬件国产化。
紫光同创logos pgl25g/pgl50g fpga在工业领域应用广泛,逻辑资源分别为27072/51360,与国外友商产品pin to pin兼容,主要用于多通道/高速ad采集或接口拓展。因其价格低、质量稳定、开发环境易用等优点,受到工业用户的广泛好评。尤其是开发环境,最快3天可完成从国外友商产品到紫光同创产品的切换。
图1 arm + fpga典型应用场景
spi通信优势与应用场景
spi(serial peripheral interface)是一种用于串行数据传输的通信协议,spi通信具有带宽高、实时性强、传输速度快、连接简单、可靠性高和灵活性强等优势。
spi协议适用于许多嵌入式系统和外围设备之间的通信需求,可提供快速、可靠和灵活的数据传输,非常适合“小数据-低时延”和“大数据-高带宽”的应用场景。
图2 spi通信总线
i2c通信优势和应用场景
i2c(inter-integrated circuit)是一种串行双向通信协议,i2c通信具有硬件资源需求低、简单灵活、可靠性高和支持多种设备类型等优势。
i2c协议可提供简单、可靠和灵活的数据传输。它广泛应用于各种传感器、存储设备、显示设备和通信模块等领域。适用控制命名传输和系统配置的应用场景。
图3 i2c通信总线
国产t3 + fpga的spi与i2c通信方案介绍
本章节主要介绍全志科技t3与紫光同创logos基于spi、i2c的arm + fpga通信方案,使用的硬件平台为:创龙科技tlt3f-evm工业评估板。
i2c通信案例
案例功能:
实现t3(arm cortex-a7)与fpga的twi(i2c)通信功能。
fpga案例源码为“4-软件资料demofpga-demoi2c_slave”,实现i2c slave功能,并内置用户可读写寄存器、led寄存器、key寄存器。
arm端作为i2c master,可通过twi(i2c)总线读写fpga端用户可读写寄存器0x00、led写寄存器0x01(写1则点亮fpga端led,写0则熄灭),以及查看key寄存器0x02检测fpga端用户输入按键状态。
案例测试:评估板上电,请先加载运行fpga端可执行程序。执行如下命令可查看到i2c总线上的挂载设备,其中0x2a为fpga端i2c slave的地址。
target#echo 1 4 1 7 > /proc/sys/kernel/printk //屏蔽内核printk打印,避免i2c驱动扫描找不到设备时打印警告信息
target#i2cdetect -r -y 0
图4
执行如下命令,读写fpga端用户可读写寄存器0x00。
target#i2cset -f -y 0 0x2a 0x00 0x55 //往寄存器0x00写0x55
target#i2cget -f -y 0 0x2a 0x00 //读取寄存器0x00,值为0x55
图5
执行如下命令,写fpga端led寄存器0x01,实现对fpga端用户可编程指示灯控制。
target#i2cset -f -y 0 0x2a 0x01 0xc0 //往led寄存器0x01写0xc0,点亮fpga端led3、led4
target#i2cset -f -y 0 0x2a 0x01 0x00 //往led寄存器0x01写0x00,熄灭fpga端led3、led4
图6
执行如下命令,读fpga端key寄存器0x02,实现对fpga端用户输入按键的状态检测。
target#i2cget -f -y 0 0x2a 0x02 //读取key寄存器0x02,值为0xe0
图7
请按下fpga端用户输入按键key7并保持按下状态,再执行如下命令。
target#i2cget -f -y 0 0x2a 0x02 //读取key寄存器0x02,值为0xc0
图8
请按下fpga端用户输入按键key8并保持按下状态,再执行如下命令。
target#i2cget -f -y 0 0x2a 0x02 //读取key寄存器0x02,值为0xa0
图9
请按下fpga端用户输入按键key9并保持按下状态,再执行如下命令。
target#i2cget -f -y 0 0x2a 0x02 //读取key寄存器0x02,值为0x60
图10
基于linux的spi通信案例
案例功能:基于linux系统,实现t3(arm cortex-a7)与fpga的spi通信功能。
arm端案例源码为“4-软件资料demomodule-demosspi_rw”,实现spi master功能,具体如下:
(1)打开spi设备节点,如:/dev/spidev0.1。
(2)使用ioctl配置spi总线,如spi总线极性和相位、通信速率、数据长度等。
(3)选择模式为单线模式或双线模式。当设置spi总线为双线模式时,发送数据为单线模式,接收数据为双线模式。
(4)发送数据至spi总线,以及从spi总线读取数据。
校验数据,然后打印读写速率、误码率。
fpga端案例源码为“4-软件资料demofpga-demosdram_spi”和“4-软件资料demofpga-demosdram_spi_dual”,实现spi slave功能,具体说明如下:(1)将spi master发送的数据保存至dram。(2)spi master发起读数据时,fpga从dram读取数据通过spi总线传输至spi master。当spi总线为双线模式时,接收数据支持双线模式,而发送数据仅支持单线模式。
图11 
arm端程序流程图
案例测试:
评估板上电,请先加载运行fpga端可执行程序,若进行spi单线模式测试,请运行案例dram_spibin目录下的程序可执行文件;若进行spi双线模式测试,请运行dram_spi_dualbin目录下的程序可执行文件。同时将arm端可执行程序spi_rw拷贝至评估板文件系统任意目录下。
进入评估板文件系统,执行如下命令查看新生成的spidev设备节点。
target#ls /dev/spidev0.1
图12
执行如下命令查询程序命令参数。
target#./spi_rw -h
图13
1 spi单线模式
1.1 功能测试
执行如下命令运行程序,arm通过spi总线写入1kbyte随机数据至fpga dram,然后读出数据、进行数据校验,同时打印spi总线读写速率和误码率,最终实测写速率为2.405mb/s,读速率为2.405mb/s,误码率为0。如下图所示。
target#./spi_rw -d /dev/spidev0.1 -s 50000000 -oh -m 1 -s 1024 -c 2
参数解析:
-d:设备节点;
-s:设置通信时钟频率(hz),本次测试设置spi总线通信时钟频率为50mhz,则spi单线模式理论通信速率为:(50000000 / 1024 / 1024 / 8)mb/s ≈ 5.96mb/s;
-o:空闲状态时,sclk为高电平(cpol=1);
-h:从第二个跳变沿开始采样(cpha=1);
-m:选择模式传输模式(1表示单线模式,2表示双线模式);
-s:设置传输数据大小,单位为byte;
-c:循环传输数据包的次数。
图14
1.2 性能测试
(1)基于50mhz时钟频率
执行如下命令运行程序,基于50mhz时钟频率、增大读写数据量测试spi总线最高传输速率。arm通过spi总线写入1mbyte随机数据至fpga dram,然后读出数据,不做数据检验,最后打印spi总线读写速率和误码率,如下图所示。
备注:本案例设计一次读写1kbyte随机数据至fpga dram,因此误码率较高。
target#./spi_rw -d /dev/spidev0.1 -s 50000000 -oh -m 1 -s 1048576 -c 2
图15
本次测试设置spi总线通信时钟频率为50mhz,则spi单线模式理论通信速率为:(50000000 / 1024 / 1024 / 8)mb/s ≈ 5.96mb/s。从上图可知,本次实测写速率为5.757mb/s,读速率为5.757mb/s,接近理论通信速率。
本次测试spi使用了dma传输,测得cpu的占用率约为1%,如下图所示。
图16
(2)基于100mhz时钟频率
执行如下命令运行程序,测试基于100mhz时钟频率的spi单线模式的最高通信带宽。arm通过spi总线写入1mbyte随机数据至fpga dram并读出数据,不做数据检验,最后打印spi总线读写速率和误码率,如下图所示。
备注:本次测试旨在测试spi的最高传输速率,目前spi速率最大支持50mhz时钟频率,当时钟频率配置到最大100mhz时速率会出现时序问题,现象是整体往右移了1bit。例如发送10000000,实际接收到01000000,并在测试中出现误码。
target#./spi_rw -d /dev/spidev0.1 -s 100000000 -oh -m 1 -s 1048576 -c 100
图17
根据官方数据手册(如下图),spi总线通信时钟频率理论值最大为100mhz。本次测试设置spi总线通信时钟频率为最大值100mhz,则spi单线模式理论速率为:(100000000 / 1024 / 1024 / 8)mb/s ≈ 11.92mb/s。从上图可知,在100mhz下实测spi单线模式写速率为:11.331mb/s,spi单线模式读速率为:11.331mb/s,接近理论通信速率。
图18
本次测试spi使用了dma传输,测得cpu的占用率约为1%,如下图所示。
图19
2 spi双线模式
2.1 功能测试
执行如下命令运行程序,arm通过spi总线写入1kbyte随机数据至fpga dram,然后读出数据、进行数据校验,同时打印spi总线读写速率和误码率,如下图所示。
target#./spi_rw -d /dev/spidev0.1 -s 50000000 -oh -m 2 -s 1024 -c 1
参数解析:
-d:设备节点;
-s:设置通信时钟频率(hz),本次测试设置spi总线通信时钟频率为50mhz,则spi双线模式理论通信速率为:(50000000 / 1024 / 1024 / 4)mb/s ≈ 11.92mb/s;
-o:空闲状态时,sclk为高电平(cpol=1);
-h:从第二个跳变沿开始采样(cpha=1);
-m:选择模式传输模式(1表示单线模式,2表示双线模式);
-s:设置传输数据大小,单位为byte;
-c:循环传输数据包的次数。
图20
从上图可知,本次实测写速率为2.577mb/s,读速率为5.222mb/s,误码率为0。
2.2 性能测试
(1)基于50mhz时钟频率
执行如下命令运行程序,基于50mhz时钟频率、增大读写数据量测试spi总线最高传输速率。arm通过spi总线写入1mbyte随机数据至fpga dram,然后读出数据,不做数据检验,最后打印spi总线读写速率和误码率,最终本次实测写速率为5.892mb/s,读速率为11.365mb/s。如下图所示。
备注:本案例设计一次读写1kbyte随机数据至fpga dram,因此误码率较高。
target#./spi_rw -d /dev/spidev0.1 -s 50000000 -oh -m 2 -s 1048576 -c 1
图21
本次测试设置spi总线通信时钟频率为50mhz,则spi单线模式理论通信速率为:(50000000/1024/1024/8)mb/s ≈ 5.96mb/s;spi双线模式理论通信速率为:(50000000 / 1024 / 1024 / 4)mb/s ≈ 11.92mb/s。
本次测试spi使用了dma传输,测得cpu的占用率约为0%,如下图所示。
图22
(2)基于100mhz时钟频率
执行如下命令运行程序,测试基于100mhz时钟频率的spi双线模式的最高通信带宽。arm通过spi总线写入1mbyte随机数据至fpga dram并读出数据,不做数据检验,最后打印spi总线读写速率和误码率,最终在100mhz下实测spi双线模式写速率为:11.684mb/s,spi双线模式读速率为:23.432mb/s。如下图所示。
备注:本次测试旨在测试spi的最高传输速率,目前spi速率最大支持50mhz时钟频率,当时钟频率配置到最大100mhz时速率会出现时序问题,现象是整体往右移了1bit。例如发送10000000,实际接收到01000000,并在测试中出现误码。
target#./spi_rw -d /dev/spidev0.1 -s 100000000 -oh -m 2 -s 1048576 -c 100
图23
根据官方数据手册(如下图),spi总线通信时钟频率理论值最大为100mhz。本次测试设置spi总线通信时钟频率为最大值100mhz,则spi单线模式理论通信速率为:(100000000/1024/1024/8)mb/s ≈ 11.92mb/s;spi双线模式理论速率为:(100000000 / 1024 / 1024 / 4)mb/s ≈ 23.84mb/s。
图24
本次测试spi使用了dma传输,测得cpu的占用率约为0%,如下图所示。
图25
基于linux-rt的spi通信案例
案例功能:基于linux-rt实时系统,演示t3(arm cortex-a7)与fpga之间的spi通信功能。本案例通信数据量少、带宽低,但实时性高,适用于对通信带宽要求不高,但通信实时性有严格要求的工控场合。
arm端案例源码为“4-软件资料demomodule-demosrt_spi_rw”,实现spi master功能,具体如下:
(1)打开spi设备节点。如:/dev/spidev0.1。
(2)使用ioctl配置spi总线。如spi总线极性和相位、通信速率、数据字长度等。
(3)创建实时线程。
(4)发送数据至spi总线,以及从spi总线读取数据。
(5)打印发送、接收的速率和传输耗时。
校验数据,然后打印读写速率、误码率。
fpga端案例源码为“4-软件资料demofpga-demosdram_spi”,实现spi slave功能,具体如下:(1)将spi master发送的数据保存至dram。spi master发起读数据时,fpga从dram读取数据并通过spi总线传输至spi master。
图26 
arm端程序流程图
案例测试:由于我司默认使用是的linux内核,因此需参考linux系统使用手册文档中的“替换内核、内核模块”章节将linux系统启动卡替换为linux-rt系统。
评估板上电,请先加载运行fpga端可执行程序。将arm端可执行文件rt_spi_rw拷贝至评估板文件系统任意目录下,执行如下命令,查看新生成的spidev设备节点。
target#ls /dev/spidev0.1
图27
执行如下命令,查询程序命令参数。
target#./rt_spi_rw -h
图28
1 非轮询方式
执行如下命令运行程序,arm通过spi总线写入随机数据至fpga dram,然后读出数据、进行数据校验,同时打印spi总线读写速率、传输耗时和误码率,最终实测最小耗时为44us,最大耗时为167us,平均耗时为48us;写速率为0.076mb/s,读速率为0.076mb/s,误码率为0。如下图所示。
target#./rt_spi_rw -d /dev/spidev0.1 -s 50000000 -oh -s 4 -c 1024
参数解析:
-d:设备节点;
-s:设置通信时钟频率(hz),本次测试设置spi总线通信时钟频率为50mhz,则理论通信速率为:(50000000 / 1024 / 1024 / 8)mb/s ≈ 5.96mb/s;
-o:空闲状态时,sclk为高电平(cpol=1);
-h:从第二个跳变沿开始采样(cpha=1);
-s:设置传输数据大小,单位为byte;
-c:循环传输数据包的次数。
图29
2 轮询方式
执行如下命令运行程序,arm通过spi总线写入4byte随机数据至fpga dram,读出数据、进行数据校验,同时打印spi总线读写速率、传输耗时和误码率,最终实测最小耗时为27us,最大耗时为152us,平均耗时为30us;写速率为0.118mb/s,读速率为0.118mb/s,误码率为0。如下图所示。
target#./rt_spi_rw -d /dev/spidev0.1 -s 50000000 -ohp -s 4 -c 1024
参数解析:
-d:设备节点;
-s:设置通信时钟频率(hz),本次测试设置spi总线通信时钟频率为50mhz,则理论通信速率为:(50000000 / 1024 / 1024 / 8)mb/s ≈ 5.96mb/s;
-o:空闲状态时,sclk为高电平(cpol=1);
-h:从第二个跳变沿开始采样(cpha=1);
-p:spi发送端采用轮询方式(每次发送数据量≤64byte);
-s:设置传输数据大小,单位为byte;
-c:循环传输数据包的次数。
图30


TiFlash整体模块分层及DeltaTree 引擎优化方案
配置PROFINET IO设备
区块链公有链系统Algorand介绍
什么是零样本学习?为什么要搞零样本学习?
盘点AI领域的10大丰功伟绩 征服世人不在话下
全国产T3+FPGA的SPI与I2C通信方案分享
光学心率传感器技术在可穿戴设备中的新兴医疗应用
Autodesk发表智能制造云端服务 聚焦资料/程序与实时存取
通用充电连接器或将会阻碍创新,并造成大量浪费
AMD和NVIDIA哪个好?TITAN X和AMD Pro Duo谁才是显卡之王?传说中的AMD Vega织女星到底有多强?
3D模型告诉你WiFi信号长什么样
可穿戴设备的无线锂离子充电器解决方案
用三个角度来分析基于COB技术的LED的散热性能
展会聚焦 | 绿色制造创新驱动制药行业升级 罗克韦尔自动化参展第63届秋季药机博览会
《振南电子STM32视频教程》第十三讲:CAN总线
ROS Motion Planning运动规划库如何安装相关依赖
干货分享丨超详细的200G QSFP56光模块知识
汽车连接器的可靠性检验
GGII:2022年7月份国内动力电池装机量情况
电池技术及产品的技术研发及测试