基于Wolfson音频SoC的I2C总线接口设计
扫描二维码
随时随地手机看文章
引言
I2C(Inter-IntegratedCommunication),单线是Philips公司开发的一种高效、简单、双向、两线制同步串行总线,它仅需要两根线(串行数据线SDA和串行时钟线SCL)即可为连接到总线的设备提供简单有效的数据交换方式该总线可将各电路分割成各种功能的模块,并进行软件化设计,各个功能模块电路内部都集成有一个I2C总线接口电路,故可连接在总线上,从而很好地进行众多功能模块与MCU之间的输入输出接口,并使连接方式变得简便,同时可灵活地实现在线配置。本文采用VerilogHDL设计了一个FC总线的控制模块,该模块能够实现FC的所有功能。此外,该模块可作为一个软核来方便地嵌入到音频SoC系统中,这就是当前非常流行的两线总线。
1 I2C总线原理
通常将FC总线主从机之间的一次数据传送称为一帧,一帧数据一般由启动信号、地址码、若干数据 字节、应答信号位以及停止信号等组成。SDA和 SCL都通过一个电流源或者上拉电阻连接到正的电 源电压,图1所示是rc总线上标准模式器件和快速 模式器件之间的连接电路,由图1可见,当总线空闲 时,这两条线路都是高电平,连接到总线的器件输出 级必须是漏极开路或者集电极开路才能执行“线与” 的逻辑功能。串行8位双向数据传输位速率在rc 总线的标准模式下,其速率可达100 Kb/s,快速模式 下可达400 Kb/s,高速模式下可达3. 5 Mb/s。
I2C总线可构成多主和多从系统。在系统结构中,系统通过硬件或者软件仲裁获得总线控制权。在应用系统中,I2C总线多采用主从结构。I2C总线上的设备寻址由器件地址线决定,与总线相连的每个器件都对应一个特定的地址,同时采用软件寻址方式,并且可以通过访问地址最低位来控制W/R方向。I2C总线的数据传输格式如图2所示。
在I2C总线上发送数据的操作(针对WM8731/8731L类似的设备)过程一般可为4步:
第一步,启动START信号,接着写一个字节的设备地址,地址字节的高7位是设备有效地址,地址字节的最低1位代表准备写(低电平),然后等待ACK应答;
第二步,应继续写一个字节的rc设备内部数据访问地址,然后等待发出ACK;
第三步即可开始发送数据,发送的数据可以是一个字节,也可以连续发送N个字节,每发送完一个字节的数据,都需要等待一个应答ACK信号;
最后发送的是一个STOP信号,以结束发送操作。
在I2C总线上接收数据的操作(针对WM8731/8731L类似的设备)过程如下:
第一步,也是启动START信号,接着写一个字节的设备地址,地址字节的高7位是设备有效地址,地址字节的最低位代表准备写(低有效),然后等待ACK应答;
第二步,继续写一个字节的I2C器件内部数据访问地址,并等待ACK;
第三步,再次启动START信号,此时再写一个字节的设备地址,这个设备地址字节的最低1位若为高电品,则代表准备接收数据;
第四步,开始接收数据,数据可以是接收一个字节,也可以连续接收N个字节。在接收前面的N—1个字节后,每接收一个字节数据,都要产生一个ACK;
第五步,在接收最后一个字节数据前停止控制器生成ACK信号,然后等待最后一个字节的数据就绪后,再读取;
最后,发送一个STOP信号,以停止接收操作。
2 I2C总线的接口设计
2.1 总体内部架构设计
图3所示为rc总线接口中ip核的总体结构。该接口主要包括时钟发生器,字节命令控制器、位命令寄存器、数据I/O移位寄存器、发送与接收寄存器等几部分。
时钟发生器可用于产生时钟使能信号,该信号可触发位命令控制器的所有时钟同步操作。
字节命令控制器承担着I2C接口字节数据的传输任务。它从I2C寄存器中的命令寄存器中读取操作命令。这些命令可通过设置该寄存器中的某些位来完成,并且都是以字节为单位。
位命令寄存器负责总线上实际的数据传输工作,包括START和STOPo这些操作可通过控制SCL和SDA线来实现。
数据I/O移位寄存器中存储着当前数据传输所需要的数据。如果是读操作,移位寄存器将接收从SDA线上的逐位数据;如果是写操作,移位寄存器则将该数据逐位发送到SDA线上。
2.2 I2C接口控制器
I2C总线是通过二根线来连在器件之间进行通信的总线,它可根据地址识别每个器件。每个I2C设备都有自己固定的硬件地址。对于芯片WM8731/WM8731L的FC总线它的两个从地址为001_1011和001_1010oWM8731设备的控制操作可以描述为:首先发出该设备地址,和该设备建立连接,再向该设备读或写2个字节的数据,最后发出停止信号以结束I2C通讯。
对WM8731的控制实际上就是控制FC设备读/写数据,本文不涉及读数据而只介绍部分rc总线写数据的关键Verilog程序设计。
2.3 启动与停止程序
检测通讯启动与停止的Verilog程序如下:
always@(posedge mclk or negedge reset_n)
在主机方式下,完成启动与地址信号发送后,即开始发送数据。发送数据时,并串数据在SCL的下降沿移位,这样可保证SCL高电平时SDA数据的稳定。发送的进程由WR信号和从机的应答信号启动。为了保证时序正确和控制的可靠,软件程序可采用有限状态机来设计。其Verilog程序如下:
3 仿真结果
设计时,可以釆用Xilinx公司的集成开发工具ISE9.0,仿真工具使用SYNPOSYS的VCS仿真软件,图4所示是其仿真波形,由图可见,该设计是正确的。整个设计可以采用Verilog语言描述在LINUX平台上完成系统的仿真、综合、映射、布局。在得到正确的仿真结果后,通过器件编程(即通过编程器将设计下载到实际芯片中)来进行系统调试,直到最后实现。
4 结语
本文介绍了一种简易的音频soc的I2c总线接口的软件设计方法。该设计可以作为一个ip核方便地嵌入音频SoC的系统设计中,以用于对具有I2c接口的芯片ic芯片进行数据读写。目前,本设计已经在实践项目中投片,并已经通过实际系统的测试。