I²C的写入行程 图4是AT24C02的位组写入格式,I²C元件的写入行程(read cycle)不同于微导线元件与SPI元件,由图可知动作上I²C元件首先发佈开始条件,藉此宣佈开始进行通信,接着发佈8位元(bit)的元件位址,该元件位址是由表2的分配位元(assign bit)决定。元件位址的高阶4元件表示元件型式,记忆体元件的场合为1010b,Bit3~Bit1则是选择晶片的位址。
虽然I²C串联EEPROM拥有从A0一直到A2的位址脚架,不过此处设定的位址却变成元件的位址,例如A0与A1为”L”状态,A2为”H”状态下存取该元件时,元件的位址的Bit3~Bit1必需是100b,接着最低阶位元的Bit0才是表示读(read)或是写(write)的操作位元,写入行程时该位元变成0,读取行程时则变成1。
图4 AT24C02的位组写入的格式
表2 元件位址
I²C的通信与SPI一样以8位元进行,不过I²C接收指令的目标(target)元件会将ACK送返,此时ACK的Host会与送出第9位元的时脉(clock)同步。由于目标元件会将SDA Line变成”L”形成可识别状态,因此主元件(Host device)送出8位元的元件位址后,会使SDA Line变成输入状态,此时为接收ACK因此发佈下一个时脉并接收ACK,整体而言为了结束元件位址传送,因此动作上要求9个时脉。如果元件位址一旦正常送讯,立即传送8位元的位址,成为写入资料的记忆位址。它与元件位址一样传送位址的8位元之后,发佈ACK读取的时脉,同时确认目标元件的ACK。写入行程的场合,写入资料的位元会持续续进行,一旦8位元的资料传送作业结束立即确认ACK,接着为表示通信即将结束,此时会发佈结束条件停止通信作业。
图5是I²C介面的串联(serial)EEPROM AT24C02的随机读取格式((random read format)。I²C的读取行程(read cycle)与微导线、SPI元件有若干差异,I²C的读取行程利用「读取位址的设定(假写入)」与「资料的读取」两种方式进行。读取行程与写入行程一样,会依序发佈开始条件、元件位址、读取位址,虽然在写入行程持续发佈写入资料,不过在读取行程上必需再度中断写入行程,此时读取位址的值变成目标元件内部resistor(亦即current pointer)设定状态。 在读取行程发佈第二次的开始条件之后,再度发佈元件位址,此时为了表示它是读取作业,因此必需将元件位址的最低阶位元的 位元变成”H”,如此一来读取1个时脉的ACK之后,才会自动进入资料收讯状态。
图5 I²C介面的serial EEPROM AT24C02的随机读取格式
有关资料的收讯,首先发佈8位元份的时脉再从MSB读取资料,虽然资料的读入第9个时脉的host会将ACK送返,不过通信的最终资料(亦即发佈结束条件之前的资料)的场合却不会发佈ACK,因此此处的位元停留在”H”状态,最后才发佈结束条件停止读取作业。随着元件的不同,某些元件具备「可以使该资料的读取部位反覆进行数次」,以及「位址可以连续高速读取资料的连续读取(sequence read)」等功能。连续读取的场合,读取最终资料以外的资料位元之后必需将ACK送返。图6是I²C介面的serial EEPROM AT24C02的连续读取格式。
图6 I²C介面的serial EEPROM AT24C02的连续读取格式
I²C元件与微处理器之间的介面利用两条GPIO进行,I²C元件一旦变成开放渠道(open drain),SCL与SDA的Line就必需举升(pull up)。图7是典型单晶片微处理器与I²C介面串联EEPROM AT24C02之间的介面,如图所示AT24C02介面分别使用PIC16F648A 、ATtiny2313、H8/3694F、R8C/15、μPD78F922等IC。
存取程式的结构与微导线元件、SPI元件相同,GPIO的初始化与位元控制部位则与元件有依存关系。表3是使用78KOS微处理机(μPD78F922)的存取程式,它与存取程式一样,如果更改GPIO的初始化与位元控制部位的关数,就能够使用其它型式的微处理器,接着依序介绍存取程式的关数功能。
图7 典型单晶片微处理器与I²C介面串联EEPROM AT24C02之间的介面
表3 使用78KOS微处理机(μPD78F922)的存取程式
此处请读者注意,由于下列关数与硬件有依存关系,因此必需配合微处理器进行调整修改。
(a).硬件依存部位 ▶关数名称: void PortInit( ) 执行埠(port)的初始化。 ▶关数名称: void ClkCnt(char sbit) 执行SCL作业。Sbit若是0的话,必需将SCL设定成”L”,除此之外SCL一律 设定成”H”。由于I²C是开放渠道,因此SCL=H时会变成Hi-Z状态。 ▶关数名称: void DatCnt(char sbit) 执行SDA作业。Sbit若是0的话,必需将SDA设定成”L” 除此之外SCL一律设定成”H”。由于I²C是开放渠道,因此SDA=H时会变成Hi-Z状态。 ▶关数名称: char DatChk( ) 执行SDA的读入作业。SDA若是”L”时会将0送返,SDA若是”H”时,会将0以外的值送返。
(b).内部关数 下列关数应用在内部处理。 ▶关数名称: void InitInterface( ) 执行介面的初始化。唿叫Port Init( ),执行埠的初始化,使控制信号变成不执行(default)状态。 ▶关数名称: void StartInterface( ) 发佈开始条件,开始进行通信。 ▶关数名称: void StopInterface( ) 发佈结束条件,停止进行通信。 ▶关数名称: void SenDat(char dat,char cnt ) 执行资料送讯,使资料位元从高阶位元传送cnt位元份。 ▶关数名称: char RecvDat(char cnt ) 执行资料收讯,接收从高阶位元传送的cnt位元份。
(c).元件存取关数 以下关数是元件存取的关数。高阶应用时只要唿叫此关数,就可以对元件进行存取,存取存取关数共有两种,分别如下: ▶关数名称: void I²CRead(char *buff,char adr) 它是I²C元件的读取关数,可以读取指定位址的8位元资料,并将收容读取资料的buff pointer交给缓冲器(buffer)。 ▶关数名称: void I²CWrite(char *buff,char adr) I²C元件的写入关数,可以将8位元的资料写入指定位址,并将收容写入资料的buff pointer交给缓冲器(buffer)。不过写入时间的控制并不是以此关数执行,因此高阶应用必需等待写入时间。 |