EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
近年来,随着中国新基建、[color=var(--weui-LINK)][url=]中国制造2025[/url]规划的持续推进,单 ARM处理器越来越难胜任工业现场的功能要求,特别是如今能源电力、工业控制、智慧医疗等行业,往往更需要ARM + FPGA架构的处理器平台来实现例如多路/高速AD采集、多路网口、多路串口、多路/高速并行DI/DO、高速数据并行处理等特定功能,因此ARM + FPGA架构处理器平台愈发受市场欢迎。 + }. C5 F# j0 F3 c" X
因此,创龙科技一年前正式推出了国产化率100%的ARM + FPGA工业核心板,它基于全志T3 + 紫光同创Logos处理器设计。
* X! P9 ]0 T" h+ ]5 V2 a& B* R6 Z2 R* c6 v
全志T3为准车规级芯片,四核ARM Cortex-A7架构,主频高达1.2GHz,支持双路网口、八路UART、SATA大容量存储接口,同时支持4路显示、GPU以及1080P H.264视频硬件编解码。另外,创龙科技已在T3平台适配国产 嵌入式系统翼辉[color=var(--weui-LINK)][url=]SylixOS[/url],真正实现软硬件国产化。
+ i* f3 F, e$ I( k {$ A
紫光同创Logos PGL25G/PGL50G FPGA在工业领域应用广泛,逻辑资源分别为27072/51360,与国外友商产品pin to pin兼容,主要用于多通道/高速AD采集或接口拓展。因其价格低、质量稳定、开发环境易用等优点,受到工业用户的广泛好评。尤其是开发环境,最快3天可完成从国外友商产品到紫光同创产品的切换。 3 S8 Q" _/ n1 Y4 ^7 V0 z. ^
图1 ARM + FPGA典型应用场景
4 r/ X, u& x5 HSPI通信优势与应用场景 SPI(Serial Peripheral Inte RFace)是一种用于串行数据传输的通信协议,SPI通信具有带宽高、实时性强、传输速度快、连接简单、可靠性高和灵活性强等优势。
/ x3 M- X- I, E4 H! H) g
SPI协议适用于许多嵌入式系统和外围设备之间的通信需求,可提供快速、可靠和灵活的数据传输,非常适合“小数据-低时延”和“大数据-高带宽”的应用场景。
0 m7 Z- B# A1 ~5 J0 f& q
图2 SPI通信总线/ N$ h9 H9 M. B( c. |
I2C通信优势和应用场景 I2C(Inter-Integrated Circuit)是一种串行双向通信协议,I2C通信具有硬件资源需求低、简单灵活、可靠性高和支持多种设备类型等优势。
* f5 s. D: C; Q7 F
I2C协议可提供简单、可靠和灵活的数据传输。它广泛应用于各种传感器、存储设备、显示设备和通信模块等领域。适用控制命名传输和系统配置的应用场景。
' `* H. _$ ?7 I- y7 Z7 k 图3 I2C通信总线
# A) U) m; g( C( F
1 @ n& a- v. `& e+ q( U7 W9 c
国产T3 + FPGA的SPI与I2C通信方案介绍 本章节主要介绍全志科技T3与紫光同创Logos基于SPI、I2C的ARM + FPGA通信方案,使用的硬件平台为:创龙科技TLT3F-EVM工业评估板。I2C通信案例案例功能:实现T3(ARM Cortex-A7)与FPGA的TWI(I2C)通信功能。
* p- J! W+ u% T( mFPGA案例源码为“4-软件资料\Demo\fpga-demo\i2c_slave”,实现I2C Slave功能,并内置用户可读写寄存器、LED寄存器、KEY寄存器。
3 V- @' e! E- m) }0 Q+ BARM端作为I2C Master,可通过TWI(I2C)总线读写FPGA端用户可读写寄存器0x00、LED写寄存器0x01(写1则点亮FPGA端LED,写0则熄灭),以及查看KEY寄存器0x02检测FPGA端用户输入按键状态。9 ~/ ^7 i% O+ m- s7 p8 H+ d
案例测试:评估板上电,请先加载运行FPGA端可执行程序。执行如下命令可查看到I2C总线上的挂载设备,其中0x2a为FPGA端I2C Slave的地址。
9 M* W4 t. j& q+ H/ z% t( K
Target#echo "1 4 1 7" > /proc/sys/kernel/printk //屏蔽内核printk打印,避免I2C驱动扫描找不到设备时打印警告信息 Target#i2cdetect -r -y 0 % ?- ^0 Z* C% d. g
图4
, C) o _% l! O; Y. A, u1 U% x执行如下命令,读写FPGA端用户可读写寄存器0x00。 + {! D! D' U' q- u$ o/ ]
Target#i2cset -f -y 0 0x2a 0x00 0x55 //往寄存器0x00写0x55 Target#i2cget -f -y 0 0x2a 0x00 //读取寄存器0x00,值为0x55 & E: o( R. o! } K1 q, ^( x' z
图5 ; s1 Q& i& I& U2 u
执行如下命令,写FPGA端LED寄存器0x01,实现对FPGA端用户可编程指示灯控制。
8 D4 \ j1 M+ d0 T
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
, v }/ Y- _% a6 Q, s
图6 执行如下命令,读FPGA端KEY寄存器0x02,实现对FPGA端用户输入按键的状态检测。 8 i9 \7 |' l* v
Target#i2cget -f -y 0 0x2a 0x02 //读取KEY寄存器0x02,值为0xe0 * B5 y. h i% d% Z) f1 w' x
图7 请按下FPGA端用户输入按键KEY7并保持按下状态,再执行如下命令。 % Y* Z" j7 p- E
Target#i2cget -f -y 0 0x2a 0x02 //读取KEY寄存器0x02,值为0xc0
( L5 S! F4 E6 a0 f3 z# C
图8 请按下FPGA端用户输入按键KEY8并保持按下状态,再执行如下命令。 $ y( J% ^0 F2 b( M4 l# ~
Target#i2cget -f -y 0 0x2a 0x02 //读取KEY寄存器0x02,值为0xa0
1 l" C( O, M, a0 N9 f( t1 L: C( ~
图9请按下FPGA端用户输入按键KEY9并保持按下状态,再执行如下命令。
3 v ^; a' Q% e+ {/ J; {& h
Target#i2cget -f -y 0 0x2a 0x02 //读取KEY寄存器0x02,值为0x60 图10 基于Linux的SPI通信案例/ Z* z5 G. n$ ~, ]2 W: z* ~6 W
案例功能:基于Linux系统,实现T3(ARM Cortex-A7)与FPGA的SPI通信功能。 2 K4 U2 @+ x* t, K( l& R
ARM端案例源码为“4-软件资料\Demo\module-demos\spi_rw”,实现SPI Master功能,具体如下: (1)打开SPI设备节点,如:/dev/spidev0.1。 (2)使用ioctl配置SPI总线,如SPI总线极性和相位、通信速率、数据长度等。 (3)选择模式为单线模式或双线模式。当设置SPI总线为双线模式时,发送数据为单线模式,接收数据为双线模式。 (4)发送数据至SPI总线,以及从SPI总线读取数据。 校验数据,然后打印读写速率、误码率。 ' U% E2 t V# R2 ~- r
FPGA端案例源码为“4-软件资料\Demo\fpga-demos\dram_spi”和“4-软件资料\Demo\fpga-demos\dram_spi_dual”,实现SPI Slave功能,具体说明如下:(1)将SPI Master发送的数据保存至DRAM。(2)SPI Master发起读数据时,FPGA从DRAM读取数据通过SPI总线传输至SPI Master。当SPI总线为双线模式时,接收数据支持双线模式,而发送数据仅支持单线模式。
; r2 a0 F: |* ~3 o' n8 N
图11 ARM端程序流程图3 N$ o! ^ d: @, w2 T% @
案例测试:评估板上电,请先加载运行FPGA端可执行程序,若进行SPI单线模式测试,请运行案例"dram_spi\bin\"目录下的程序可执行文件;若进行SPI双线模式测试,请运行"dram_spi_dual\bin\"目录下的程序可执行文件。同时将ARM端可执行程序spi_rw拷贝至评估板文件系统任意目录下。0 a8 v( }7 T& S2 Y6 n
进入评估板文件系统,执行如下命令查看新生成的spidev设备节点。
, I7 a8 f3 g/ e- ?9 A! ]0 a+ K+ Q
Target#ls /dev/spidev0.1
$ W# K& k" s: z7 D O& W( S# d
图12
执行如下命令查询程序命令参数。 & D" r& E3 T, a
Target#./spi_rw -h 图13
1 SPI单线模式 1.1 功能测试 执行如下命令运行程序,ARM通过SPI总线写入1KByte随机数据至FPGA DRAM,然后读出数据、进行数据校验,同时打印SPI总线读写速率和误码率,最终实测写速率为2.405MB/s,读速率为2.405MB/s,误码率为0。如下图所示。
" l: }. P* y7 P+ d8 S
Target#./spi_rw -d /dev/spidev0.1 -s 50000000 -OH -m 1 -S 1024 -c 2
3 [" c: a8 ~7 U1 n H* F. ]6 T
参数解析: -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:循环传输数据包的次数。
. F. |, n' |( t
图14
1.2 性能测试 (1)基于50MHz时钟频率 执行如下命令运行程序,基于50MHz时钟频率、增大读写数据量测试SPI总线最高传输速率。ARM通过SPI总线写入1MByte随机数据至FPGA DRAM,然后读出数据,不做数据检验,最后打印SPI总线读写速率和误码率,如下图所示。 3 k/ A( p6 V# N: J/ d* e
备注:本案例设计一次读写1KByte随机数据至FPGA DRAM,因此误码率较高。 2 P5 d+ u1 r# a6 }1 K
Target#./spi_rw -d /dev/spidev0.1 -s 50000000 -OH -m 1 -S 1048576 -c 2 - [4 b4 \9 G9 a+ Z' f
图15
% v7 d3 e9 E) s0 d1 _本次测试设置SPI总线通信时钟频率为50MHz,则SPI单线模式理论通信速率为:(50000000 / 1024 / 1024 / 8)MB/s ≈ 5.96MB/s。从上图可知,本次实测写速率为5.757MB/s,读速率为5.757MB/s,接近理论通信速率。
# F1 q- x1 b. [7 A, \本次测试SPI使用了DMA传输,测得CPU的占用率约为1%,如下图所示。
3 G/ k" Q; C8 E) x& Y3 z图16 (2)基于100MHz时钟频率 执行如下命令运行程序,测试基于100MHz时钟频率的SPI单线模式的最高通信带宽。ARM通过SPI总线写入1MByte随机数据至FPGA DRAM并读出数据,不做数据检验,最后打印SPI总线读写速率和误码率,如下图所示。 3 J+ I( G( ~: _, F
备注:本次测试旨在测试SPI的最高传输速率,目前SPI速率最大支持50MHz时钟频率,当时钟频率配置到最大100MHz时速率会出现时序问题,现象是整体往右移了1bit。例如发送10000000,实际接收到01000000,并在测试中出现误码。 ( g/ q' b5 U( ]8 n- Z5 b- l
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,接近理论通信速率。 ( D P, W; ^' c( V
图18 本次测试SPI使用了DMA传输,测得CPU的占用率约为1%,如下图所示。 : b) P ^ U' {1 y h
图19 2 SPI双线模式 2.1 功能测试 执行如下命令运行程序,ARM通过SPI总线写入1KByte随机数据至FPGA DRAM,然后读出数据、进行数据校验,同时打印SPI总线读写速率和误码率,如下图所示。
7 ^" Q4 ~3 w; J( j2 u) {: B) m
Target#./spi_rw -d /dev/spidev0.1 -s 50000000 -OH -m 2 -S 1024 -c 1 . i& O# j' e4 D7 C: c0 b# W( w
参数解析: -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:循环传输数据包的次数。 6 K Z) Z; T5 W/ ^8 ]- ^
图20
8 G4 w7 J* N' Z2 A! n5 l, J从上图可知,本次实测写速率为2.577MB/s,读速率为5.222MB/s,误码率为0。
1 T$ o& F7 ?9 U6 \5 S- M
2.2 性能测试 (1)基于50MHz时钟频率 执行如下命令运行程序,基于50MHz时钟频率、增大读写数据量测试SPI总线最高传输速率。ARM通过SPI总线写入1MByte随机数据至FPGA DRAM,然后读出数据,不做数据检验,最后打印SPI总线读写速率和误码率,最终本次实测写速率为5.892MB/s,读速率为11.365MB/s。如下图所示。
$ k$ [" m& R. g% |- n5 {
备注:本案例设计一次读写1KByte随机数据至FPGA DRAM,因此误码率较高。
: M7 K2 f8 R n. @- `# x- y1 ]
Target#./spi_rw -d /dev/spidev0.1 -s 50000000 -OH -m 2 -S 1048576 -c 1
3 h- i8 b* r O; `# |
图21 本次测试设置SPI总线通信时钟频率为50MHz,则SPI单线模式理论通信速率为:(50000000/1024/1024/8)MB/s ≈ 5.96MB/s;SPI双线模式理论通信速率为:(50000000 / 1024 / 1024 / 4)MB/s ≈ 11.92MB/s。 " X' a, [% u7 n0 Q4 `) r
本次测试SPI使用了DMA传输,测得CPU的占用率约为0%,如下图所示。
: o% @7 Z. ]8 t+ t 图22(2)基于100MHz时钟频率 1 H# ]' e- d3 { U6 I$ P- [
执行如下命令运行程序,测试基于100MHz时钟频率的SPI双线模式的最高通信带宽。ARM通过SPI总线写入1MByte随机数据至FPGA DRAM并读出数据,不做数据检验,最后打印SPI总线读写速率和误码率,最终在100MHz下实测SPI双线模式写速率为:11.684MB/s,SPI双线模式读速率为:23.432MB/s。如下图所示。 & E: S( \5 N ?& N1 x* Y, ?+ B
备注:本次测试旨在测试SPI的最高传输速率,目前SPI速率最大支持50MHz时钟频率,当时钟频率配置到最大100MHz时速率会出现时序问题,现象是整体往右移了1bit。例如发送10000000,实际接收到01000000,并在测试中出现误码。
, g: {( D) D# ?
Target#./spi_rw -d /dev/spidev0.1 -s 100000000 -OH -m 2 -S 1048576 -c 100
图23
% A& V9 K- g5 i根据官方数据手册(如下图),SPI总线通信时钟频率理论值最大为100MHz。本次测试设置SPI总线通信时钟频率为最大值100MHz,则SPI单线模式理论通信速率为:(100000000/1024/1024/8)MB/s ≈ 11.92MB/s;SPI双线模式理论速率为:(100000000 / 1024 / 1024 / 4)MB/s ≈ 23.84MB/s。
- i; Z6 v% e+ g1 O$ ^
图24 本次测试SPI使用了DMA传输,测得CPU的占用率约为0%,如下图所示。
; G9 B0 e- Z4 p1 L3 }, j* G1 T
图25 / P" @* _ Q, y! ]' i# G0 H
基于Linux-RT的SPI通信案例 . E) Z [# q+ ^ F0 j
案例功能:基于Linux-RT实时系统,演示T3(ARM Cortex-A7)与FPGA之间的SPI通信功能。本案例通信数据量少、带宽低,但实时性高,适用于对通信带宽要求不高,但通信实时性有严格要求的工控场合。 6 ]& I# D+ F- O" U
ARM端案例源码为“4-软件资料\Demo\module-demos\rt_spi_rw”,实现SPI Master功能,具体如下: (1)打开SPI设备节点。如:/dev/spidev0.1。 (2)使用ioctl配置SPI总线。如SPI总线极性和相位、通信速率、数据字长度等。 (3)创建实时线程。 (4)发送数据至SPI总线,以及从SPI总线读取数据。 (5)打印发送、接收的速率和传输耗时。 校验数据,然后打印读写速率、误码率。
6 R9 J+ H" n- f6 J4 F+ O/ J; B FPGA端案例源码为“4-软件资料\Demo\fpga-demos\dram_spi”,实现SPI Slave功能,具体如下:(1)将SPI Master发送的数据保存至DRAM。SPI Master发起读数据时,FPGA从DRAM读取数据并通过SPI总线传输至SPI Master。
7 f6 Z4 [+ W2 M2 Z) [; p$ U
图26 ARM端程序流程图
^& D! j4 j3 u5 L( w3 B- k* ]案例测试:由于我司默认使用是的Linux内核,因此需参考Linux系统使用手册文档中的“替换内核、内核模块”章节将Linux系统启动卡替换为Linux-RT系统。 4 u2 w/ ]/ g+ h( b R" {0 H' I+ n
评估板上电,请先加载运行FPGA端可执行程序。将ARM端可执行文件rt_spi_rw拷贝至评估板文件系统任意目录下,执行如下命令,查看新生成的spidev设备节点。
1 V9 H% {5 J6 V- N& W
Target#ls /dev/spidev0.1
. N# ?; M* w) N% s( @+ R W: ^* | ' X: u( `) q, M7 p" A7 o0 @
图27 执行如下命令,查询程序命令参数。
! t' t ~) N. C: z
Target#./rt_spi_rw -h
) ~& a( y5 k! s0 R) ?& k) g
图28 1 非轮询方式 执行如下命令运行程序,ARM通过SPI总线写入随机数据至FPGA DRAM,然后读出数据、进行数据校验,同时打印SPI总线读写速率、传输耗时和误码率,最终实测最小耗时为44us,最大耗时为167us,平均耗时为48us;写速率为0.076MB/s,读速率为0.076MB/s,误码率为0。如下图所示。
# a! d3 ?; \ a- ~' G" p5 s
Target#./rt_spi_rw -d /dev/spidev0.1 -s 50000000 -OH -S 4 -c 1024
' m( i6 G% i8 i. u* T
参数解析: -d:设备节点; -s:设置通信时钟频率(Hz),本次测试设置SPI总线通信时钟频率为50MHz,则理论通信速率为:(50000000 / 1024 / 1024 / 8)MB/s ≈ 5.96MB/s; -O:空闲状态时,SCLK为高电平(CPOL=1); -H:从第二个跳变沿开始采样(CPHA=1); -S:设置传输数据大小,单位为Byte; -c:循环传输数据包的次数。 + }5 y* J$ V. [1 h2 l
图29 2 轮询方式 执行如下命令运行程序,ARM通过SPI总线写入4Byte随机数据至FPGA DRAM,读出数据、进行数据校验,同时打印SPI总线读写速率、传输耗时和误码率,最终实测最小耗时为27us,最大耗时为152us,平均耗时为30us;写速率为0.118MB/s,读速率为0.118MB/s,误码率为0。如下图所示。 + `* Y$ F l( f. a
Target#./rt_spi_rw -d /dev/spidev0.1 -s 50000000 -OHp -S 4 -c 1024
+ Q, w( f- U; C& X# c
参数解析: -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:循环传输数据包的次数。
2 C' e5 V5 ?2 b8 D- c0 D& [( o: G
图30
4 Q1 `: p4 O+ r5 n0 G+ k* S2 @7 @! g 更多全国产T3 + Logos工业核心板产品资料可长按二维码识别下载, T, P3 O, N) A0 {. a
; }' U( Y, B6 z" w, ^4 O亦可添加如下客服微信进行咨询(即刻添加,马上咨询)
; W3 d$ R9 G$ U. z$ {* G
如需购买全志T3 + Logos工业评估板,请登录创龙科技天猫旗舰店:[color=var(--weui-LINK)]tronlong.tmall.com! 全志T3技术交流群:535860770,欢迎加入! 紫光同创Logos技术交流群:311416997,欢迎加入! ' k1 W/ n, z' E
/ V: t- U& T' C* y
|