I2C的读写#

从原理图中可以看出,PS端的I2C接了三个外设,分别是EEPROM,实时时钟RTC,温度传感器,本章介绍如何利用I2C读写外设。

image1 image2

../_images/image338.png

硬件工程搭建#

硬件工程基于”ps_hello”,另存为一份工程“i2c_test”。配置I2C0到MIO50-51,重新Generate Output Products,并导出硬件平台。

../_images/image430.png

Vitis程序开发#

RTC测试#

以下是RTC DS1338的寄存器地址及说明,主要是控制类寄存器07H和时分秒寄存器00H~06H。

../_images/image528.png

在DS1338手册中可以看到I2C读写时序,其中器件地址为0x68 + r/w,而xilinx提供的API函数也是7bit地址+1bit读写位.

../_images/image626.png
  1. 在Vitis软件中新建工程rtc_test,其中添加了PS_i2c.c,主要提供的是i2c的初始化和读写操作等函数。

../_images/image725.png
  1. 在main函数中,首先是进行i2c的初始化

../_images/image823.png
  1. 接下来设置为Squart-Wave模式,并设置为32.768KHz,因为板子上的晶振是32.678KHz

../_images/image916.png
  1. 判断RTC是否是停止状态,如果是停止状态,设置秒寄存器的bit7设置为0。

../_images/image1014.png
  1. 设置初始值时分秒寄存器初始值

../_images/image1119.png
  1. 最后是打印时钟信息

../_images/image1216.png
  1. 下载验证

../_images/image1314.png
  1. 串口工具查看打印信息

../_images/image1413.png

温度传感器测试#

温度传感器用的是LM75,以下是它的寄存器说明,只要读取Temperature寄存器的值就可以了,因此它的地址为0x48+r/wimage3

而它的数据是有两个字节,第一个字节为整数位,第二个字节为小数位,最高位为1,即0.5摄氏度,如果为0,小数位则为0

../_images/image1612.png
  1. 新建Vitis工程,在temp.c中设置了读取的数据为2字节

../_images/image1712.png
  1. 程序很简单,根据收到的数据值,每秒打印出来显示。

../_images/image1812.png
  1. 下载程序

../_images/image1912.png
  1. 串口打印信息

../_images/image2011.png

EEPROM读写#

  1. 新建一个Vitis工程,导出emample工程

../_images/image2115.png
  1. 导入xiicps_eeprom_polled_example工程

../_images/image2213.png

EEPROM 的程序比较简单,具体代码大家可以自己去看,这里不详细说了。下面只对程序的功能和一些要点做一下介绍:

  1. EEPROM 的设备地址在程序的前面做了定义,这个地址就是系统访问外部 IIC 外设的设备地址,这里EEPROM地址为 0x54, 相当于 8bit 的 0xA8。

../_images/image2312.png

EEPROM 的设备地址可以在 24LC04 的芯片手册上找的到,高 4 位是 A,后面 3 位是 Block地址,因为 24LC04 只有 2 个 Block, 所以高 2 位 Block Address 是无效的。

../_images/image2411.png
  1. 由于EEPROM的地址为1个字节,在程序中修改如下

../_images/image2510.png
  1. 程序流程如下:

ReadBuffer清0,WriteBuffer赋FF写16个字节到EEPROM读EEPROM的16个字节到ReadBuffer检验是否正确Readbuffer清0,WriteBuffer赋值10~25写16字节到EEPROM读16字节到ReadBuffer检验是否正确返回

  1. 下载程序

../_images/image269.png
  1. 串口结果

../_images/image279.png

本章小结#

本章介绍了PS端的I2C控制外设的实验,用户可以再做下。