米联客 ZYNQ/SOC 精品教程 S02-CH12 I2C读写 RTC时钟实验

软件版本:VIVADO2017.4

操作系统:WIN10 64bit

硬件平台:适用米联客 ZYNQ系列开发板

米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!

12.1 概述

      趁热打铁,我们刚刚在上一节课掌握了I2C利用ZYNQ I2C总线控制器读写EEPROM,本节课继续利用I2C总线控制器实现对RTC时钟芯片,DS1307的读写访问。有了前面的基础,这节课内容学习起来很轻松。

12.2 RTC时钟DS1307介绍

      DS1307是低功耗、两线制串行读写接口、日历和时钟数据按BCD码存取的时钟/日历芯片。它提供秒、分、小时、星期、日期、月和年等时钟日历数据。另外它还集成了如下几点功能:

(1)56 字节掉电时电池保持的NV SRAM 数据存储器

(2)可编程的方波信号输出

(3)掉电检测和自动切换电池供电模式

a8942b767004eadaad990c919b9537b2fe4.jpg

S1307的寄存器地址空间如下,我们的代码也就是读写一下地址空间。

67a5c8c59487e26cd396e51261964045dfe.jpg

地址空间中详细的参数定义如下表

03a779b2352e8266b0e2fcf0285252c736b.jpg

写时序如下:

8a8370ecc760804caa0d326088b3c1a9869.jpg

写时序很容易理解,和我们前面写EEPROM一样,先发送器件地址为1101000,再发送寄存器的地址,之后是连续写数据。

读时序如下:

3451369d65c76104484c475f9c01ab1972b.jpg

      这里读的时序有点没描述清楚,读时序前首先还要进行一次写寄存器起始地址的设置。比如代码,首先是写器件地址,并且指定标记读寄存器的其实寄存器地址为0x00,然后从标记的0x00读7个字节的数据。后面时序分析的时候再配合以上读写时序图介绍。

12.3 FPGA BD工程

      这节课的FPGA  BD工程和上一节课是一样的,我们依然把关键部分描述下。

89e0a531434a6941bf0861a7c7cf7faaf0d.jpg

      做这个实验必须勾选支持I2C控制器,通过EMIO的方式引出I2C总线。RTC模块连线就可以完成实验。对于初学者需要注意,EMIO是FPGA的PIN脚因此需要添加XDC文件约束FPGA PIN脚。

 f1603b3170561eda23a8bdc4c08c484c73e.jpg

      另外为了完本课程实验,需要选择购买RTC模块。对于MZ7XA-7010(mini)/MZ7XA-7020/MZ7XB-7020开发板具有板载的IO扩展,只要正确和EEPROM模块对接就能完成此实验。11.3 I2C Polled方式读写EEPROM

12.4 I2C Polled方式读写RTC时钟芯片

12.4.1 I2c 控制器

6e1f79103f2cfe77a63a49dddf291d8d8fe.jpg

PS支持两个具有以下主要功能的I2C设备:

I2C总线规范版本2

支持16字节FIFO

可编程的正常和快速总线数据速率

主模式

 -写转移

 -读取转移

 -扩展地址支持

-支持缓慢处理器服务的HOLD

-支持中断

从模式

9f67087d4625096d8e4c39a965e445e3e3c.jpg

12.4.2 I2cPs_Polled.c

我们米联客(MSXBO)编写了两种读写EEPROM的方式,并且封装成子函数方便用户调用。我们先看代码。

include "I2cPs_Polled.h"

#include "sleep.h"

int I2cPs_init(XIicPs *I2C_Ptr,u16 DeviceId)

{

int Status;

XIicPs_Config *Config;

 

/*

 * Initialize the IIC driver so that it's ready to use

 * Look up the configuration in the config table, then initialize it.

 */

Config = XIicPs_LookupConfig(DeviceId);

if (NULL == Config) {

return XST_FAILURE;

}

 

Status = XIicPs_CfgInitialize(I2C_Ptr, Config, Config->BaseAddress);

if (Status != XST_SUCCESS) {

return XST_FAILURE;

}

 

/*

 * Perform a self-test to ensure that the hardware was built correctly.

 */

Status = XIicPs_SelfTest(I2C_Ptr);

if (Status != XST_SUCCESS) {

return XST_FAILURE;

}

 

/*

 * Set the IIC serial clock rate.

 */

XIicPs_SetSClk(I2C_Ptr, IIC_SCLK_RATE);

 

return XST_SUCCESS;

}

 

 

<

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值