首页 > 其他分享 >全国产T3+FPGA的SPI与I2C通信方案分享

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

时间:2024-02-06 14:34:34浏览次数:22  
标签:FPGA MB 总线 T3 通信 SPI 速率

近年来,随着中国新基建、中国制造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-软件资料\Demo\fpga-demo\i2c_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-软件资料\Demo\module-demos\spi_rw”,实现SPI Master功能,具体如下:

(1)打开SPI设备节点,如:/dev/spidev0.1。

(2)使用ioctl配置SPI总线,如SPI总线极性和相位、通信速率、数据长度等。

(3)选择模式为单线模式或双线模式。当设置SPI总线为双线模式时,发送数据为单线模式,接收数据为双线模式。

(4)发送数据至SPI总线,以及从SPI总线读取数据。

校验数据,然后打印读写速率、误码率。

 

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总线为双线模式时,接收数据支持双线模式,而发送数据仅支持单线模式。

 

图11 ARM端程序流程图 案例测试评估板上电,请先加载运行FPGA端可执行程序,若进行SPI单线模式测试,请运行案例"dram_spi\bin\"目录下的程序可执行文件;若进行SPI双线模式测试,请运行"dram_spi_dual\bin\"目录下的程序可执行文件。同时将ARM端可执行程序spi_rw拷贝至评估板文件系统任意目录下。

进入评估板文件系统,执行如下命令查看新生成的spidev设备节点。

 

Target#ls /dev/spidev0.1

    图12

 

执行如下命令查询程序命令参数。

 

Target#./spi_rw -h

 

 

图13

 

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


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-软件资料\Demo\module-demos\rt_spi_rw”,实现SPI Master功能,具体如下:

(1)打开SPI设备节点。如:/dev/spidev0.1。

(2)使用ioctl配置SPI总线。如SPI总线极性和相位、通信速率、数据字长度等。

(3)创建实时线程。

(4)发送数据至SPI总线,以及从SPI总线读取数据。

(5)打印发送、接收的速率和传输耗时。

校验数据,然后打印读写速率、误码率。

 

FPGA端案例源码为“4-软件资料\Demo\fpga-demos\dram_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

 

非轮询方式

 

执行如下命令运行程序,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

 

轮询方式

 

执行如下命令运行程序,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

  更多全国产T3 + Logos工业核心板产品资料可长按二维码识别下载

 

  亦可添加如下客服微信进行咨询  

 

(即刻添加,马上咨询)   如需购买全志T3 + Logos工业评估板,请登录创龙科技天猫旗舰店:tronlong.tmall.com! 全志T3技术交流群:535860770,欢迎加入! 紫光同创Logos技术交流群:311416997,欢迎加入!

 

标签:FPGA,MB,总线,T3,通信,SPI,速率
From: https://www.cnblogs.com/Tronlong818/p/18009659

相关文章

  • flutter3+dart3聊天室|Flutter3跨平台仿微信App语音聊天/朋友圈
    全新研发flutter3+dart3+photo_view跨多端仿微信App界面聊天Flutter3-Chat。flutter3-chat基于最新跨全平台技术flutter3+dart3+material-design+shared_preferences+easy_refresh构建的仿微信APP界面聊天实例项目。实现发送图文表情消息/gif大图、长按仿微信语音操作面板、图片......
  • spingsecurity使用和说明
     1、引入spingsecurity依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>启动项目访问http://localhost:8080/login 账号:user密码:控制台系统生成的2、配置自定义......
  • Spingboot替换掉jar包里面的@Bean
    问题如下图,我们需要替换掉JsoncCfg配置类里面的YCloudObjectMapper这个Bean。这个Bean是在依赖的第三方jar包中的,因为用了@Bean而不是像@Component这种组件扫描添加的,所以不能使用@ComponentScan注解进行排除。现在不能修改jar包里的代码,不能在我们的项目中重新定义那个bean(Be......
  • Java SPI 代码示例
    JavaServiceProviderInterface是JDK自带的服务提供者接口又叫服务发现机制更是一种面向接口的设计思想。即JDK本身提供接口类,第三方实现其接口,并作为jar包或其他方式注入到其中,在运行时会被JDKServiceLoader发现并加载,自动调用实现类的方法。1.在本地测试SPI机制本人......
  • Windows Server 2012无法安装 .NET3.5-安装角色或功能失败,找不到源文件
     最近在部署项目的是否需要安装sqlserver2008r2,前提条件,服务器需要安装.netframework3.5 服务器环境是windowsserver2012r2,然后;net3.5安装正常流程安装,一直装不上,网上有很多方法,但都解决不了,后面还是一个博主提到了阿里云,然后找到了解决方案,太难了 目前已安装补丁......
  • 全志R128 SDK HAL 模块开发指南之HW Spinlock
    模块介绍hwspinlock提供一种硬件同步机制,lock操作可以防止多处理器同时处理共享数据。保证数据的一致性。源码结构├──hal_hwspinlock.c├──hwspinlock.h├──Kconfig├──Makefile├──platform│├──hwspinlock-sun20iw2.h└──platform-hwspinlock......
  • SpringBoot3 整合 SQLite3 + MybatisPuls
    !!前置要求!!假设你已经掌握SpringBoot3、Maven、Mybaits、MybatisPuls。假设你已经新建好SQLite3测试库。如果没有可以按此结构新建,保存到任意位置。1.项目结构2.依赖注意SpringBoot3版本这边用最新的打包失败,所以改用3.1.2pom.xml<?xmlversion="1.0"encoding="......
  • 基于FPGA的图像RGB转CMYK实现,包含testbench和MATLAB辅助验证程序
    1.算法运行效果图预览 将仿真结果导入到matlab中,得到如下对比结果: 2.算法运行软件版本matlab2022a,vivado2019.2 3.算法理论概述       基于FPGA的图像RGB转CMYK实现是一种将RGB图像转换为CMYK图像的硬件实现方法。下面将详细介绍其原理和数学公式。 3.1、......
  • 校验ChatGPT 4真实性的三个经典问题:提供免费测试网站快速区分 GPT3.5 与 GPT4
    现在已经有很多ChatGPT的套壳网站,以下分享验明GPT-4真身的三个经典问题,帮助你快速区分套壳网站背后到底用的是GPT-3.5还是GPT-4。大家可以在这个网站测试:https://ai.hxkj.vip,免登录可以问三条,登录之后无限制。咱们使用免登录的额度测试就已经够用了测试问题1:Whatist......
  • 模拟SPI
    注:参考各类网上博客,出处已不清,若有网友指出,感激不尽,并尽快进行添加出处。C文件 #include"softspi.h"#ifdefSOFT_SPIsspi_tsspi;#endifvoidsoftspi_init(sspi_t*spi_periph){  spi_periph->mod=PL_HIGH_PH_2EDGE;//PL_HIGH_PH_2EDGE   //PL_LOW_P......