16.3.10 多字节读子函数

多字节读子函数用于主器件从SDA线上读取多个字节的数据。在读多个字节的操作中,除了发送寻址字节外,还要发送器件的子地址。因此,在读多个字节操作前,要进行一个字节的写操作,然后重新开始读操作,将从器件内的字节数据读出。多字节写读函数的流程图如图16.10所示,多字节写读函数示例如下。

16.3.10 多字节读子函数 - 图1

图 16.10 多字节读子函数流程图


void ReadI2C(unsigned char*RamAddress,unsigned char RomAddress,unsigned char bytes)

{//读n个字节数据子程序

Startic();//启动

Write8Bitic(WriteDeviceAddress);//写写器件的寻址地址

TestAckic();//应答检查

Write8Bitic(RomAddress);//写I2C器件内部数据的读取首地址

TestAckic();//应答检查

Startic();//重新启动

Write8Bitic(ReadDviceAddress);//写读器件的寻址地址

TestAckic();//应答检查

while(bytes!=1)//循环读入字节数据

{

*RamAddress=Read8Bitic();//读入一个字节

Ackic();//应答

RamAddress++;//地址指针递增

bytes—;//待读入数据个数递减

}

*RamAddress=Read8Bitic();//读入最后一个字节数据

NoAckic();//非应答

Stopic();//停止


该程序中,RamAddress为接收数据缓冲区的首地址,Rom-Address为I2C外围器件的数据读取首地址,bytes为读入字节的个数。通过多次调用Write8Bitic子函数,分别用于发送读写寻址字节和I2C外围器件的内部数据读地址。在读取数据时,循环调用了Read8Bitic()子函数。另外,ReadDviceAddress和WriteDevice-Address分别为读写I2C外围器件的寻址字节,遵循寻址字节的格式。其声明示例如下。


define WriteDeviceAddress 0xB0

define ReadDviceAddress 0xB1


从中可以看出,主器件读取多个字节数据的数据操作格式与发送多字节数据类似,只不过寻址地址中的方向位应置为读取而已。