1. IIC通信协议基础解析
IIC(Inter-Integrated Circuit)作为一种双线制串行通信总线,在嵌入式系统中扮演着重要角色。我初次接触IIC是在调试ZYNQ平台的传感器模块时,当时为了读取温湿度数据,不得不深入理解这个看似简单却暗藏玄机的通信协议。
IIC总线由Philips公司(现NXP)在1980年代推出,采用主从架构,仅需两根信号线即可实现多设备通信。SCL(Serial Clock)作为时钟线,由主机控制;SDA(Serial Data)作为数据线,用于双向数据传输。这种简洁的设计使得IIC在ZYNQ等嵌入式系统中广受欢迎,特别是在需要连接多个低速外设(如EEPROM、传感器等)的场景。
注意:虽然IIC协议标准规定最高速率可达3.4MHz(高速模式),但在ZYNQ实际应用中,400kHz(快速模式)更为常见,过高的时钟频率可能导致信号完整性问题。
IIC协议的核心特征包括:
- 7位或10位设备地址寻址
- 多主机仲裁机制
- 硬件错误检测(通过ACK/NACK)
- 半双工通信方式
在ZYNQ平台上实现IIC通信时,开发者可以选择使用PS端的硬件IIC控制器,也可以通过PL端的GPIO模拟IIC时序。硬件方案效率高但灵活性受限,软件方案则相反。我曾在一个图像采集项目中,因为需要同时控制多个IIC设备(摄像头传感器+EEPROM),最终选择了PL端模拟方案,通过状态机实现了精确的时序控制。
2. ZYNQ平台IIC硬件架构详解
2.1 PS端IIC控制器特性
ZYNQ芯片的Processing System(PS)部分集成了两个独立的IIC控制器,符合AMBA规范。这些控制器支持:
- 标准模式(100kHz)
- 快速模式(400kHz)
- 7位/10位地址模式
- 多主机仲裁
在Vivado中配置IIC控制器时,需要特别注意时钟分频系数的计算。以100MHz的CPU时钟为例,要产生400kHz的SCL时钟,分频值应设置为:
code复制分频值 = (CPU时钟频率 / (5 × SCL频率)) - 1
= (100,000,000 / (5 × 400,000)) - 1
= 49
2.2 PL端IIC实现方案
当PS端的IIC控制器不够用
