本文檔描述了在Xilinx CoolRunner™ 256-macrocell CPLD上用VHDL实现I2C 控制器。CoolRunner CPLD 是现有的最低功耗的CPLD,是实现I2C控制器的相当不错的目标器件。想要获取本文档所描述的VHDL代码,请查阅VHDL Code Download, page 19以得知详细信息。本设计符合XPLA3和CoolRunner-II CPLD。对CoolRunner-II CPLD的版本,请参阅 XAPP385, CoolRunner-II CPLD I2C Bus Controller Implementation.
简介 I2C 总线由于其成本低廉的特性,是一种流行的二线制串行总线接口。二线制接口减少了内部联机,使得IC的引脚数目降低,也让印刷线路板上的布线数量减少。通过简单的主/从协议,每个连接到总线上的设备都具有唯一的软可编址的地址,并可达100 KHz的操作模式。
CoolRunner I2C 控制器的设计由一个异步微控制器接口和一个I2C主/从接口组成。设计成由微控制器或微处理器来使用。如图1所示。
I2C 基础知识
本部分将对I2C总线协议的主要内容进行简要的描述。若想获取I2C更详尽的描述与时序,请参阅I2C标准。I2C总线由两条线组成,串行资料线(SDA)和串行时钟线(SCL),它们用来在连接到总线上的设备之间传送资料。能够连接到同一总线上的最大设备数目仅由最大的总线电容400 pF来限定。SDA和SCL这两条线都是双向线,通过一长拉电阻与电源正极相连。当总线空闲时,两条线均为高电平。连接到总线的器件的输出级必须是漏极开路或集电极开路,以便实现线与(wired-AND)的功能。
每个设备都有唯一的地址并可即当作传送方又可为接收方。此外,设备还可以配置为主或从。主设备发起总线上的数据传输并生成时钟信号以允许传输。任何其它被编址过的设备被当作从设备。如果同时有多于一个的主设备试图得到总线控制权时,I2C协议定义了一个仲裁程序以保证这时只有一个可获得控制权并且不会产生坏信息。CoolRunner I2C控制器支持I2C协议中的仲裁与时钟同步程序。
I2C 总线上的数据传输由START条件发起,由STOP条件结束。SDA线的一般资料在时钟信号的高电平期间必须是稳定的。只有在SCL线为低电平期间,SDA线上的电平才可进行高低变化。START条件被定义为在SCL线为高电平期间的一个由高到低的唯一的状态。同样地,STOP条件被定义为在SCL线为高电平期间的一个由低到高的唯一的状态。资料、START和STOP的定义确保了START条件与STOP条决不可能被混淆为资料。如图2所示:
I2C总线的每个资料包有8位资料组成,并在这8位之后跟一确认位,因此,每个完整的数据字节需9个时钟脉冲。 最高位(MSB)在前。在确认位期间,发送方释放SDA线,与此同时,数据传输的接收方必须使SDA线保持低电平,以确认资料的接收。如果一个从接收方没有在确认位期间将SDA线保持为低电平,这就表示从接收方不能接收资料,而主器件可以生成STOP条件中止数据传输。如果是一个主接收方没有产生确认信息,则表明其示意从发送方这已经是传送的最后一个字节。
总线上,主与从之间的标准通讯由四部分组成:START,从地址,资料,STOP。I2C 协议规定资料格式可以是7位和10位地址。Xilinx CoolRunner CPLD支持的是7位地址模式。START条件之后,发送的是从地址。这个地址有7位长,而紧随其后的第八位是R/W位。”1”表示请求资料(读),"0"表示发送资料(Write)。只有地址与主器件所发送的地址相匹配的从器件将通过在第九位时钟时将SDA线置为低电平来应答主器件。
一旦正确寻址,资料将一个字节接一个字节地按R/W位所定义的方向进行资料传送。主器件可能过生成STOP信号中断通讯并释放总线。然而,主器件可在不生成STOP条件之间再次生成START条件。这叫repeated START(rS)。
CoolRunner I2C 控制器
CoolRunner CPLD 实现的I2C 控制器支持以下特性:
• 微控制器接口
• 主或从操作方式
• 多主操作模式
• 软件可选确认位
• 仲裁失败中断,通过自动模式由主转向从。
• 调用地址相同中断,通过自动模式由主转向从。
• START和STOP信号的生成与检测
• rS(repeat START)信号的生成
• 确认位的生成与检测
• 忙线检测
• 100 KHz操作方式
信号描述
CoolRunner I2C 控制器的I/O信号如表1所示。本设计中引脚号并没有被赋值,设计者可根据系统需要自行定制。
表 1: CoolRunner I2C 控制器信号描述
|
名称 |
方向 |
描述 |
|
SDA |
双向 |
I2C串行资料线。 |
|
SCL |
双向 |
I2C串行时钟线。 |
|
ADDR_BUS[23:0] |
输入 |
μC地址总线。 |
|
DATA_BUS[7:0] |
双向 |
μC数据总线。 |
|
AS |
输入 |
地址过滤。低电平有效,μC握手信号,指示当前地址总线上的地址为有效 |
|
DS |
输入 |
资料过滤。低电平有效,μC握手信号,指示当前数据总线上的资料为有效或μC不再控制数据总线,I2C控制器可将资料置于数据总线上。 |
|
R_W |
输入 |
读/写。”1”表示读,”0”表示写。 |
|
DTACK |
输出 |
资料传输确认。低电平有效,μC握手信号,指示I2C控制器已经为读周期将有效资料置于数据总线或者说,在一个读周期,I2C控制器已经接收到了数据总线上的资料。 |
|
IRQ |
输出 |
中断请求。低电平有效。 |
|
MCF |
输出 |
数据传输位。当一个字节的数据被传输完后,该位被清空。它由字节传输中的第九个时钟的下降沿来置位。该位被用来通知发送至μC的一个字节已经完成。 |
|
CLK |
输入 |
时钟。该时钟由系统输入。该常数用来生成100KHZ的SCL信号,采用1.832MHZ的时钟频率。可以使用不同的时钟频率,但VHDL源代码中的常数值必须重新计算。 |
module i2c_blk(sda, scl, addr_bus, data_bus, as, ds, r_w, dtack, irq, mcf, clk, reset);
//I2C bus signals
inout sda; // i2c data line
inout scl; // i2c clock line
//uC interface signals
input [23:0] addr_bus; // uC address bus
inout [7:0] data_bus; // uC data bus
input as; // address strobe, active low
input ds; // data strobe, active low
input r_w; // read/write
output dtack; // data transfer acknoweldge
output irq; // interrupt request
inout mcf; // temporary output for testing
//clock & reset
input clock;
input reset;
模块图
CoolRunner I2C控制器的模块图被分成两个主要的部分:μC接口和I2C接口,如图3所示。
module i2c_ctrol_blk(sda, scl, txak, msta, msta_rst, rsta, mtx, mbdr_mirco, madr, mbb, mcf, maas, mal, srw, mif, rxak, mbdr_i2c, mbcr_wr, mif_bit_reset, mal_bit_teset, sys_clk, reset);
// I2C bus signals
inout sda; // i2c data line
inout scl; // i2c clock line
// interface signals from uP interface
input txak; // value for acknowledge when xmit
input msta; // master/slave select
output msta_rst ; // resets MSTA bit if arbitration is lost
input rsta; // repeated start
input mtx; // master read/write
input[7:0] mbdr_micro; // uP data to output on I2C bus
input[7:0] madr; // I2C slave address
output mbb; // bus busy
inout mcf; // data transfer
inout maas; // addressed as slave
inout mal; // arbitration lost
inout srw; // slave read/write
output mif; // interrupt pending
output rxak; // received acknowledge
inout[7:0] mbdr_i2c; // I2C data for uP
input mbcr_wr; // indicates that MCBR register was written
input mif_bit_reset;// indicates that the MIF bit should be reset
input mal_bit_reset;// indicates that the MAL bit should be reset
// clock & reset
input sys_clk;
input reset;
module uC_interface_blk(clk, reset, addr_bus, as, ds, r_w, dtack, irq, madr, men, mien, msta, mtx, txak, rsta, mbcr_wr, mcf, maas, mbb, mal, srw, mif, rxak, mal_bit_reset, mif_bit_reset, msta_rst, mbdr_micro, mbdr_i2c, mbdr_read);
// 68000 parallel bus interface
input clk;
input reset;
input[23:0] addr_bus;
inout[7:0] data_bus;
input as;
input ds;
// Directional pins
input r_w; // Active low write;
// active high read
output dtack; // Data transfer acknowledge
output irq;
微控制器逻辑
I2C控制器的μC接口设计支持异步的宽度为字节长的总线协议。本协议是方法,通过它,μC对设计中的寄存器进行读写。如图4所示。
地址译码/总线接口逻辑
CoolRunner I2C控制器中实现的μC总线协议的状态机如图5所示。
在第一个周期里,将地址置入地址总线,设置读/写线为正确的状态,并表明AS与DS。AS指示当前地址总线上的地址为有效。如果是在写周期,μC也将资料置入数据总线,此时DS意味着总线上的资料是有效的。如果是在读周期,μC将数据总线置于第三态,而此时的DS意指CoolRunner I2C控制器可将资料置于数据总线上。
在AS表明的基础上,CoolRunner I2C控制器转入ADDR状态并对地址进行译码,并确定是否是被寻址的设备。在这状态中,对内部寄存器的使能都被设置。如果CoolRunner I2C控制器已经被寻址且DS被声明,则CoolRunner I2C控制器将转入DATA_TRS状态。如果这是一个读周期,则被请求的资料被置于数据总线,而若是一写周期,则来自于数据总线的资料被锁存在地址寄存器中。CoolRunner I2C控制器将自动进入ASSERT_DTACK 状态并确定DTACK以指示被请求的资料已经准备好,若在读周期,如果是写周期,则意味着资料已经收到。
在DTACK确认之后,要么,如果是在写周期,μC从总线上移除数据,要么如果是在读周期,则将资料锁存在当前的总线。读/写被设置为读,且AS和DS均为负的,以表示数据传输已经完成。AS与DS为负,引发CoolRunner I2C控制器使DTACK置为负值,并转入IDLE状态。
CoolRunner I2C 控制器寄存器
用于地址译码的基址在VHDL代码中是通过常量BASE_ADDRESS 进行设定的。基址是地址总线的高16位。地址中的低位用来确定哪个寄存器被访问。CoolRunner I2C控制器所支持的寄存器如表2中所列。CoolRunner I2C控制器的μC接口逻辑通过μC接口处理对这些寄存器的读和写并从I2C接口逻辑获取资料或向其发送资料。
表2:I2C控制器寄存器
|
地址 |
寄存器 |
描述 |
|
MBSAE+$8Dh |
MADR |
I2C地址寄存器 |
|
MBSAE+$91h |
MBCR |
I2C控制寄存器 |
|
MBSAE+$93h |
MBSR |
I2C状态寄存器 |
|
MBSAE+$95h |
MBDR |
I2C资料I/O寄存器 |
地址寄存器 (MADR)
该字段包含了用于I2C控制器中所用到的从地址。该寄存器可读/写。(表3)
表3:地址寄存器位
|
bit位置 |
名称 |
μC访问 |
描述 |
|
7-1 |
从地址 |
读/写 |
从模式中,用于I2C控制器的地址 |
|
0 |
|
|
未用 |
控制寄存器(MBCR)
该寄存器中包含了用于对I2C控制器配置的资料位。(表4)
表4:控制寄存器位
|
bit位置 |
名称 |
μC访问 |
描述 |
|
7 |
MEN |
读/写 |
I2C控制器使能。这一位必须在MBCR的资料位被起效用以前被设置。 “1” I2C控制器开启 “0” I2C控制器重置或关闭 |
|
6 |
MIEN |
读/写 |
中断使能。 “1” 开中断。如果状态寄存器中的MIF位也被置位,则发生中断 “0” 关中断。但不会清空任何当前正在挂起的中断 |
|
5 |
MSTA |
读/写 |
主/从模式选择。当μC将此位由“0”改为“1”,则I2C控制器以主模式生成START条件。当该位被清零,则生成STOP条件且I2C控制器切换至从模式。如果该位被清零,而由于仲裁中失去了总线控制,则不生成STOP条件。 |
|
4 |
MTX |
读/写 |
发送/接收模式选择。该位选择主/从传输的方向。 “1” I2C主发送 “0” I2C主接收 |
|
3 |
TXAK |
读/写 |
传输确认使能。该位定义的值在主或从接收的确信周期内驱动SDA线。 “1” —ACK 位= “1” — 无确认 “0” —ACK 位= “0” — 确认 因为主接收通过不产生确认来表示已经为数据传输的最后一个字节,该位对μC而言标志主接收传输中止。 |
|
2 |
RSTA |
读/写 |
重发START。如果I2C控制器为当前的主设备,则把“1”写入该位将在I2C总线上产生一rS条件,该位常被读出是“0”。如果总线由另一主设备控制,而在错误的时间内试图生成rS条件将导致仲裁中失去控制权。 |
|
1-0 |
保留 |
|
|
状态寄存器(MBSR)
该寄存器包含了I2C控制器的状态。除了MIF和MAL这两个可软清零的资料位外,该寄存器的其它位均为只读的。除子MCF与RXAK位外,其它几位在重启后均被清空。(表5)
表5:状态寄存器位
|
bit位置 |
名称 |
μC访问 |
描述 |
|
7 |
MCF |
读 |
数据传输位。当一个字节的数据被传送完毕,该位被清空。该位由确认周期内的SCL的上升沿置位,并在这个SCL时钟内一直为高电平。 “1” 传输完成 “0” 正在传输 注释:在CoolRunner I2C控制器中,这一位也是输出引脚,以便寄存器读周期不需要确定传输是否完成。 |
|
6 |
MAAS |
读 |
作为从地址位。当I2C总线上的地址与MADR寄存器中的从地址相匹配,I2C控制器被寻址为从器件,并切换为从模式。 |
|
5 |
MBB |
读 |
总线忙位。该位标识I2C总线的状态。在START条件时,该位被置位,在STOP条件时被清零。 “1” 总线忙 “0” 总线空闲 |
|
4 |
MAL |
读 软可清零 |
仲裁失败位。该位在I2C总线仲裁失败后由硬件置位。该位必须由μC软件写入“0”来清零。 |
|
3 |
保留 |
|
|
|
2 |
SRW |
读 |
从读/写位。当I2C控制器已经被寻址为从设备(MAAS被置位时),该位指由主发送过来的读/写的值。该位仅在传输完成发生且没有其它传输被发起时有效。 “1” 表示主设备读从设备 “0” 表示主设备写从设备 |
|
1 |
MIF |
读 软可清零 |
中断位。该位在中断处于挂起时被置位,如果MIEN亦被置位,则引起处理器的中断请求。在中断服务期间,该位必须由μC软件写入“0”来清零。 |
|
0 |
RXAK |
读 |
接收确认位。该位标识在传输确认周期内SDA信号线上的值。 “1” 表示没有收到确认位 “0” 表示收到确认位 |
资料寄存器(MBDR)
该寄存器包含来自/发至I2C总线的资料。物理上,该寄存器由具有相同地址的两个字节宽的寄存器实现。一个字节用来发送数据,另一个用于接收资料。这将排除μC与CoolRunner I2C控制器之间任何竞争的可能。因为这些寄存器具有相同的地址,所以它们对μC以相同的寄存器出现而将继续被描述成这样。在发送模式,写入该寄存器的是I2C总线的输出,在接收模式下,该寄存器中存放从I2C总线上接收到的资料。注意,在接收模式中,假设μC将能在下一I2C传输期间读取该寄存器。每个传输完成后,接收到的I2C资料被放置在寄存器中。在下一次传送之前,I2C总线逻辑不会等待μC的指示来得知该寄存器是否已被读取。(表6)
表6: I2C资料寄存器位
|
bit位置 |
名称 |
μC访问 |
描述 |
|
7-0 |
D7:D0 |
读/写 |
I2C资料 |
I2C 接口逻辑
如图3所示,I2C总线接口逻辑包含几种不同的进程。μC接口寄存器中的控制位确定这些进程的行为。
仲裁
在下面的情况下,I2C总线仲裁失去控制权:
• 在地址或数据发送周期中,SDA被采样为“0”而此时主设备输出为"1"
• 在资料接收时的确认位周期内,SDA被采样为“0”而此时主设备输出为"1"
• 在总线忙时,试图发起一个传输周期
• 在从模式下,请求rSTART条件
• 在主设备未发出STOP条件时却检测到STOP条件
如果CoolRunner I2C控制器是在主模式下,将被传送的SDA信号与当前SDA信号相比较以决定总线是否已经失去控制权。除了在确认周期中要确保START与STOP条件均不在错误的时刻生成,在整个数据传输周期内,仅在SCL为高电平时检测SDA信号。如果待传信号与当前SDA线上的不同,则促裁失败,MAL位置位。这时,CoolRunner I2C控制器被设计为不会生成START条件的。然而,若在总线忙线时,μC请求START条件或rSTART条件,MAL位将被置位。当在主设备未生成STOP条件百检测到STOP条件时,MAL位也会被置位。
如果在数据传输期间发生仲裁失败,SCL将继续生成,直到该字节传送完毕。
START/STOP检测
这个进程监控I2C总线的SDA与SCL线以检测START与STOP条件。当START被检测到,总线忙位被置位。该位将保持到发现STOP条件为止。DETECT_START与DETECT_STOP两信号由该进程生成,并用于其它的进程中。注:CoolRunner I2C控制器在生成START与STOP条件时也照样对这两条件进行检测。
SCL, SDA, START 和 STOP 条件的产生
这个进程在主模式下生成I2C总线的SCL与SDA信号。SCL信号的时钟频率为~100KHZ,由输入时钟分频确定。产生100KHZ的SCL信号所需要的时钟周期输入的值由CNT_100 KHZ这个常量设定,且通常由1.832MHZ的系统时钟计算得出。该值可由设计者根据目标系统所提供的时钟方便地修改。同样地,常量START_HOLD和DATA_HOLD包含了为满足I2C在生成START条件后和输出资料后要保持的时间而设置的系统时钟周期值。
在主模式下,产生SCL与SDA信号的状态机如图6所示。注:在忙线时,SCL与SDA均保持在默认电平。该状态机对时钟数进行控制。
本设计中,内部的SDA信号输出,要么是本状态机为START条件和STOP条件而生成的,要么是当CoolRunner I2C控制器在发送模式时,MBDR寄存器中的资料。注:SCL与SDA均为集电极开路输出。因此,它们仅仅被拉至“0”。当"1"被置入这些信号上时,CoolRunner I2C控制器将使它们的输出缓冲置为三态输出方式。本设计中的逻辑将设置内部的SDA与SCL信号为"1"或“0”。这些内部信号实际上控制的是它们的输出缓冲的三态输出的使能信号。
在IDLE状态,SCL与SDA均为三态输出,允许任何一个主设备控制总线。一旦有请求输入总线,要要求生成start条件,CoolRunner I2C控制器就进入主模式,且这时的总线并非处于忙线状态,状态机移至START状态。
START状态保持SCL为高电平,并使SDA产生由高到低的跳变,以成生START条件。系统时钟计算器启动并使状态机保持在此状态直到需保持的时间达到。这时,状态机的下一状态是SCL_LOW_EDGE。
SCL_LOW_EDGE状态简单地在SCL线上产生一个下降沿并对系统时钟计数器清零。在下一个时钟沿,状态机转入SCL_LOW状态。在这个状态下,SCL线被保持为低电平,且系统时钟计数器开始启动。如果REP_START信号被检测到,则SDA线将被置为高电平,如果GEN_STOP信号被检测到,SDA将被置为低电平。
当SCL线的低电平时间够了,如果发生仲裁失败和字节传输完毕(这是为了确保SCL保持到传输完成),状态机将过渡到IDLE状态。否则,下一个状态就是SCL_HI_EDGE状态。
SCL_HI_EDGE 状态通过将SCL线置"1" 在SCL线上生成一个上升沿。然而要注意:为了遵从I2C规范的时钟同步协议,状态机不会立即转入SCL_HI状态,直到SCL被采样为高电平。时钟同步由SCL线连接的线与功能执行。SCL线的低电平期将由低电平期最长的设备保持。低电平期较短的设备进入高电平长等待状态,直到所有的设备都释放SCL线并都进入高电平期。因此,SCL_HI_EDGE是SCL时钟同步的高电平等待状态。
这样就开始了SCL_HI状态,这时将开启系统时钟计数器来计算SCL信号的高电平时间。如果repeat START条件或STOP条件被请求,则状态机将在SCL高电平期的中间时刻转入合适的状态以便SDA线可按需过渡。如果上述两种条件都未被请求,则当SCL高电平时间一到,状态机就转入SCL_LOW_EDGE状态。
The STOP_WAIT状态用来保证STOP条件请求后能保持所需的时间。
I2C 接口主状态机
I2C接口逻辑的主状态机如图7所示。主模式与从模式的状态机是相同的。在每个状态,是何种模式是要被检测的,以确定适当的输出值和下一状态。这就使得当仲裁失败或CoolRunner I2C控制器被寻址为从设备时,主/从之间的迅速切换成为可能。
该状态机使用并控制一个记录已经接收到I2C位数目的计数器。这个位数存在BIT_CNT的信号里。这个状态机也控制两个移位寄存器,一个存储已经被收到的I2C头,别一个用来存储已经接收到的I2C资料或将要被发送的资料。
注:
该状态机和相关的计数器、移位寄存器都有SCL时钟的下降沿动作。如果SCL线负荷过重,SCL的上升沿跳变将会很慢,这将会导致一些系统容易受到噪声的影响。这对一个时钟信号而言是很危险的。如果有必要,大力支持设计者使用SCL信号的外部缓冲对SCL线的完好性进行仔细检查。
一旦START信号被检测到,状态机将由IDLE状态过渡到HEADER状态。START信号监控电路对输入的SDA与SCL信号进行监视,以检测START条件。START信号可以由CoolRunner I2C控制器产生,也可由其它主设备产生——这都会使状态机由IDLE状态过渡到HEADER状态。
当处于HEADER状态时,如果是在主模式,MBDR寄存器中的I2C头被发送到I2C总线上。在这种状态下,输入的I2C头被接收到I2C头移位寄存器中。在主模式下,I2C头移位寄存器将包含仅由该设计发送的资料。当8位I2C头全部被移入如果后,状态机转入ACK_HEADER状态。
In the ACK_HEADE状态,CoolRunner I2C的设计是对SDA线采样,判断是否在主模式,并确定是否由被寻址的I2C从设备确认该头。如果被寻址的从设备并未确认该头,状态机过渡到STOP状态,这时会向SCL/START/STOP发生器发送信号,产生STOP条件。如果被寻址的从设备确认该地址,则I2C头的LSB(最低位)被用来确定是发送模式还是接收模式,并且状态机将转入合适的状态(要么是接收资料RCV_DATA,要么是发送资料XMIT_DATA)。
I2C头移位寄存器的值将一直与设置到MADR寄存器里的I2C地址进行比较。如果这些值与ACK_HEADER状态匹配,则CoolRunner I2C控制器被寻址为从设备,并立即切换到从模式。这时,MAAS位被设置到MBSR状态寄存器中。The SDA 线将由TXAK寄存器中所设置的值来驱动,以向当前的I2C总线主设备确认该头。同样地,I2C头的LSB(最低位)被用来确定资料的传输方向,并选择恰当的下一状态。
RCV_DATA状态将来收到的I2C资料移入寄存器,以便发送至μC。当全部的资料字节被收到,状态机就进入ACK_DATA状态并将TXAK寄存器里的值置入SDA线以确认传输正确。注:在主模式,从设备已经将所需的资料字节发送完的标记是不对最后一个字节进行确认。必须对TXAK位求反以禁止对最后一字节数据的确认。如果检测到STOP条件,则状态机将离开这对状态,否则,这两个状态之间的切换将继续。在主模式下,STOP条件的请求是由μC对MSTA位求反而进行的。
XMIT_DATA状态将资料由I2C资料寄存器移至SDA线上。当整个字节发送完毕后,状态机进入WAIT_ACK 状态。若收到确认信号,则状态机返回XMIT_DATA状态进行下一轮字节的发送。这一对状态一直持续到STOP条件被检测到或没有收到字节确认信号。
注:本状态机的资料传送状态假定μC可以跟上资料发送或接收的速度。如果中断被打开,则当每一字节发送完毕后,将产生一个中断。同时,MCF位将被置位。在确认位周期内,发送到I2C资料寄存器或来自于I2C资料寄存器的资料将被寄存器在μC的资料寄存器中。状态机是不会等待μC已经读取所接收的资料或新资料已经被传送的。设计者应该充分意识到μC的数据传输速率的影响,以确保速度不是问题所在。
当CoolRunner I2C控制器处于主模式下时,STOP状态通知SCL/START/STOP发生器生成STOP条件。下一个状态则是IDLE状态,一个I2C活动完成。
操作流程图
μC与之间的接口流图在下面的流图中被详细描述。这些流图都可作为在一个μC系统中应用CoolRunner I2C控制器的指导。
初始化
CoolRunner I2C控制器在被使用之前必须被初始化,如图8所示:
主发送/接收
当I2C总线处于主模式时,发送资料与接收资料的流图如图9和图10所示。发送与接收之间的主要不同在于:在主接收流图中有一附加的步骤,即在最后一字节传送前关闭确认位。
从设备流图
在从模式下接收与发送资料的流图在图11中所示。如果在接收模式下,则从MBDR寄存器中读到的第一个字节将是一个虚拟的,因为数据还没被接收到。因为CoolRunner I2C控制器是在从模式下,所以唯一判断传输是否完成的办法就是检测总线是否忙和从地址位是否仍处于置位状态。
浙公网安备 33010602011771号