当前位置:文档之家› 模拟I2C协议

模拟I2C协议

模拟I2C协议

在现代电子系统中,有为数众多的IC需要相互之间以及与外界的通信。为了简化电路的设计,Philips公司开发了一种用于内部IC控制的简单的双向两线串行总线I2C(Intel-Integrated Circuit bus)。1998年当推出I2C总线协议2.0版本时,I2C协议实际上已经成为一个国际标准。

在进行FPGA设计时,经常需要和外围提供I2C接口的芯片通信。例如低功耗的CMOS实时时钟/日历芯片PCF8563、LCD驱动芯片PCF8574、键盘/LED 驱动器ZLG7290等都提供I2C接口。因此在FPGA中模拟I2C接口已成为FPGA 开发必要的步骤。

本章将详细讲解在FPGA芯片中使用VHD/Verilog HDL模拟I2C协议,以及编写TestBench仿真和测试程序的方法。

4.1 I2C总线解析

下面先对I2C协议中有关数据格式和时序的内容进行介绍,这里没有涉及的地方请参考THE I2C-SPECIFICATION VERSION2.1 JANUARY 2000.

4.1.1 I2C总线概述

I2C协议作为一个串行总线标准尽管没有并行总线的数据吞吐能力,但是它的以下特点使其有着广泛的应用。

●只需要两条总线——串行数据线SDA和串行时钟线SCL;

●每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主/

从节点关系软件设定地址,主节点可以发送数据或接收数据;

●是真正的多主总线,当两个或更多主节点同时初始化数据传输时,可

以通过冲突检测和仲裁防止数据被破坏;

●串行的8位双向数据传输位速率在标准模式下可达100kbit/s,快速模

式下可达400kbit/s,高速模式下可达3.4Mbit/s;

●片上的滤波器可以滤去总线数据线上的毛刺波,保证数据完整;

●连接到相同总线的IC数量只受到总线的最大电容(400pF)限制。

总线不仅仅是互连的线,还包含系统通信的所有格式和过程。I2C总线结构上的特点保证了其应用时的简洁,另外其完备的协议避免了所有混乱、数据丢失和妨碍信息的可能性。

4.1.2 I2C协议的基本概念

I2C总线支持任何IC生产过程(NMOS、CMOS和双极性)。串行数据线SDA 和串行时钟线SCL在连接到总线的器件间传递信息。每个器件都有一个唯一的地址作为识别的标志(无论是微控制器、LCD驱动器存储器还是键盘接口),并且都可以发送数据和接收数据。很明显LCD驱动器只需要接收数据,而存储器需要接收和发送数据。图4-1所示的是一个高性能集成电视的例子。

图4-1 高性能集成电视

从图4-1可以看到,应用I2C总线是非常方便的。用通俗的话讲I2C总线的硬件设计工作就是连接SDA和SCL两条线,依靠I2C协议完成软件工作。在I2C

协议中应理解如下的概念。

1.主/从节点

主节点负责初始化总线的数据传输,并产生允许传输的时钟信号。此时任何被寻址的器件都被认为是从节点。当有多个主节点在总线上传输数据时,每个主节点产生自己的时钟信号。挂接到总线上的所有外围器件、外设接口都是总线上的节点。

2.总线上节点的寻址方式

在任何时刻总线上只有一个主控器件(主节点)实现总线的控制操作,对总线上的其他节点寻址,可分时实现点-点的数据传送。因此总线上每个节点都有一个固定的节点地址。

I2C总线上主节点的地址由软件给定,此地址存放在I2C总线的地址寄存器中。I2C总线上所有的外围器件都有规范的器件地址。器件地址由7位数字组成,它和1位方向位构成了I2C总线器件的寻址字节SLA(Slave address)。器件地址是I2C总线外围接口器件固有的地址编码,器件出厂时就已给定。数据方向位规定了总线上主节点对从节点的数据传送方向。

4.1.3 I2C协议的时序要求

1.总线上数据传递时序

I2C总线上数据传递时序如图4-2所示,具体步骤如下。

●首先主节点器件发送一个起始信号。

●接下来主节点器件发送从节点地址和读写方式,一共8位。其中从节点

地址7位,读写方式1位。

●与传输地址一致的从节点器件应答(即ACK)。

●开始数据传输,传输数据数量不限。每个字节(八位)后面跟接收数据

方的应答位。例如主节点器件读取从节点数据,从节点发送数据,主节

点应答;主节点器件写数据到从节点,主节点发送数据,从节点应答。

●数据传输结束,主节点器件发送一个终止信号结束整个过程。

采用I2C总线后对传送的字节数没有限制,只要求每传送一个字节后对方回应一个应答位。在发送时首先发送的是数据的最高位(MSB,Most Singnificant Bit)。每次传送开始有起始信号,结束时有停止信号。在总线传送完一个字节后,

可以通过对时钟线(SCL)的控制使传送暂停。例如当某个外围器件接收N个字节数据后需要一段处理时间以使继续接收以后的字节数据,这时可在应答信号后使SCL变为低电平控制总线暂停。如果主节点要求总线暂停也可使时钟线保持低电平控制总线暂停。

2.总线上的时序信号

I2C总线为同步传输总线,总线信号完全与时钟同步。I2C总线上与数据传送有关的信号有起始信号S、终止信号P、应答信号A以及位传送信号。下面将对这些信号一一介绍。

(1)起始信号

起始信号(Start Condition)如图4-3所示。当时钟线SCL为高电平时,数据线SDA从高电平向低电平变化将形成起始信号,启动I2C总线。

(2)终止信号

终止信号(Stop Condition)如图4-3所示。当时钟线SCL为高电平时,数据线SDA从低电平向高电平变化将形成终止信号,停止I2C总线。

(3)应答信号

如图4-3所中ACK第9个时钟脉冲对应应答位,相应数据线上低电平时为应答信号,高电平时为非应答信号。

(4)位传送信号

在I2C总线启动后或应答信号后的第1~8个时钟脉冲对应于一个字节的8位数据传送。脉冲高电平期间,数据串行传送;低电平期间为数据准备,允许总线上数据电平变换。

4.2 模拟I2C接口程序的基本框架

图4-4 模拟I2C接口程序的基本框架

1.程序接口

用于和应程序连接的接口,将应用程序的按照I2C协议的方式通过SDA传递给外部器件。包括下列内容:

●clk_I FPGA外部时钟信号。

●rst_I 同步重起信号。

●arst_I 异步重起信号。

●adr_I 从节点地址。

●dat_I 输入数据。

●dat_o 输出数据。

●we_I 写有效信号。

●stb_I 接口有效信号。

●cyc_I 有效总线周期输入。

●ack_o 应答信号输出。

●inta_o 中断信号输出。

2.时钟设置寄存器

I2C协议提供了3种速度模式:正常速度模式100kbit/s、快速模式400kbit/s、高速模式3.5Mbit/s。SCL输出的时钟信号频率和速度模式一致。程序内部使用5

倍SCL信号作为时钟,而FPGA外部时钟需要经过分频行到程序内部使用的时钟。

例如:采用正常速度100kbit/s,FPGA外部时钟为50MHz,则时钟设置寄存器需要设置为(50MHz/5*100kHz=99)。

3.时钟产生模块

时钟产生模块产生4倍SCL频率的时钟信号,它为位传输控制模块中所有同步动作提供触发信号。

4.命令寄存器

倒序寄存器共8位,它决定是否在总线上产生各种时序信号、是否读/写数据,各位表示的含义如表4-1所示。

表4-1 命令寄存器内容

5.状态寄存器

状态寄存器用来显示当前总线的状态,例如是否接收到从节点的应答信号、是否忙、是否在传递数据等,具体内容如表4-2所示。

表4-2 状态寄存器内容

6.数据传输寄存器

数据传输寄存器用于保存等待传输的数据。当传递从节点地址信息时,前7位保存从节点地址,最后一位保存读写命令;当传递普通数据时,8位保存一个字节数据。数据传输寄存器具体内容如表4-3所示。

表4-3 数据传输寄存器内容

7.数据接收寄存器

数据接收寄存器用于保存通过I2C总线接收到的最后一个字节内容,具体内容如表4-4所示。

表4-4 数据接收寄存器内容

8.字节传输控制模块

字节传输控制模块以字节为单位控制I2C总线的数据传输。这个模块按照命令寄存器设置的内容将数据传输寄存器内容传递到I2C总线的接收端,或者从I2C 总线发关端接收数据并保存到数据接收寄存器中。

9.位传输控制模块

位传输控制模块以痊为单位I2C总线的数据传输和产生各个I2C协议命令(如开始、停止、重复开始等)。字节传输控制模块控制位传输控制模块的各种动作。例如读取一个字节数据,位传输控制模块需要执行8个读的命令。

10.数据移位寄存器

数据移位寄存器保存的数据总是和当前的数据传输相关的。例如在进行读操作时,主节点通过移位寄存器依次通过SDA获得来自I2C发送端的数据,完成后数据拷贝到数据接收寄存器中。在写操作时,数据传输寄存器中的数据拷贝到数据移位寄存器中,然后依次通过SDA将数据传输到I2C总线的接收端。

4.3 I2C协议的具体实现

FPGA设计一般按照从顶向下的模式进行:首先设计芯片功能,规划各个模块功能;然后按照规划实现各个模块。本实例由3个代码文件组成:i2c_master_bit_ctrl.v完成位传输的功能、i2c_master_byte_ctrl.v完成字节传输的功能、i2c_master_top.v完成整个程序的控制功能,并提供给外部程序的接口。

在ISE中创建一个项目,然后加入上面3个文件。下面依次介绍3个文件的内容。

4.3.1位传输的实现

i2c_master_bit_ctrl.v完成位传输的功能。位传输的功能包括数据按位传输的实现和I2C协议各个命令的实现两部分。

如图4-5所示开始和重复开始命令的产生包括5个阶段:idle和A、B、C、D等。读、写一个字节通过8次位操作完成,

实现代码如下:

`include"timescale.v"

`include"i2c_master_defines.v"

//模块名称及IO

module i2c_master_bit_ctrl(

clk,rst,nReset,

clk_cnt,ena,cmd,cmd_ack,busy,al,din,dout,

scl_i,scl_o,sel_oen,sda_i,sda_o,sda_oen

);

图4-5 位传输完成数据的传输和各个命令的实现

//输入、输出

input clk;

input rst;

input nReset;

input ena; //模块使用信号

input[15:0] clk_cnt, //时钟分频系数

input [3:0] cmd;

output cmd_ack; //命令完成应答

reg cmd_ack;

output busy; //总线忙

reg busy;

output al; //总线仲裁丢失

reg al;

input din;

output dout;

reg dout;

//I2C连线

input scl_i; //I2C时钟输入

output scl_o; //I2C时钟输出

output scl_oen; //I2C时钟输出使能

reg scl_oen;

// variabl declarations

reg sSCL,sSDA; //同步后的SCL和SDA输入

teg dscl_oen; //延迟后的scl_oen

reg sda_chk; //检查后的SDA output(Multi-master arbitration) reg clk_en; //时钟产生信号

wire slave_wait;

reg [15:0] ent; //时钟分频计数器

//模块主体

//当从节点没有准备好时,下拉SCL来延迟周期

//延迟scl_oen

always @(posedge clk)

dscl_oen<=#1 scl_oen;

assign slave_wait=dscl_oen&&!sSCL;

//产生时钟使能信号

always @(posedge clk or negedge nReset)

if(~nReset)

begin

cnt <=#1 16`h0;

clk_en<=#1 1`b1;

end

else

begin

cnt <=#1 cnt;

clk_en<=#1 1`b0;

end

else

begin

cnt <=#1 cnt-16`h1;

clk_en<=#1 1`b0;

end

//产生总线状态控制信号

reg dSCL,dSDA;

reg sta_condition;

reg sto_condition;

//同步SCL和SDA输入信号,减少不稳定风险

always @(posedge clk or negedge nReset)

if(~nReset)

begin

sSCL<=#1 1`b1;

sSDA<=#1 1`b1;

dSCL<=#1 1`b1;

dSDA<=#1 1`b1;

end

else

begin

sSCL<=#1 scl_i;

sSDA<=#1 sda_i;

dSCL<=#1 sSCL;

dSDA<=#1 sSDA;

end

//SCL处于高时检测到SDA的下降沿,即检测开始状态信号//SCL处于高时检测到SDA的上升沿,即检测停止状态信号always @(posedge clk or negedge nReset)

if(~nReset)

begin

sta_condition<=#1 1`b0;

sto_condition<=#1 1`b0;

end

else if(rst)

begin

sta_condition<=#1 1`b0;

sto_condition<=#1 1`b0;

end

else

begin

sta_condition<=#1~sSDA & dSDA&sSCL;

sto_condition<=#1 sSDA &~dSDA&sSCL;

end

//产生I2C总线忙信号

always@(posedge clk or negedge nReset)

if(!nReset)

busy<=#1 1`b0;

else if(rst)

busy<=#1 1`b0;

else

busy<=#1(sta_condition︱busy)&~sto_condition;

//产生仲裁丢失信号generate arbitration lost signal

//仲裁丢失发生在:

//1)主节点驱动SDA处于高,但是I2C总线一直处于低

//2)没有请求时却检测到停止状态信号

reg cmd_stop,dcmd_stop;

always@(posedge clk or negedge nReset)

if(~nReset)

begin

cmd_stop <=#1 1`b0;

dcmd_stop<=#1 1`b0;

al <=#1 1`b0;

end

else if(rst)

begin

cmd_stop <=#1 1`b0;

dcmd_stop<=#1 1`b0;

al <=#1 1`b0;

end

else

begin

cmd_stop <=#1 cmd==`12C_CMD_STOP;

dcmd_stop<=#1 cmd_stop;

al <=#1(sda_chk & ~sSDA & sda_oen)︱(sto_condition & ~dcmd_stop

end

//产生数据输出信号,在SCL信号的上升沿保存SDA

always@(posedge clk)

if(sSCL & ~dSCL)

dout<=#1 sSDA;

//产生状态机

//状态译码

parameter[16:0]idle =17`b0_0000_0000_0000_0000;

parameter[16:0]start_a=17`b0_0000_0000_0000_0001;

parameter[16:0]start_b=17`b0_0000_0000_0000_0010; parameter[16:0]start_c=17`b0_0000_0000_0000_0100; parameter[16:0]start_d=17`b0_0000_0000_0000_1000; parameter[16:0]start_e=17`b0_0000_0000_0001_0000; parameter[16:0]stop_a=17`b0_0000_0000_0010_0000; parameter[16:0]stop_b=17`b0_0000_0000_0100_0000; parameter[16:0]stop_c=17`b0_0000_0000_1000_0000; parameter[16:0]stop_d=17`b0_0000_0001_0000_0000; parameter[16:0]rd_a =17`b0_0000_0010_0000_0000; parameter[16:0]rd_b =17`b0_0000_0100_0000_0000; parameter[16:0]rd_c =17`b0_0000_1000_0000_0000; parameter[16:0]rd_a =17`b0_0001_0000_0000_0000; parameter[16:0]wr_a =17`b0_0010_0000_0000_0000; parameter[16:0]wr_b =17`b0_0100_0000_0000_0000; parameter[16:0]wr_c =17`b0_1000_0000_0000_0000; parameter[16:0]wr_d =17`b1_0000_0000_0000_0000; reg[16:0]c_state;

//状态机

always@(posedge clk or negedge nReset)

if(!nReset)

begin

c_state<=#1 idle;

cmd_ack<=#1 1`b0;

scl_oen<=#1 1`b1;

sda_oen<=#1 1`b1;

sda_chk<=#1 1`b0;

end

else if(rst︱al)

begin

c_state<=#1 idle;

cmd_ack<=#1 1`b0;

scl_oen<=#1 1`b1;

sda_oen<=#1 1`b1;

sda_chk<=#1 1`b0;

end

else

begin

cmd_ack <=#1 1`b0;

if(clk_en)

case(c_state)

//idle状态

idle:

begin

case(cmd)

`12C_CMD_START:

c_state<=#1 start_a;

`12C_CMD_STOP:

c_state<=#1 stop_a;

`12C_CMD_WRITE:

c_state<=#1 wr_a;

`12C_CMD_READ:

c_state<=#1 rd_a;

default:

c_state<=#1 idle;

endcase

scl_oen<=#1 scl_oen; //保持SCL在同一状态

sda_oen<=#1 sda_oen; //保持SDA在同一状态

sda_chk<=#1 1`b0; //不检查SDA输出

end

//开始状态

start_a:

begin

c_state<=#1 start_b;

scl_oen<=#1scl_oen; //保持SCL在同一状态sda_oen<=#1 1`b1; //保持SDA处于高

sda_chk<=#1 1`b0; //不检查SDA的输出end

start_b:

begin

c_state<=#1 start_c;

scl_oen<=#1 1`b1;

sda_oen<=#1 1`b1;

sda_chk<=#1 1`b0;

end

start_c:

begin

c_state<=#1 start_d;

scl_oen<=#1 1`b1;

sda_oen<=#1 1`b0;

sda_chk<=#1 1`b0;

end

start_d:

begin

c_state<=#1 start_e;

scl_oen<=#1 1`b1;

sda_oen<=#1 1`b0;

sda_chk<=#1 1`b0;

end

start_e:

begin

c_state<=#1 idle;

cmd_ack<=#1 1`b1;

scl_oen<=#1 1`b0;

sda_oen<=#1 1`b0;

sda_chk<=#1 1`b0; end

//停止状态

stop_a:

begin

c_state<=#1 stop_b;

scl_oen<=#1 1`b0;

sda_oen<=#1 1`b0;

sda_chk<=#1 1`b0; end

stop_b:

begin

c_state<=#1 stop_c;

scl_oen<=#1 1`b1;

sda_oen<=#1 1`b0;

sda_chk<=#1 1`b0; end

stop_c:

begin

c_state<=#1 stop_d;

scl_oen<=#1 1`b1;

sda_oen<=#1 1`b0;

sda_chk<=#1 1`b0; end

stop_d:

c_state<=#1 idle;

cmd_ack<=#1 1`b1;

scl_oen<=#1 1`b1;

sda_oen<=#1 1`b1;

sda_chk<=#1 1`b0;

end

//读状态

rd_a:

begin

c_state<=#1 ra_b;

scl_oen<=#1 1`b0; //保持SCL处于低sda_oen<=#1 1`b1; //SDA处于三态

sda_chk<=#1 1`b0; //不检查SDA输出end

rd_b:

begin

c_state<=#1 ra_c;

scl_oen<=#1 1`b1;

sda_oen<=#1 1`b1;

sda_chk<=#1 1`b0;

end

rd_c:

begin

c_state<=#1 ra_d;

scl_oen<=#1 1`b1;

sda_oen<=#1 1`b1;

sda_chk<=#1 1`b0;

end

rd_d:

c_state<=#1 idle;

cmd_ack<=#1 1`b1;

scl_oen<=#1 1`b0;

sda_oen<=#1 1`b1;

sda_chk<=#1 1`b0; end

//写状态

wr_a:

begin

c_state<=#1 wr_b;

scl_oen<=#1 1`b0;

sda_oen<=#1 din;

sda_chk<=#1 1`b0; end

wr_b:

begin

c_state<=#1 wr_c;

scl_oen<=#1 1`b1;

sda_oen<=#1 din;

sda_chk<=#1 1`b1; end

wr_c:

begin

c_state<=#1 wr_d;

scl_oen<=#1 1`b1;

sda_oen<=#1 din;

sda_chk<=#1 1`b1;

wr_d:

begin

c_state<=#1 idle;

cmd_ack<=#1 1`b1;

scl_oen<=#1 1`b0;

sda_oen<=#1 din;

sda_chk<=#1 1`b0;

end

endcase

end

//分配SCL和SDA输出一直处于低

assign scl_o=1`b0;

assign sda_o=1`b0;

endmodule

4.3.2 字节传输的实现

字节传输的具体实现流程如图4-6所示。

I2C 协议标准完全版,很详细

THE I 2C-BUS SPECIFICATION VERSION 2.1 JANUARY 2000

CONTENTS 1PREFACE. . . . . . . . . . . . . . . . . . . . . . . . . . .3 1.1Version 1.0 - 1992. . . . . . . . . . . . . . . . . . . . 3 1.2Version 2.0 - 198. . . . . . . . . . . . . . . . . . . . . 3 1.3Version 2.1 - 1999. . . . . . . . . . . . . . . . . . . . 3 1.4Purchase of Philips I2C-bus components . . 3 2THE I2C-BUS BENEFITS DESIGNERS AND MANUFACTURERS. . . . . . . . . . . . . . .4 2.1Designer benefits . . . . . . . . . . . . . . . . . . . . 4 2.2Manufacturer benefits. . . . . . . . . . . . . . . . . 6 3INTRODUCTION TO THE I2C-BUS SPECIFICATION . . . . . . . . . . . . . . . . . . . . .6 4THE I2C-BUS CONCEPT . . . . . . . . . . . . . . .6 5GENERAL CHARACTERISTICS . . . . . . . . .8 6BIT TRANSFER . . . . . . . . . . . . . . . . . . . . . .8 6.1Data validity . . . . . . . . . . . . . . . . . . . . . . . . 8 6.2START and STOP conditions. . . . . . . . . . . 9 7TRANSFERRING DATA. . . . . . . . . . . . . . .10 7.1Byte format . . . . . . . . . . . . . . . . . . . . . . . . 10 7.2Acknowledge. . . . . . . . . . . . . . . . . . . . . . . 10 8ARBITRATION AND CLOCK GENERATION . . . . . . . . . . . . . . . . . . . . . .11 8.1Synchronization . . . . . . . . . . . . . . . . . . . . 11 8.2Arbitration . . . . . . . . . . . . . . . . . . . . . . . . . 12 8.3Use of the clock synchronizing mechanism as a handshake. . . . . . . . . . . 13 9FORMATS WITH 7-BIT ADDRESSES. . . .13 107-BIT ADDRESSING . . . . . . . . . . . . . . . . .15 10.1Definition of bits in the first byte . . . . . . . . 15 10.1.1General call address. . . . . . . . . . . . . . . . . 16 10.1.2START byte . . . . . . . . . . . . . . . . . . . . . . . 17 10.1.3CBUS compatibility. . . . . . . . . . . . . . . . . . 18 11EXTENSIONS TO THE STANDARD- MODE I2C-BUS SPECIFICATION . . . . . . .19 12FAST-MODE. . . . . . . . . . . . . . . . . . . . . . . .19 13Hs-MODE . . . . . . . . . . . . . . . . . . . . . . . . . .20 13.1High speed transfer. . . . . . . . . . . . . . . . . . 20 13.2Serial data transfer format in Hs-mode. . . 21 13.3Switching from F/S- to Hs-mode and back . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2313.4Hs-mode devices at lower speed modes. . 24 13.5Mixed speed modes on one serial bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 13.5.1F/S-mode transfer in a mixed-speed bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 13.5.2Hs-mode transfer in a mixed-speed bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 13.5.3Timing requirements for the bridge in a mixed-speed bus system. . . . . . . . . . . . . . 27 1410-BIT ADDRESSING. . . . . . . . . . . . . . . . 27 14.1Definition of bits in the first two bytes. . . . . 27 14.2Formats with 10-bit addresses. . . . . . . . . . 27 14.3General call address and start byte with 10-bit addressing. . . . . . . . . . . . . . . . . . . . 30 15ELECTRICAL SPECIFICATIONS AND TIMING FOR I/O STAGES AND BUS LINES. . . . . . . . . . . . . . . . . . . . 30 15.1Standard- and Fast-mode devices. . . . . . . 30 15.2Hs-mode devices. . . . . . . . . . . . . . . . . . . . 34 16ELECTRICAL CONNECTIONS OF I2C-BUS DEVICES TO THE BUS LINES . 37 16.1Maximum and minimum values of resistors R p and R s for Standard-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 39 17APPLICATION INFORMATION. . . . . . . . . 41 17.1Slope-controlled output stages of Fast-mode I2C-bus devices. . . . . . . . . . . . 41 17.2Switched pull-up circuit for Fast-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 41 17.3Wiring pattern of the bus lines. . . . . . . . . . 42 17.4Maximum and minimum values of resistors R p and R s for Fast-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 42 17.5Maximum and minimum values of resistors R p and R s for Hs-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 42 18BI-DIRECTIONAL LEVEL SHIFTER FOR F/S-MODE I2C-BUS SYSTEMS . . . . 42 18.1Connecting devices with different logic levels. . . . . . . . . . . . . . . . . . . . . . . . . 43 18.1.1Operation of the level shifter . . . . . . . . . . . 44 19DEVELOPMENT TOOLS AVAILABLE FROM PHILIPS. . . . . . . . . . . . . . . . . . . . . 45 20SUPPORT LITERATURE . . . . . . . . . . . . . 46

简单的I2C协议理解 i2c程序(调试通过)

简单的I2C协议理解 一. 技术性能: 工作速率有100K和400K两种; 支持多机通讯; 支持多主控模块,但同一时刻只允许有一个主控; 由数据线SDA和时钟SCL构成的串行总线; 每个电路和模块都有唯一的地址; 每个器件可以使用独立电源 二. 基本工作原理: 以启动信号START来掌管总线,以停止信号STOP来释放总线; 每次通讯以START开始,以STOP结束; 启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R /W位为0表示由主控向被控器件写数据,R/W为1表示由主控向被控器件读数据; 当被控器件检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信号; 每个数据字节在传送时都是高位(MSB)在前; 写通讯过程: 1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线; 2. 发送一个地址字节(包括7位地址码和一位R/W); 3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK); 4. 主控收到ACK后开始发送第一个数据字节; 5. 被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束; 6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线; 读通讯过程: 1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线; 2. 发送一个地址字节(包括7位地址码和一位R/W); 3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信

号(ACK); 4. 主控收到ACK后释放数据总线,开始接收第一个数据字节; 5. 主控收到数据后发送ACK表示继续传送数据,发送NACK表示传送数据结束; 6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线; 四. 总线信号时序分析 1. 总线空闲状态 SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高; 2. 启动信号START 时钟信号SCL保持高电平,数据信号SDA的电平被拉低(即负跳变)。启动信号必须是跳变信号,而且在建立该信号前必修保证总线处于空闲状态; 3. 停止信号STOP 时钟信号SCL保持高电平,数据线被释放,使得SDA返回高电平(即正跳变),停止信号也必须是跳变信号。 4. 数据传送 SCL线呈现高电平期间,SDA线上的电平必须保持稳定,低电平表示0(此时的线电压为地电压),高电平表示1(此时的电压由元器件的VDD决定)。只有在SCL线为低电平期间,SDA上的电平允许变化。 5. 应答信号ACK I2C总线的数据都是以字节(8位)的方式传送的,发送器件每发送一个字节之后,在时钟的第9个脉冲期间释放数据总线,由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。 6. 无应答信号NACK 在时钟的第9个脉冲期间发送器释放数据总线,接收器不拉低数据总线表示一个NACK,NACK有两种用途: a. 一般表示接收器未成功接收数据字节; b. 当接收器是主控器时,它收到最后一个字节后,应发送一个NACK信号,以通知被控发送器结束数据发送,并释放总线,以便主控接收器发送一个停止信号STOP。 五. 寻址约定

I2C总线协议规范 v2.1

THE I2C-BUS SPECIFICATION VERSION 2.1 JANUARY 2000

CONTENTS 1PREFACE. . . . . . . . . . . . . . . . . . . . . . . . . . .3 1.1Version 1.0 - 1992. . . . . . . . . . . . . . . . . . . . 3 1.2Version 2.0 - 198. . . . . . . . . . . . . . . . . . . . . 3 1.3Version 2.1 - 1999. . . . . . . . . . . . . . . . . . . . 3 1.4Purchase of Philips I2C-bus components . . 3 2THE I2C-BUS BENEFITS DESIGNERS AND MANUFACTURERS. . . . . . . . . . . . . . .4 2.1Designer benefits . . . . . . . . . . . . . . . . . . . . 4 2.2Manufacturer benefits. . . . . . . . . . . . . . . . . 6 3INTRODUCTION TO THE I2C-BUS SPECIFICATION . . . . . . . . . . . . . . . . . . . . .6 4THE I2C-BUS CONCEPT . . . . . . . . . . . . . . .6 5GENERAL CHARACTERISTICS . . . . . . . . .8 6BIT TRANSFER . . . . . . . . . . . . . . . . . . . . . .8 6.1Data validity . . . . . . . . . . . . . . . . . . . . . . . . 8 6.2START and STOP conditions. . . . . . . . . . . 9 7TRANSFERRING DATA. . . . . . . . . . . . . . .10 7.1Byte format . . . . . . . . . . . . . . . . . . . . . . . . 10 7.2Acknowledge. . . . . . . . . . . . . . . . . . . . . . . 10 8ARBITRATION AND CLOCK GENERATION . . . . . . . . . . . . . . . . . . . . . .11 8.1Synchronization . . . . . . . . . . . . . . . . . . . . 11 8.2Arbitration . . . . . . . . . . . . . . . . . . . . . . . . . 12 8.3Use of the clock synchronizing mechanism as a handshake. . . . . . . . . . . 13 9FORMATS WITH 7-BIT ADDRESSES. . . .13 107-BIT ADDRESSING . . . . . . . . . . . . . . . . .15 10.1Definition of bits in the first byte . . . . . . . . 15 10.1.1General call address. . . . . . . . . . . . . . . . . 16 10.1.2START byte . . . . . . . . . . . . . . . . . . . . . . . 17 10.1.3CBUS compatibility. . . . . . . . . . . . . . . . . . 18 11EXTENSIONS TO THE STANDARD- MODE I2C-BUS SPECIFICATION . . . . . . .19 12FAST-MODE. . . . . . . . . . . . . . . . . . . . . . . .19 13Hs-MODE . . . . . . . . . . . . . . . . . . . . . . . . . .20 13.1High speed transfer. . . . . . . . . . . . . . . . . . 20 13.2Serial data transfer format in Hs-mode. . . 21 13.3Switching from F/S- to Hs-mode and back . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2313.4Hs-mode devices at lower speed modes. . 24 13.5Mixed speed modes on one serial bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 13.5.1F/S-mode transfer in a mixed-speed bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 13.5.2Hs-mode transfer in a mixed-speed bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 13.5.3Timing requirements for the bridge in a mixed-speed bus system. . . . . . . . . . . . . . 27 1410-BIT ADDRESSING. . . . . . . . . . . . . . . . 27 14.1Definition of bits in the first two bytes. . . . . 27 14.2Formats with 10-bit addresses. . . . . . . . . . 27 14.3General call address and start byte with 10-bit addressing. . . . . . . . . . . . . . . . . . . . 30 15ELECTRICAL SPECIFICATIONS AND TIMING FOR I/O STAGES AND BUS LINES. . . . . . . . . . . . . . . . . . . . 30 15.1Standard- and Fast-mode devices. . . . . . . 30 15.2Hs-mode devices. . . . . . . . . . . . . . . . . . . . 34 16ELECTRICAL CONNECTIONS OF I2C-BUS DEVICES TO THE BUS LINES . 37 16.1Maximum and minimum values of resistors R p and R s for Standard-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 39 17APPLICATION INFORMATION. . . . . . . . . 41 17.1Slope-controlled output stages of Fast-mode I2C-bus devices. . . . . . . . . . . . 41 17.2Switched pull-up circuit for Fast-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 41 17.3Wiring pattern of the bus lines. . . . . . . . . . 42 17.4Maximum and minimum values of resistors R p and R s for Fast-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 42 17.5Maximum and minimum values of resistors R p and R s for Hs-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 42 18BI-DIRECTIONAL LEVEL SHIFTER FOR F/S-MODE I2C-BUS SYSTEMS . . . . 42 18.1Connecting devices with different logic levels. . . . . . . . . . . . . . . . . . . . . . . . . 43 18.1.1Operation of the level shifter . . . . . . . . . . . 44 19DEVELOPMENT TOOLS AVAILABLE FROM PHILIPS. . . . . . . . . . . . . . . . . . . . . 45 20SUPPORT LITERATURE . . . . . . . . . . . . . 46

I2c总线协议

1.I2C协议 2条双向串行线,一条数据线SDA,一条时钟线SCL。 SDA传输数据是大端传输,每次传输8bit,即一字节。 支持多主控(multimastering),任何时间点只能有一个主控。 总线上每个设备都有自己的一个addr,共7个bit,广播地址全0. 系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。 1.1 I2C位传输 数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit; 若SDA发生跳变,则用来表示一个会话的开始或结束(后面讲) 数据改变:SCL为低电平时,SDA线才能改变传输的bit 1.2 I2C开始和结束信号 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

1.3 I2C应答信号 Master每发送完8bit数据后等待Slave的ACK。 即在第9个clock,若从IC发ACK,SDA会被拉低。 若没有ACK,SDA会被置高,这会引起Master发生RESTART或STOP流程,如下所示: 1.4 I2C写流程 写寄存器的标准流程为: 1. Master发起START 2. Master发送I2C addr(7bit)和w操作0(1bit),等待ACK 3. Slave发送ACK 4. Master发送regaddr(8bit),等待ACK 5. Slave发送ACK 6. Master发送data(8bit),即要写入寄存器中的数据,等待ACK 7. Slave发送ACK 8. 第6步和第7步可以重复多次,即顺序写多个寄存器

I2C协议

I2C总线串行接口应用设计 I2C是一种较为常用的串行接口标准,具有协议完善、支持芯片较多和占用I/O线少等优点。I2C总线是PHILIPS公司为有效实现电子器件之间的控制而开发的一种简单的双向两线总线。现在,I2C总线已经成为一个国际标准,在超过100种不同的IC集成电路上实现,得到超过50家公司的许可,应用涉及家电、通信、控制等众多领域,特别是在ARM嵌入式系统开发中得到广泛应用。 1 实例说明 本实例介绍I2C总线接口在ARM中的应用,以及它在ARM平台中的I/O交互拓展能力。 在ARM嵌入式系统开发中,系统和外围设备的信息交换能力非常重要。传统的方式多采用地址和数据总线来完成,但是由于嵌入式系统总线资源的限制,利用有限的I/O接口和足够的通信速度来扩展多功能的外围器件就显得十分必要。I2C总线正好可以满足这一嵌入式系统设计的需要。在嵌入式系统中应用I2C总线,可以在很大程度上简化系统结构,模块化系统电路,而I2C总线上各节点独立的电气特性也可以使整个系统具有最大的灵活性。 2 I2C设计原理 2.1 12G主从模式 I2C采用两根I/O线:一根时钟线(SCL串行时钟线),一根数据线(SDA串行数据线),实现全双工的同步数据通信。I2C总线通过SCL/SDA两根线使挂接到总线上的器件相互进行信息传递。 ARM通过寻址来识别总线上的存储器、LCD驱动器、I/O扩展芯片及其他I2 C总线器件,省去了每个器件的片选线,因而使整个系统的连接极其简洁。总线上的设备分为主设备(ARM处理器)和从设备两种,总线支持多主设备,是一个多主总线,即它可以由多个连接的器件控制。典型的系统构建如图15-1所示。 每一次I2C总线传输都由主设备产生一个起始信号,采用同步串行传送数据,数据接收方每接收一个字节数据后都回应一个应答信号。一次I2C总线传输传送的字节数不受限制,主设备通过产生停止信号来终结总线传输。数据从最高位开始传送,数据在时钟信号高电平时有效。通信双方都可以通过拉低时钟线来暂停该次通信。 2.2 I2C工作原理

I2C总线协议及工作原理

I2C总线协议及工作原理 一、概述 1、I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 SCL:上升沿将数据输入到每个EEPROM器件中;下降沿驱动EEPROM器件输出数据。(边沿触发) SDA:双向数据线,为OD门,与其它任意数量的OD与OC门成"线与"关系。 I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平(SDL=1;SCL=1)。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。 2、主设备与从设备 系统中的所有外围器件都具有一个7位的"从器件专用地址码",其中高4位为器件类型,由生产厂家制定,低3位为器件引脚定义地址,由使用者定义。主控器件通过地址码建立多机通信的机制,因此I2C总线省去了外围器件的片选线,这样无论总线上挂接多少个器件,其系统仍然为简约的二线结构。终端挂载在总线上,有主端和从端之分,主端必须是带有CPU的逻辑模块,在同一总线上同一时刻使能有一个主端,可以有多个从端,从端的数量受地址空间和总线的最大电容400pF的限制。 主端主要用来驱动SCL line; 从设备对主设备产生响应; 二者都可以传输数据,但是从设备不能发起传输,且传输是受到主设备控制的。 二、协议 1.空闲状态 I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。 2.起始位与停止位的定义: 起始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号。 停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。 起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。

i2c通讯协议及程序

I2C通信协议简介 (2013-01-17 10:48:03) 转载▼ 分类:通讯协议 标签: 杂谈 ACK是acknowledge的意思,确认. 摒弃复杂的情况,这里只对I2C做简单的介绍。 一、I2C 总线的一些特征: ? 只要求两条总线线路一条串行数据线SDA一条串行时钟线SCL ? 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机从机关系软件设定地址主机可以作为主机发送器或主机接收器? 它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏 ? 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s 快速模式下可达400kbit/s 高速模式下可达3.4Mbit/s ? 片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整 ? 连接到相同总线的IC 数量只受到总线的最大电容400pF 限制 二、I2C总线在传送数据过程中共有三种类型信号:开始信号、结束信号和应答信号。 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据 起始和结束:

bool I2C_Start(void) { SDA_H; SCL_H; I2C_delay(); if(!SDA_read)return FALSE; // SDA线为低电平则总线忙,退出 SDA_L; // 拉低SDA线(当SCL为高电平时,SDA由高电平向低电平跳变表示开始信号) I2C_delay(); if(SDA_read) return FALSE; // SDA线为高电平则总线出错,退出 SDA_L; //数据为准备好时,拉低SCL线 I2C_delay(); return TRUE; } 发出开始信号之后,设备在数据未准备好时,拉低SCL线,这样主设备可知从设备未发送数据,从设备在数据准备好,可以发送的时候,停止拉低SCL线,这时候才开始真正的数据传输 void I2C_Stop(void) { SCL_L; I2C_delay(); SDA_L; I2C_delay(); SCL_H; // SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据 I2C_delay(); SDA_H; I2C_delay(); }

I2C总线协议程序

C程序代码]I2C总线协议程序 程序代码 2009-10-11 14:05 阅读48 评论0 /**************************************************************** I2C总线协议程序 ****************************************************************/ #define NOP {_nop_();_nop_();_nop_();_nop_();} sbit SDA=P1^2; /*模拟I2C数据传送位*/ sbit SCL=P1^3; /*模拟I2C时钟控制位*/ bit ack; /*应答标志位*/ void Start_I2c() { SDA=1; NOP; SCL=1; NOP; SDA=0; NOP; SCL=0; NOP; } void Stop_I2c() { SDA=0; NOP;

SCL=1; NOP; SDA=1; NOP; } void Senduchar(uchar c) { uchar i; for(i=0;i<8;i++) { c<<=1; SDA=CY; NOP; SCL=1; NOP; SCL=0; NOP; } SDA=1; NOP; SCL=1; NOP; if(SDA==1) ack=0; else ack=1; SCL=0; NOP; } uchar Rcvuchar() {

uchar i,x=0; SDA=1; for(i=0;i<8;i++) { SCL=0; NOP; SCL=1; NOP; x=x<<1; if(SDA) x=x+1; NOP; } SCL=0; NOP; return(x); } void Ack_I2c(bit a) { SDA=a; NOP; SCL=1; NOP; SCL=0; NOP; } bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) { uchar i;

I2C协议

I2C总线规范 目录 1序言 (3) 1.1 版本1.0-1992 (3) 1.2 版本2.0-1998 (3) 1.3 版本2.1-2000 (3) 1.4 购买Philips的I2C总线元件 (3) 2I2C总线使设计人员和厂商都得益 (3) 2.1 设计人员的得益 (4) 2.2 厂商的得益 (5) 3介绍I2C总线规范 (6) 4I2C总线的概念 (6) 5总体特征 (7) 6位传输 (7) 6.1 数据的有效性 (7) 6.2 起始和停止条件 (8) 7传输数据 (9) 7.1 字节格式 (9) 7.2 响应 (9) 8仲裁和时钟发生 (10) 8.1 同步 (10) 8.2 仲裁 (10) 8.3 用时钟同步机制作为握手 (11) 97位的地址格式 (12) 107位寻址 (13) 10.1 第一个字节的位定义 (13) 10.1.1 广播呼叫地址 (14) 10.1.2 起始字节 (15) 10.1.3 CBUS的兼容性 (16) 11标准模式I2C总线规范的扩展 (16) 12快速模式 (17) 13Hs模式 (17) 13.1 高速传输 (17) 13.2 Hs模式的串行数据传输格式 (19) 13.3 从F/S模式切换到Hs模式以及返回 (20) 13.4 低速模式中的快速模式器件 (21) 13.5 串行总线系统的混合速度模式 (21) 13.5.1 在混合速度总线系统中的F/S模式传输 (22) 13.5.2 在混合速度总线系统中的Hs模式传输 (22) 13.5.3 混合速度总线系统中电桥的时序要求 (24)

1410位寻址 (24) 14.1 头两个字节位的定义 (24) 14.2 10位寻址的格式 (24) 14.3 广播呼叫地址和10位寻址的起始字节 (26) 15I/O级和总线线路的电气规范和时序 (26) 15.1 标准和快速模式器件 (26) 15.2 Hs模式器件 (28) 16I2C总线器件到总线线路的电气连接 (30) 16.1 标准模式I2C总线器件电阻R p和R S的最大和最小值 (31) 17应用信息 (33) 17.1 快速模式I2C总线器件的斜率控制输出级 (33) 17.2 快速模式I2C总线器件的开关上拉电路 (34) 17.3 总线线路的配线方式 (34) 17.4 快速模式I2C总线器件电阻R p和R S的最大和最小值 (35) 17.5 Hs模式I2C总线器件的电阻R p和R S的最大和最小值 (35) 18F/S模式I2C总线系统的双向电平转换器 (35) 18.1 连接逻辑电平不同的器件 (36) 18.1.1 电平转换器的操作 (36) 19Philips提供的开发工具 (37) 20支持的文献 (37)

51单片机i2c协议示例程序

#include #include #define uint unsigned int #define uchar unsigned char sbit sda=P3^5; sbit scl=P3^4; void start_bit(); void stop_bit(); void slave_ack(); void no_ack(); void write_byte(uchar dat); uchar read_byte(); void write_date(uchar addr,uchar date); uchar read_date(uchar addr); void delay(uint x); void main() { uchar num; write_date(0x01,0xaa); delay(2); num=read_date(0x01); P0=num; while(1); } void start_bit() //开始位 { scl=1; _nop_(); sda=1; _nop_(); sda=0; _nop_(); scl=0; } void stop_bit() //停止位

{ sda=0; _nop_(); scl=1; _nop_(); sda=1; } void slave_ack() //应答信号 { _nop_(); _nop_(); scl=0; _nop_();; sda=1; _nop_(); _nop_(); scl=1; _nop_(); _nop_(); while(sda); //P0=0xfe; scl=0; } void no_ack() //无应答 { sda=1; _nop_(); scl=1; _nop_(); scl=0; } void write_byte(uchar dat) //写一个字节{ uchar i; scl=0; for(i=0;i<8;i++) { if(dat&0x80) sda=1; else sda=0;

模拟I2C协议

模拟I2C协议 在现代电子系统中,有为数众多的IC需要相互之间以及与外界的通信。为了简化电路的设计,Philips公司开发了一种用于内部IC控制的简单的双向两线串行总线I2C(Intel-Integrated Circuit bus)。1998年当推出I2C总线协议2.0版本时,I2C协议实际上已经成为一个国际标准。 在进行FPGA设计时,经常需要和外围提供I2C接口的芯片通信。例如低功耗的CMOS实时时钟/日历芯片PCF8563、LCD驱动芯片PCF8574、键盘/LED 驱动器ZLG7290等都提供I2C接口。因此在FPGA中模拟I2C接口已成为FPGA 开发必要的步骤。 本章将详细讲解在FPGA芯片中使用VHD/Verilog HDL模拟I2C协议,以及编写TestBench仿真和测试程序的方法。 4.1 I2C总线解析 下面先对I2C协议中有关数据格式和时序的内容进行介绍,这里没有涉及的地方请参考THE I2C-SPECIFICATION VERSION2.1 JANUARY 2000. 4.1.1 I2C总线概述 I2C协议作为一个串行总线标准尽管没有并行总线的数据吞吐能力,但是它的以下特点使其有着广泛的应用。 ●只需要两条总线——串行数据线SDA和串行时钟线SCL; ●每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主/ 从节点关系软件设定地址,主节点可以发送数据或接收数据; ●是真正的多主总线,当两个或更多主节点同时初始化数据传输时,可 以通过冲突检测和仲裁防止数据被破坏; ●串行的8位双向数据传输位速率在标准模式下可达100kbit/s,快速模 式下可达400kbit/s,高速模式下可达3.4Mbit/s; ●片上的滤波器可以滤去总线数据线上的毛刺波,保证数据完整; ●连接到相同总线的IC数量只受到总线的最大电容(400pF)限制。 总线不仅仅是互连的线,还包含系统通信的所有格式和过程。I2C总线结构上的特点保证了其应用时的简洁,另外其完备的协议避免了所有混乱、数据丢失和妨碍信息的可能性。

SPI、I2C、UART、USB串行总线协议的区别

SPI、I2C、UART、USB串行总线协议的区别 SPI、I2C、UART三种串行总线协议的区别 第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器) 第二,区别在电气信号线上: SPI总线由三条信号线组成:串行时钟(SCLK)、串行数据输出( SDO)、串行数据输入(SDI)。SPI总线可以实现多个SPI 设备互 相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Mast er),其他设备为SPI从机或从设备(Slave)。主从设备间可 以 实现全双工通信,当有多个从设备时,还可以增加一条从设备 选择线。 如果用通用IO口模拟SPI总线,必须要有一个输出口(SDO),一

个输入口(SDI),另一个口则视实现的设备类型而定,如果要实现主从设备,则需输入输出口,若只实现主设备,则需输出 口即可,若只实现从设备,则只需输入口即可。 I2C总线是双向、两线(SCL、SDA)、串行、多主控(multi-mas ter)接口标准,具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信。在它的协议体系中,传输数 据时都会带上目的设备的设备地址,因此可以实现设备组网。如果用通用IO口模拟I2C总线,并实现双向传输,则需一 个输 入输出口(SDA),另外还需一个输出口(SCL)。(注:I2C资 料 了解得比较少,这里的描述可能很不完备) UART总线是异步串口,因此一般比前两种同步串口的结构要复 杂很多,一般由波特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件上由两根线, 一根用于发送,一根用于接收。 显然,如果用通用IO口模拟UART总线,则需一个输入口,一个

IIC协议(I2C)

总结下IIC协议 简介 IIC,Inter-Integrated Circuit,集成电路总线,需要2根线连接拓扑,是半双工,适用于"字节型"设备。 特点 拓扑如下: SDA —串行数据线 SCL —串行时钟线 通讯速率标准模式下100kb/s,快速模式下400kb/s 连接到总线的IC最大负载电容400pf 需要上拉电阻 原因: - 总线空闲时要求是高电平 IIC的数据线SDA是开漏的,无法输出高电平,只能输出低电平 起到保护作用,如果某个器件拉低,并且不接上拉电阻就电源-地短路了 对于不明确负载,IC不能很大的保证输出功率,接上拉电阻则负载所需功率由电源提供,保护IC 上拉电阻选取见下面这篇文章关于IIC的上拉电阻 时序 开始信号、结束信号 在SCL为高电平时,SDA由高跳变到低时开始信号 在SCL为高电平时,SDA由低跳变到高时开始信号 有效数据 传输有效数据时SDA只能在SCL为低时发生变化,SCL为高时要保持不变,否则就成的开始结束信号 应答、非应答 主机每发生一个字节数据,主机总是需要等待从机给主机反馈一个应答或者非应答信号,确保数据是否接收。在SCL第9个脉冲时之前把SDA设置为输入,检测SDA,为低是应答信号,为高则是非应答信号。 下面是用IO模拟的iic #include "myiic.h" uint16_t SlaveAddr; //设备地址 uint8_t SlaveAddrLen=1;//设备地址字节数 uint16_t SubAddr; //片内地址 uint8_t SubAddrLen=2; //片内地址字节数

uint8_t IICReadBuf[IIC_SIZE]={0}; //从IIC读到IICLen个数据缓存uint8_t IICWriteBuf[IIC_SIZE]={0};//待写入IICLen个数据缓存uint16_t IICLen; //IIC操作长度 //IO方向设置 void SDA_IN(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(IIC_GPIO, &GPIO_InitStructure); } void SDA_OUT(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(IIC_GPIO, &GPIO_InitStructure); } //初始化IIC //PA9-->IIC_SCL PA10-->IIC_SDA void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); /* Configure PA9 and PA10 in output pushpull mode */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(IIC_GPIO, &GPIO_InitStructure); IIC_SCL_H;

相关主题