REVIEW
之前在学习ZYNQ的PL端,已经学习过: SPI接口的74HC595驱动数码管实现_74hc595 spi-优快云博客 对SPI有一定了解哩: SPI(Serial Peripheral Interface),串行外围设备接口。
|
|
SPI
使用
4
根标准信号线进行通信:
MISO(主输入-
从输出
)
MOSI(主输出-从输入
)
时钟 SCLK
从机选择信号 SS(有时也称为片选信号
CS
)
|
1. 今日摸鱼任务
实现ZYNQ PS侧SPI控制数码管显示 |
小梅哥教材: 03_【裸机教程】基于C编程的Zynq裸机程序设计与应用教程v2.4.5.pdf 第十章 基于SPI控制器的数码管基础应用 ILA遇到了困难,下一次搞一下T_T |
2. ZYNQ PS SPI
ZYNQ-7000
的
PS
侧有两个功能一样的
SPI 外设控制器,其功能结构如图:
|
|
APB
接口:
32
位,用于响应寄存器的读、写,处理数据端口和
FIFO 之间的读写命令和数据。
数据端口以字节(即[7:0])为单位。
|
SPI
主机:此时控制器要驱动
SCLK
,并输出
3
个从机选择信号。
MOSI 信号上的从机选择和传输开始,可以在软件中手动控制,也可以由硬件自动控制。
|
SPI
从机:此时控制器只使用一个从机选择的输入信号(
SS0
)。
SCLK 与控制器的参考时钟(SPI_Ref_Clk
)同步。
|
Tx
和
Rx FIFO
:每个
FIFO
都是
128 字节,软件使用寄存器映射后的数据端口寄存器来读、写
FIFO
。
FIFO 桥接了两个时钟域:APB 接口和控制器的SPI_Ref_Clk
。
|
3. Block Design
使用EDA拓展版,本次使用EMIO |
|
74HC595 : |
|
SCLK --- SCLK/SHCP --- E19 MOSI --- DS --------------- D20 SS --- RCLK/STCP --- F17 |
|
|
|
4. PS_SPI
PS_SPI.h |
#ifndef __PS_SPI_H__ #include "xspips.h"
#endif |
PS_SPI.c |
#include "PS_SPI.h"
//根据设备ID在配置表中查找配置,然后初始化配置 //设置SPI的模式 //设置SPI的分频并使能 /************************************************************************************************************ //与从机进行数据传输,每发送一个字节就接受一个字节,发送的数据为WriteBuffer里的内容,接收的数据存在ReadBuffer里 |
5. SCU
SCU_GIC.h |
#ifndef SCU_GIC_H_
XScuGic ScuGic; //通用中断控制器 void ScuGic_Init(); #endif |
SCU_GIC.c |
#include "SCU_GIC.h" XScuGic ScuGic; //通用中断控制器对象 void ScuGic_Init() Xil_ExceptionInit(); /** |
SCU_TIMER.h |
#ifndef SCU_TIMER_H_ #include "xscutimer.h" extern uint8_t Refresh_Flag; XScuTimer ScuTimer; void ScuTimer_Int_Init(double Load_Val); #endif |
SCU_TIMER.c |
uint8_t Refresh_Flag = 0; //数码管位刷新标志
/* ↑↑↑结束处理↑↑↑ */
//将us转换为定时器装载值 //四舍五入,使结果更精准 //设置自动装载值和自动装载模式 //链接到中断控制器 //使能定时器中断 //开启计数器 |
6. main.c
#include <stdio.h>
//数码管位选 if(Refresh_Flag) |
//摸鱼结束,ILA有一些奇怪的问题,下次搞~