开篇:润墨网以专业的文秘视角,为您筛选了一篇基于Wolfson音频SoC的I2C总线接口设计范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
(电子科技大学 微电子与固体电子学院, 四川 成都610054)
摘要:随着I2C总线应用的越来越广泛,其电路简单,编程方便,易于系统标准化与维护的优点也日益显现出来。文章在分析了I2C总线的基本概念和工作原理的基础上,重点介绍了基于wolfson音频soc的I2c总线接口的系统结构和程序设计方法。
关键词:I2C总线; 音频; SoC; Wolfson
中图分类号:TP393文献标识码:A
文章编号:20951302(2011)04007203
Wolfson Audio SoC Based on the I2C Bus Interface Design
GU Yong, ZHAO Jianming
(University of Electronic Science and Technology Institute of Microelectronics and Solid State Electronics, Chengdu 610054, China)
Abstract: With the increasingly wide application of I2C 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 I2C bus with emphasis on the system structure and programming design of I2C bus interface based on Wolfson audio SoC.
Keywords: I2C; audio; SoC; Wolfson
收稿日期:20110328
0引言
I2C(InterIntegrated Communication)总线是Philips公司开发的一种高效、简单、双向、两线制同步串行总线,它仅需要两根线(串行数据线SDA和串行时钟线SCL)即可为连接到总线的设备提供简单有效的数据交换方式[1]。该总线可将各电路分割成各种功能的模块,并进行软件化设计,各个功能模块电路内部都集成有一个I2C总线接口电路,故可连接在总线上,从而很好地进行众多功能模块与MCU之间的输入输出接口,并使连接方式变得简便,同时可灵活地实现在线配置。本文采用Verilog HDL 设计了一个I2C总线的控制模块,该模块能够实现I2C的所有功能。此外,该模块可作为一个软核来方便地嵌入到音频SoC系统中,这就是当前非常流行的两线总线。
1I2C总线原理
通常将I2C总线主从机之间的一次数据传送称为一帧,一帧数据一般由启动信号、地址码、若干数据字节、应答信号位以及停止信号等组成。SDA和SCL都通过一个电流源或者上拉电阻连接到正的电源电压,图1所示是I2C总线上标准模式器件和快速模式器件之间的连接电路,由图1可见,当总线空闲时,这两条线路都是高电平,连接到总线的器件输出级必须是漏极开路或者集电极开路才能执行“线与”的逻辑功能。串行8位双向数据传输位速率在I2C总线的标准模式下,其速率可达100 Kb/s,快速模式下可达400 Kb/s,高速模式下可达3.5 Mb/s。
图1标准模式器件和快速模式器件的I2C总线连接方式
I2C总线可构成多主和多从系统。在系统结构中,系统通过硬件或者软件仲裁获得总线控制权。在应用系统中,I2C总线多采用主从结构。I2C总线上的设备寻址由器件地址线决定,与总线相连的每个器件都对应一个特定的地址,同时采用软件寻址方式,并且可以通过访问地址最低位来控制W/R方向。I2C总线的数据传输格式如图2所示[2]。
图2I2C总线通讯协议
在I2C总线上发送数据的操作(针对WM8731/8731L类似的设备)过程一般可为4步:
第一步,启动START信号,接着写一个字节的设备地址,地址字节的高7位是设备有效地址,地址字节的最低1位代表准备写(低电平),然后等待ACK应答;
第二步,应继续写一个字节的I2C设备内部数据访问地址,然后等待发出ACK;
第三步即可开始发送数据,发送的数据可以是一个字节,也可以连续发送N个字节,每发送完一个字节的数据,都需要等待一个应答ACK信号;
最后发送的是一个STOP信号,以结束发送操作。
在I2C总线上接收数据的操作(针对WM8731/8731L类似的设备)过程如下:
第一步,也是启动START信号,接着写一个字节的设备地址,地址字节的高7位是设备有效地址,地址字节的最低位代表准备写(低有效),然后等待ACK应答;
第二步,继续写一个字节的I2C器件内部数据访问地址,并等待ACK;
第三步,再次启动START信号,此时再写一个字节的设备地址,这个设备地址字节的最低1位若为高电品,则代表准备接收数据;
第四步,开始接收数据,数据可以是接收一个字节,也可以连续接收N个字节。在接收前面的N-1个字节后,每接收一个字节数据,都要产生一个ACK;
第五步,在接收最后一个字节数据前停止控制器生成ACK信号,然后等待最后一个字节的数据就绪后,再读取;
最后,发送一个STOP信号,以停止接收操作。
2I2C总线的接口设计
2.1总体内部架构设计
图3所示为I2C总线接口中IP核的总体结构。该接口主要包括时钟发生器,字节命令控制器、位命令寄存器、数据I/O移位寄存器、发送与接收寄存器等几部分。
图3I2C总线的IP核结构
时钟发生器可用于产生时钟使能信号,该信号可触发位命令控制器的所有时钟同步操作。
字节命令控制器承担着I2C接口字节数据的传输任务。它从I2C寄存器中的命令寄存器中读取操作命令。这些命令可通过设置该寄存器中的某些位来完成,并且都是以字节为单位。
位命令寄存器负责总线上实际的数据传输工作,包括START和STOP。这些操作可通过控制SCL和SDA线来实现。
数据I/O移位寄存器中存储着当前数据传输所需要的数据。如果是读操作,移位寄存器将接收从SDA线上的逐位数据;如果是写操作,移位寄存器则将该数据逐位发送到SDA线上。
2.2I2C接口控制器
I2C总线是通过二根线来连在器件之间进行通信的总线,它可根据地址识别每个器件。每个I2C设备都有自己固定的硬件地址。对于芯片WM8731/WM8731L 的I2C总线它的两个从地址为001_1011和001_1010。WM8731设备的控制操作可以描述为:首先发出该设备地址,和该设备建立连接,再向该设备读或写2个字节的数据,最后发出停止信号以结束I2C通讯[3]。
对WM8731的控制实际上就是控制I2C设备读/写数据,本文不涉及读数据而只介绍部分I2C总线写数据的关键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的I2C总线接口的软件设计方法。该设计可以作为一个IP核方便地嵌入音频SoC的系统设计中,以用于对具有I2C接口的芯片IC芯片进行数据读写。目前,本设计已经[LL]在实践项目中投片,并已经通过实际系统的测试。
参考文献
[1]Philips Semiconductors Data sheet \[S\]. I2C bus controller PCF8584, 1995.
[2]Maxim/dallas Semiconductors. DS1337 I2C Serial Realtime 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):911.
[5]戴立新,王泽勇,王黎,等.I2C总线接口的设计及验证\[J\].现代电子技术,2009,32(2):136138.
[6]韩红娟,李富华,王汉祥,等.中频解调电路中的I2C总线接口电路\[J\].现代电子技术,2010,33(12):14.
[7]谭昭禹,颜永红,马勋.音频子系统中的I2C接口电路设计\[J\].微计算机信息,2008,24(26):252254.