首页 > 范文大全 > 正文

基于Wolfson音频SoC的I2C总线接口设计

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于Wolfson音频SoC的I2C总线接口设计范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

(电子科技大学 微电子与固体电子学院, 四川 成都610054)

摘要:随着I2C总线应用的越来越广泛,其电路简单,编程方便,易于系统标准化与维护的优点也日益显现出来。文章在分析了I2C总线的基本概念和工作原理的基础上,重点介绍了基于wolfson音频soc的I2c总线接口的系统结构和程序设计方法。

关键词:I2C总线; 音频; SoC; Wolfson

中图分类号:TP393文献标识码:A

文章编号:20951302(2011)04007203

Wolfson Audio SoC Based on the I2C Bus Interface Design

GU Yong, ZHAO Jianming

(University of Electronic Science and Technology Institute of Microelectronics and Solid State Electronics, Chengdu 610054, China)

Abstract: With the increasingly wide application of I2C bus, its advantages have been shown of simple circuit, easy programming, liability to standardization and convenient maintenance. The paper introduces the basic conception and working principle of I2C bus with emphasis on the system structure and programming design of I2C bus interface based on Wolfson audio SoC.

Keywords: I2C; audio; SoC; Wolfson

收稿日期:20110328

0引言

I2C(InterIntegrated Communication)总线是Philips公司开发的一种高效、简单、双向、两线制同步串行总线,它仅需要两根线(串行数据线SDA和串行时钟线SCL)即可为连接到总线的设备提供简单有效的数据交换方式[1]。该总线可将各电路分割成各种功能的模块,并进行软件化设计,各个功能模块电路内部都集成有一个I2C总线接口电路,故可连接在总线上,从而很好地进行众多功能模块与MCU之间的输入输出接口,并使连接方式变得简便,同时可灵活地实现在线配置。本文采用Verilog HDL 设计了一个I2C总线的控制模块,该模块能够实现I2C的所有功能。此外,该模块可作为一个软核来方便地嵌入到音频SoC系统中,这就是当前非常流行的两线总线。

1I2C总线原理

通常将I2C总线主从机之间的一次数据传送称为一帧,一帧数据一般由启动信号、地址码、若干数据字节、应答信号位以及停止信号等组成。SDA和SCL都通过一个电流源或者上拉电阻连接到正的电源电压,图1所示是I2C总线上标准模式器件和快速模式器件之间的连接电路,由图1可见,当总线空闲时,这两条线路都是高电平,连接到总线的器件输出级必须是漏极开路或者集电极开路才能执行“线与”的逻辑功能。串行8位双向数据传输位速率在I2C总线的标准模式下,其速率可达100 Kb/s,快速模式下可达400 Kb/s,高速模式下可达3.5 Mb/s。

图1标准模式器件和快速模式器件的I2C总线连接方式

I2C总线可构成多主和多从系统。在系统结构中,系统通过硬件或者软件仲裁获得总线控制权。在应用系统中,I2C总线多采用主从结构。I2C总线上的设备寻址由器件地址线决定,与总线相连的每个器件都对应一个特定的地址,同时采用软件寻址方式,并且可以通过访问地址最低位来控制W/R方向。I2C总线的数据传输格式如图2所示[2]。

图2I2C总线通讯协议

在I2C总线上发送数据的操作(针对WM8731/8731L类似的设备)过程一般可为4步:

第一步,启动START信号,接着写一个字节的设备地址,地址字节的高7位是设备有效地址,地址字节的最低1位代表准备写(低电平),然后等待ACK应答;

第二步,应继续写一个字节的I2C设备内部数据访问地址,然后等待发出ACK;

第三步即可开始发送数据,发送的数据可以是一个字节,也可以连续发送N个字节,每发送完一个字节的数据,都需要等待一个应答ACK信号;

最后发送的是一个STOP信号,以结束发送操作。

在I2C总线上接收数据的操作(针对WM8731/8731L类似的设备)过程如下:

第一步,也是启动START信号,接着写一个字节的设备地址,地址字节的高7位是设备有效地址,地址字节的最低位代表准备写(低有效),然后等待ACK应答;

第二步,继续写一个字节的I2C器件内部数据访问地址,并等待ACK;

第三步,再次启动START信号,此时再写一个字节的设备地址,这个设备地址字节的最低1位若为高电品,则代表准备接收数据;

第四步,开始接收数据,数据可以是接收一个字节,也可以连续接收N个字节。在接收前面的N-1个字节后,每接收一个字节数据,都要产生一个ACK;

第五步,在接收最后一个字节数据前停止控制器生成ACK信号,然后等待最后一个字节的数据就绪后,再读取;

最后,发送一个STOP信号,以停止接收操作。

2I2C总线的接口设计

2.1总体内部架构设计

图3所示为I2C总线接口中IP核的总体结构。该接口主要包括时钟发生器,字节命令控制器、位命令寄存器、数据I/O移位寄存器、发送与接收寄存器等几部分。

图3I2C总线的IP核结构

时钟发生器可用于产生时钟使能信号,该信号可触发位命令控制器的所有时钟同步操作。

字节命令控制器承担着I2C接口字节数据的传输任务。它从I2C寄存器中的命令寄存器中读取操作命令。这些命令可通过设置该寄存器中的某些位来完成,并且都是以字节为单位。

位命令寄存器负责总线上实际的数据传输工作,包括START和STOP。这些操作可通过控制SCL和SDA线来实现。

数据I/O移位寄存器中存储着当前数据传输所需要的数据。如果是读操作,移位寄存器将接收从SDA线上的逐位数据;如果是写操作,移位寄存器则将该数据逐位发送到SDA线上。

2.2I2C接口控制器

I2C总线是通过二根线来连在器件之间进行通信的总线,它可根据地址识别每个器件。每个I2C设备都有自己固定的硬件地址。对于芯片WM8731/WM8731L 的I2C总线它的两个从地址为001_1011和001_1010。WM8731设备的控制操作可以描述为:首先发出该设备地址,和该设备建立连接,再向该设备读或写2个字节的数据,最后发出停止信号以结束I2C通讯[3]。

对WM8731的控制实际上就是控制I2C设备读/写数据,本文不涉及读数据而只介绍部分I2C总线写数据的关键Verilog程序设计。

[BT3+*3]2.3启动与停止程序

检测通讯启动与停止的Verilog程序如下:

always @(posedge mclk or negedge reset_n)

begin:DETECT_START_STOP 

if(!reset_n)begin

start

stop

end

else begin

if(!mode)begin

//产生开始信号

if((!i2c_sda_now&&i2c_sda_prev)

&&i2c_scl_now)

start

else

start

//检测停止信号

if((i2c_sda_now&&!i2c_sda_prev)

&&i2c_scl_now)

stop

else

stop

end 

else begin

start

end end

在主机方式下,完成启动与地址信号发送后,即开始发送数据。发送数据时,并串数据在SCL的下降沿移位,这样可保证SCL高电平时SDA数据的稳定。发送的进程由WR信号和从机的应答信号启动。为了保证时序正确和控制的可靠,软件程序可采用有限状态机来设计。其Verilog程序如下:

always @(*)

begin:FSM_COM

ack_flag= 1'b0;

reg_read_nxt=1'b0;

bit_count_nxt= 8'h00;

case(state)

FSM_ADDR_BIT1: begin

if(start)begin

if(sda==dev_addr[6])//dev_addr bit meet

state_nxt= FSM_ADDR_BIT2;

else

state_nxt = FSM_ADDR_BIT1;

end end

FSM_ADDR_BIT2: begin

if(start)begin

if(sda==dev_addr[5])//dev_addr bit meet

state_nxt= FSM_ADDR_BIT3;

else

state_nxt = FSM_ADDR_BIT1;

end end

….类似递推…..

FSM_ADDR_BIT7: begin

if(start)begin

if(sda==dev_addr[0])//dev_addr bit meet

state_nxt= FSM_ADDR_BIT;

else

state_nxt = FSM_ADDR_BIT1;

end end

FSM_W_R_BIT: begin

if(stop)

state_nxt = FSM_IDLE_BIT1;

else begin

state_nxt = FSM_SEND_ACK1;

if(sda) //1 means read

reg_read_nxt= 1'b1;

else

reg_read_nxt= 1'b0;

end end

FSM_SEND_ACK1:begin

if(stop)

state_nxt = FSM_ADDR_BIT1;

else begin

ack_flag =1;

state_nxt = FSM_FIRST_8BIT;

end end

FSM_FIRST_8BIT: begin

//发送第1个字节控制地址数据

if(stop)

state_nxt = FSM_ADDR_BIT1;

else begin

if(&bit_count)begin

bit_count_nxt =3'b000;

data_rev_nxt= {data_rev_nxt[6:0],sda};

state_nxt = FSM_SEND_ACK2;

end

else begin

bit_count_nxt = bit_count+1'b1;

//数据载入

data_rev_nxt= {data_rev_nxt[6:0],sda}; 

state_nxt =FSM_FIRST_8BIT;

end end end

FSM_SEND_ACK2:begin

if(stop)

state_nxt = FSM_ADDR_BIT1;

else begin

ack_flag =1;

state_nxt = FSM_SECOND_8BIT;

end end

3仿真结果

设计时,可以采用Xilinx公司的集成开发工具ISE9.0,仿真工具使用SYNPOSYS的VCS仿真软件,图4所示是其仿真波形,由图可见,该设计是正确的。整个设计可以采用Verilog语言描述在LINUX平台上完成系统的仿真、综合、映射、布局。在得到正确的仿真结果后,通过器件编程(即通过编程器将设计下载到实际芯片中)来进行系统调试,直到最后实现。

图4整体和部分仿真小形图

4结语

本文介绍了一种简易的音频SoC的I2C总线接口的软件设计方法。该设计可以作为一个IP核方便地嵌入音频SoC的系统设计中,以用于对具有I2C接口的芯片IC芯片进行数据读写。目前,本设计已经[LL]在实践项目中投片,并已经通过实际系统的测试。

参考文献

[1]Philips Semiconductors Data sheet \[S\]. I2C bus controller PCF8584, 1995.

[2]Maxim/dallas Semiconductors. DS1337 I2C Serial Realtime Clock(Data sheet), Rev[Z].092706.

[3]Wolfson Microelectronics Data Sheet\[S\]. Portable internet audio codec with headphone driver and programmable sample rates, 2000.

[4]李仕专,李维涛,符天,等.基于矩阵乘法器的MP3解码优化设计\[J\].现代电子技术,2010,33(22):911.

[5]戴立新,王泽勇,王黎,等.I2C总线接口的设计及验证\[J\].现代电子技术,2009,32(2):136138.

[6]韩红娟,李富华,王汉祥,等.中频解调电路中的I2C总线接口电路\[J\].现代电子技术,2010,33(12):14.

[7]谭昭禹,颜永红,马勋.音频子系统中的I2C接口电路设计\[J\].微计算机信息,2008,24(26):252254.