ZYNQ Ultrascale+ MPSoc ZCU102 SPI 自测
一、MIO、EMIO 、 AXI_GPIO三种 GPIO的区别
1.MIO 是 PS 专用的多路复用 IO,用于驱动 PS 的外设;
2.EMIO 是扩展的 MIO,因为 MIO 数量有限,可以使用部分 PL 的 IO 来扩展,当作 MIO 使用;
3. AXI_GPIO 是 PL 的 IO 通过 AXI 总线与 PS 进行交互,不具有 MIO 的功能。
二、SPI 接口实现方法
(选用1中的(2)方法)
1.使用PS端的SPI控制器(PS端有两个SPI控制器)
(1)可以使用PS侧的MIO实现SPI接口
(2)可以使用FPGA侧的EMIO实现SPI接口(但是在使用EMIO时发现SPI接口并不是我们通常理解的仅包括spi_clk ,spi_mosi,spi_miso,ss0/ss1/ss2(支持三个片选)这6根信号线,而是有14(或12)根信号线,如何使用和连线是个重要的问题)
2.在PL端使用配置成标准SPI通信的AXI Quad SPI (QSPI) IP模块
配置复杂
三、PL部分配置
1.新建Block Design,添加zynq Ultrascale+ MpSoc Processing System
2.添加SPI_0接口,本次只用到SPI_0。将SPI_0的四个管脚引出,其中MISO为Input,其余三个为Output。
注意 : 在SPI自测实验中,上面有一处错误,即不应该用spi0_s_i,应该用spi0_m_i!!!
3.Creat HDL Wrapper生成.v文件,然后进行综合
4.分配管脚
参考开发板的Schematic,找到适合的管脚编号:
5.点击Generate Bitstream,完成后导出hdf文件,然后Launch SDK
注:
- 错误1:
如果没有使用DDR,但是配置的时候依旧使能,那一旦配置出错,就会报错。因此如果不用DDR,那再配置的时候就不要使能。
- 错误2:
在进行管脚分配时,哪怕不使用片选信号,SPI_0_ 0_ss1_o和SPI_0_ 0_ss2_o和必须分配管脚,否则Synthesis和Implement都可以通过,但生成比特流时,会出现配置错误
四、PS部分配置
1.进入SDK后,新建工程
2.加入代码:
int main(void) {
int Status;
int i,j;
int value;
xil_printf("SPI Selftest Example \r\n");
Status = spi0_init();
if (Status != XST_SUCCESS) {
xil_printf("SPI Selftest Example Failed\r\n");
return XST_FAILURE;
}
for (i = 0; i < 6; i++)
{
SpiWrite(WriteBuffer,10);
SpiRead(10);
//xil_printf("read back \n");
for (j = 0; j < 10; j++ )
{
xil_printf("%d,",ReadBuffer[j]);
}
xil_printf("\n");
memset(ReadBuffer, 0x00, 1024);
sleep(1);
}
xil_printf("Successfully ran SPI Selftest Example\r\n");
return XST_SUCCESS;
}
在xilinx SDK中查询API函数的方法:
(1)将vivado设计好的硬件设计导入到SDK中,就可以把SDK代码编辑区的变迁也让切换到system.mss页面。
(2)所有的外设都已被列出来,单击每类外设后面的"Documentation"超链接即可打开其相应的API函数说明页面。以及个人外设可以导入例程供你参考。
(3)弹出库浏览页面:
“overview”页面讲解的是这个外设的简单介绍;
"data Structures"页面列出了软件驱动所涉及的数据结构;
"File list"页面显示了所有相关的头文件和源文件的超链接,可点击查看其版本信息和主要函数。
进入"file list"页面,即可列出某个外设的所有函数。单击某个函数后面的头文件超链接即可进入到详细说明页,会给出函数的功能、输入参数以及返回参数的含义。
3.上板测试:回环连接,开发板上电
4.通过SDK自带串口,与开发板进行连接,这里用COM5
5.点击Program FPGA,将bit文件下载到板卡
6.Run As—>Launch On Hardware
五、参考链接(用了Zynq-7000 SoC)
链接名称: ZYNQ学习之SPI的使用
xilinx PYNQ PS与PL的接口说明
1.ZYNQ7 Processing System 的 Block Design:
(1)FCLK_CLK0是 PS 输出的时钟信号,它将作为 PL 中外设模块的时钟源。这个时钟由 PS 中的 IO PLL产生,频率范围可以从 0.1 到 250MHz,在配置 ZYNQ7 PS 的时候,该时钟默认为 50MHz。
(2)M_AXI_GP0是通用(General Purpose)AXI接口,它包含了一组信号。首字母 M 表示 PS 作为主机(Master),PL 中的外设作为从机(Slave).而左侧的M_AXI_GP0_ACLK 是这个接口的全局时钟信号,它是一个输入信号,
M_AXI_GP0 接口的所有信号都是在这个全局时钟的上升沿采样的。
(3)FCLK_RESET0_N 是由 PS 输出到 PL 的全局复位信号,低电平有效。
2.ZYNQ UltraScale+ Mpoc 的 Block Design:
ZYNQ 的 HPM0_LPD 接口,此接口用于访问PL端数据,大部分应用中是为了配置PL端模块的寄存器。
对比:
ZYNQ7 PS | ZYNQ UltraScale+ Mpoc PS |
---|---|
M_AXI_GP0_ACLK | M_AXI_HPM0_LPD ? M_AXI_HPM{0,1}_FPD |
FCLK_CLK0 | pl_clk0 |
FCLK_RESET0_N | pl_resern0 |
六、附
1.SPI控制器的模块框图
RX和TX FIFO的深度各为128字节,软件可以读取和写入这些FIFO。