ZYNQ之IIC控制器详解与IIC寄存器配置例程说明

1 概述

本文用于讲解ZYNQ中IIC的作用以及用例程说明IIC使用方法。

ZYNQ说明:

\1) ZYNQ分为PL侧与PS侧。

\2) PL侧为逻辑部分,即常说的FPGA。

\3) PS侧为软件侧,即常说的RAM侧。

本文以ZYNQ-7000系列 xc7z045ffg676为例讲解IIC。

使用开发工具:vivado 2017.4 ,SDK。

1.1 本文例程说明

本文例程简介:用ZYNQ的IIC配置ADV7611器件的寄存器配置。IIC用PS侧的资源,走EMIO即可引到PL端外接ADV7611芯片。然后使ZYNQ能接收外部输入的HDMI信号,分辨率为1920108060HZ。

PL侧功能:接收HDMI的信号,并解析分辨率参数;此外并将输入的HDMI再输出作为回环验证。

PS侧功能:IIC配置,GPIO输出作为配置完成提示done信号。

备注:ADV7611是一个单输入HDMI接收器件,内置HDMI兼容型接收器,支持HDMI 1.4a规定的所有强制性3D电视格式,和最高UXGA 60 Hz、 8位的分辨率。

1.2 特别说明

由于本文主要是讲ZYNQ的IIC,因此例程中涉及到的其他功能这里不会做详细的展开。

若要看GPIO的输出说明以及PL端怎么把硬件资源导入到PS端可查看

《ZYNQ之EMIO详解与例程说明》

2 参考

《UG585 Zynq-7000 SoC echnical Reference Manual》

《ADV7611 datasheet》

《UG180》

3 IIC定义及作用

3.1 IIC简介

IIC总线协议运用很广泛,主要是用于一些器件的配置,以及信号传输。

I2C 协议把传输的消息分为两种类型的帧:

\1) 一个地址帧 :用于 master 指明消息发往哪个 slave;

\2) 一个或多个数据帧: 由 master 发往 slave 的数据(或由 slave 发往 master),每一帧是 8-bit 的数据。

注:协议要求每次放到 SDA 上的字节长度必须为 8 位,并且每个字节后须跟一个 ACK 位,在下面会讲到。数据在 SCL 处于低电平时放到 SDA 上,并在 SCL 变为高电平后进行采样。读写数据和 SCL 上升沿之间的时间间隔是由总线上的设备自己定义的,不同芯片可能有差异。

I2C 数据传输的时序图如下:

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第1张图片

开始条件(start condition):

为了标识传输正式启动, master 设备会将 SCL 置为高电平(当总线空闲时, SDA 和 SCL 都处于高电平状态),然后将 SDA 拉低,这样,所有 slave 设备就会知道传输即将开始。如果两个 master 设备在同一时刻都希望获得总线的所有权,那么谁先将 SDA 拉低,谁就赢得了总线的控制权。在整个通信期间,可以存在多个 start 来开启每一次新的通信序列(communication sequence),而无需先放弃总线的控制权,后面会讲到这种机制。

地址帧(address frame):

地址帧总是在一次通信的最开始出现。一个 7-bit 的地址是从最高位(MSB)开始发送的,这个地址后面会紧跟 1-bit的操作符, 1 表示读操作, 0 表示写操作。接下来的一个 bit 是 NACK/ACK,当这个帧中前面 8bits 发送完后,接收端的设备获得 SDA 控制权,此时接收设备应该在第 9 个时钟脉冲之前回复一个 ACK(将 SDA 拉低)以表示接收正常,如果接收设备没有将 SDA 拉低,则说明接收设备可能没有收到数据(如寻址的设备不存在或设备忙)或无法解析收到的消息,如果是这样,则由 master来决定如何处理(stop 或 repeated start condition)。

数据帧(data frames):

在地址帧发送之后,就可以开始传输数据了。 Master 继续产生时钟脉冲,而数据则由 master(写操作)或 slave(读操作)放到 SDA 上。每个数据帧 8bits,数据帧的数量可以是任意的,直到产生停止条件。每一帧数据传输(即每8-bit)之后,接收方就需要回复一个 ACK 或 NACK(写数据时由 slave 发送 ACK,读数据时由 master 发送 ACK。当 master 知道自己读完最后一个 byte 数据时,可发送 NACK 然后接 stop condition)。

停止条件(stop condition):

当所有数据都发送完成时, master 将产生一个停止条件。停止条件定义为:在 SDA 置于低电平时,将 SCL 拉高并保持高电平,然后将 SDA 拉高。注意,在正常传输数据过程中,当 SCL 处于高电平时, SDA 上的值不应该变化,防止意外产生一个停止条件。

3.2 IIC读写时序

3.2.1 写时序

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第2张图片

3.3 读时序

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第3张图片

3.4 ZYNQ IIC控制器简介

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第4张图片

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第5张图片

4 IIC实用例程

4.1 例程功能说明

用ZYNQ的IIC配置ADV7611器件的寄存器配置。IIC用PS侧的资源,走EMIO即可引到PL端外接ADV7611芯片。然后使ZYNQ能接收外部输入的HDMI信号,分辨率为1920108060HZ。

PL侧功能:接收HDMI的信号,并解析分辨率参数;此外并将输入的HDMI再输出作为回环验证。

PS侧功能:IIC配置,GPIO输出作为配置完成提示done信号。

其功能框图如下所示:

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第6张图片

4.2 功能分析

本例程主要有两部分内容:一是HDMI的输入输出数据处理,二是ADV7611的IIC寄存器配置。

对器件的配置时,ZYNQ的IIC做主即master,器件的IIC做从及slave。经ADV7611的datasheet可知其器件的配置为标准的IIC协议:1个7bit的slave addr,一个8bit的word addr,一个8bit的data。即要配置ADV7611的IIC寄存器只需要按字节模式写入即可。

注意:ADV7611手册上说的slave addr的值是按8bit的高7bit赋值的,而在ZYNQ的IIC控制器的slave addr为7bit值,因此在使用时需要进行数据的右移以为处理。其说明如下图所示。

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第7张图片

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第8张图片

4.3 PL侧设置

在做ZYNQ的开发时,是PL与PS协调的一个过程。需要先在PL侧建立工程,之后再将PL侧的bit导出到PS侧进行开发。

PL侧关于ZYNQ的设置如下:

\1) 在vivado中新建工程后在bd中添加zynq的ip。

\2) 之后双击IP点开设置界面,如下所示:

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第9张图片

\3) 再进入MIO configuration中配置I2C与GPIO如下图所示。

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第10张图片

\4) 再点击ok完成zynq的ip设置。

\5) 再点击run block automation完成ip周围的设置,最后如下图所示

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第11张图片

4.4 PS侧的设置

\1) 在导出的SDK中,点击file/new/application project建立运用工程,设置好工程名后点击下一步。

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第12张图片

\2) 之后点击hello world工程模板。

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第13张图片

\3) 之后在*bsp下面点击system.ss即可看见驱动,导入iic的examples。

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第14张图片

\4) 之后根据需要在例程中找到IIC的初始化代码、输入输出代码搬移到自己的工程下。

\5) 再根据自己的运用场景处理寄存器的配置以及运用即可。比如本例程

4.5 例程代码讲解

1)初始化代码,一般不用处理,照搬即可。

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第15张图片

2)IIC的写字节数据模块,由于ADV7611的slave addr可能变化,所以这里我讲EepromSlvAddr也提到了函数的输入。其他保持不变。函数端口说明如下:

a) Bytecount为写入的字节数量,包括word addr;

b) EepromSlvAddr即slave addr;

c) WriteBuffer为写入数据的数组名,即可在这个数据里放很多个数据。本例程主要是放两个数据,word addr与data.

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第16张图片

3)有了初始化与写例程后,我们就可开始自己的配置了。首先编写一个结构体数组,存入IIC的所有配置寄存器以及数据.

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第17张图片

4)再按顺序往IIC写模块写入数据即可。为了对其ADV7611与ZYNQ的IIC控制器的slave addr 我这里做了一个右移1位的操作。此外这个函数我把它返回值设置为了1,是为了配置完后给PL一个提示信号。

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第18张图片

5)做到这里,代码的IIC的配置功能就基本写完了。然后将配置完成的返回值放入到GPIO的输出即可完成对PL的提示。

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第19张图片

5 上板操作

\1) 连接上线缆后,点烧写PL的BIT文件,以及运行PS端的代码;

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第20张图片

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第21张图片

\2) 之后在VIVADO的debug上即可看见HDMI的输入信号以及分辨率信息。

ZYNQ之IIC控制器详解与IIC寄存器配置例程说明_第22张图片

6 附件

本附件为本例程的源代码。

IIC_Register_hdmi_cs_mz7045fa(ZYNQ配置IIC寄存器例程代码)

你可能感兴趣的:(ZYNQ,fpga开发,ZYNQ之IIC控制器,HDMI输入输出,IIC寄存器配置)