浅谈Zynq实现SPI接口设计

当我们在设计中使用zynq soc或zynq ultrascale + mpsoc时,可以有两种方法来实现spi接口:
使用ps端的spi控制器(ps端有两个spi控制器)
在pl端使用配置成标准spi通信的axi quad spi (qspi) ip模块
我们可以根据应用的要求来选择使用哪种方法实现spi控制器。两种spi的实现方式都支持四种spi模式,并且都可以作为spi主设备或spi从设备。下表列出了它们之间的一些差异:
首先,我们演示一下如何使用ps端的spi控制器进行spi传输。在zynq mio configuration选项卡中选中spi控制器,这就将spi包含在了设计中。在这个例子中,我将把spi信号连接到digilent arty z7开发板的spi接口,这需要通过pl i/o使用emio。
图:启用spi并将端口映射到emio
在选择好相应的选项后,唯一要做的就是连接spi端口的i/o。具体要如何进行连接取决于我们是需要配置一个spi主设备还是从设备。在spi控制器上,每个spi端口都有对应的可用输入(xxx_i)输出端口(xxx_o)。端口的正确连接十分关键,如果连接错误,当运行应用程序时,将得到完全错误的运行结果,这可能需要花费我们几个小时的时间来寻找问题的源头。另外,当配置成spi从设备时,有一个名称为slave select的输入;而当用作spi主设备时,将有三个选择引脚。
当正确配置好i/o并创建了工程,我们就可以使用应用软件中的spi配置选项将spi控制器配置成为主设备或从设备。使用ps spi控制器配置和传输数据,需要使用由xspips.h定义的bsp(板卡支持包)所提供的api接口。在第一个例子中,我们将spi控制器配置为spi主设备。
默认情况下,spi使用8位传输。但是,我们也可以将传输配置成更大的16或32位。对于8位传输,我们在c程序中可以使用u8数据类型。对于16位或32位传输,分别使用16位或32位对数据进行读写缓存。
一开始,这可能会导致一些问题或生成编译器警告,因为执行如下所示的两个数据传输api函数都需要发送和接收缓冲区的数据类型为u8:
s32 xspips_transfer(xspips *instanceptr, u8 *sendbufptr, u8 *recvbufptr, u32 bytecount);
s32 xspips_polledtransfer(xspips *instanceptr, u8 *sendbufptr, u8 *recvbufptr, u32 bytecount);
为了解决使用u16和u32数据类型的问题,我们需要将缓冲区转换为u8指针,如下所示:
xspips_polledtransfer(&spiinstance, (u8*)&txbuffer, (u8*)&rxbuffer, 8);
这样设置将就使得我们能够传输大小为8,16或32位的数据了。为了演示这一设置,我将spi主设备io连接到digilent digital discovery口袋仪器来测试传输的数据。在应用软件中使用上述方法将数据宽度从8位变为16位。
图:arty z7开发板与digital discovery口袋仪器
图:zynq soc ps spi主设备发送四个8位字
图:ps spi主设备发送四个16位字
另一个实现spi接口的方法是使用axi qspi ip核,使用这种方法需要在vivado中进行的设置比较多,需要花费比较长的时间。在axi qspi配置对话框中,我们可以配置传输的宽度、频率和从设备的数量。最重要的一个选项就是选择axi qspi ip核是作为spi主设备还是从设备。如果要配置成spi主设备,就必须选中enable master mode选项。如果要配置成为从设备,则必须取消该选项以确保spisel输入引脚的存在。当spi ip核作为从设备时,该引脚需要连接到主设备的slave select.端口。
图:配置axi quad spi
与ps spi控制器一样,bsp也为spi ip提供一个api接口。我们可以用它来开发应用软件,这个api是在文件xspi.h中定义的。作为例子的第二部分,我将使用这个api来配置axi qspi作为spi从设备。
为了演示创建软件后axi qspi核可以正确的以spi从设备方式进行工作。我再次使用digilent digital discovery口袋仪器作为spi主设备,使数据在两者之间传输。
图:spi从设备收发数据(蓝色的数据由zynq spi slave输出)
图:最终的block diagram
当然,如果使用xilinx fpga代替zynq soc或zynq ultrascale mpsoc,则可以使用具有相同axi qspi配置的microblaze软核来实现spi接口。只要正确地将其定义为主设备或从设备即可。
希望这篇文章能够帮助你了解如何使用这两种不同的方法创建主/从spi接口。

强!一位嵌入式牛人 8 年的工作总结
疫情期间的5G基站情况如何
AT89C51单片机快热式热水器程序设计
“稳”与“进”良性互动 构建现代化产业体系
vr安全体验馆的优势特性是什么,它的亮点有哪些
浅谈Zynq实现SPI接口设计
用户体验是第一位!联发科天玑旗舰技术布局曝光
百度AI开发者大会在“希壤”APP召开
软启动器应该如何保养呢?
防逆流方案的工作原理是什么
冯·诺依曼计算机结构图解析
介绍使用Sigrity PowerTree软件模块抽取PCB中电源“电源树”结构的过程
开发板中的存储
11家创新企业与17家全国知名人工智能、大数据方向投资机构现场对话
vocs在线监测仪的参数特点
热保护器在LED灯镇流器的应用
海外媒体曝光了一款LG的折叠屏概念新机
康宁ClearCurve(R)多模光纤全球售出长度超过750,000公里
锂电池导电材料碳纳米管市场巨头博弈加剧
噪声输入的有源滤波(ADAQ7980)