软件版本: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)掉电检测和自动切换电池供电模式 S1307的寄存器地址空间如下,我们的代码也就是读写一下地址空间。 地址空间中详细的参数定义如下表 写时序如下: 写时序很容易理解,和我们前面写EEPROM一样,先发送器件地址为1101000,再发送寄存器的地址,之后是连续写数据。 读时序如下: 这里读的时序有点没描述清楚,读时序前首先还要进行一次写寄存器起始地址的设置。比如代码,首先是写器件地址,并且指定标记读寄存器的其实寄存器地址为0x00,然后从标记的0x00读7个字节的数据。后面时序分析的时候再配合以上读写时序图介绍。 12.3 FPGA BD工程这节课的FPGA BD工程和上一节课是一样的,我们依然把关键部分描述下。 做这个实验必须勾选支持I2C控制器,通过EMIO的方式引出I2C总线。RTC模块连线就可以完成实验。对于初学者需要注意,EMIO是FPGA的PIN脚因此需要添加XDC文件约束FPGA PIN脚。 另外为了完本课程实验,需要选择购买RTC模块。对于MZ7XA-7010(mini)/MZ7XA-7020/MZ7XB-7020开发板具有板载的IO扩展,只要正确和EEPROM模块对接就能完成此实验。11.3 I2C Polled方式读写EEPROM 12.4 I2C Polled方式读写RTC时钟芯片12.4.1 I2c 控制器PS支持两个具有以下主要功能的I2C设备: I2C总线规范版本2 支持16字节FIFO 可编程的正常和快速总线数据速率 主模式 -写转移 -读取转移 -扩展地址支持 -支持缓慢处理器服务的HOLD -支持中断 从模式 12.4.2 I2cPs_Polled.c我们米联客(MSXBO)编写了两种读写EEPROM的方式,并且封装成子函数方便用户调用。我们先看代码。
I2cPs_init 函数负责初始化I2C控制器,关键是初始化了I2C控制的速度XIicPs_SetSClk(I2C_Ptr, IIC_SCLK_RATE)。 I2cPs_write 函数顾名思义是实现I2C的写数据 I2cPs_read 函数顾名思义是实现I2C的读数据 12.4.3 RTC_DS1307.c
DS1307_startClock 函数启动RTC时钟芯片运行 DS1307_stopClock 函数启动RTC停止芯片运行 DS1307_getTime 函数读取RTC时钟芯片时间 DS1307_setTime 函数设置RTC时钟芯片时间 DS1307_fillByHMS 初始化年时分秒时间变量 DS1307_fillByYMD 初始化年月日时间变量 DS1307_fillDayOfWeek 初始化周几时间变量 DS1307_decToBcd 十进制转BCD码 DS1307_bcdToDec BCD码转10进制 写时序很容易理解,和我们前面写EEPROM一样,先发送器件地址为1101000,再发送寄存器的地址,之后是连续写数据。 写时序如下: 设置时间的函数如下:
这里读的时序有点没描述清楚,读时序前首先还要进行一次写寄存器起始地址的设置。比如代码,首先是写器件地址,并且指定标记读寄存器的其实寄存器地址为0x00,然后从标记的0x00读7个字节的数据。 读时序如下: 获取实现的函数,如下:
12.4.4 mian.c
在mian.c文件中,初始化I2C控制器,设置RTC时钟芯片的时间,之后每间隔1S读取一次时间值,并且通过串口打印。 12.5 硬件连线通过外扩的FPGA GPIO 连接 RTC模块,MZ7XA、MZ7XB自带此IO 对于没有这组IO的开发板通过FEP转NEP转接卡实现,此转接卡需要单独购买 12.6 测试结果 |
XILINX 官网|站点统计|Archiver|手机版|米联客品牌主页|UISRC工程师开源站 ( 苏ICP备19046771号-2 )
GMT+8, 2025-4-5 00:23 , Processed in 0.196941 second(s), 86 queries .