16.3.10 多字节读子函数
多字节读子函数用于主器件从SDA线上读取多个字节的数据。在读多个字节的操作中,除了发送寻址字节外,还要发送器件的子地址。因此,在读多个字节操作前,要进行一个字节的写操作,然后重新开始读操作,将从器件内的字节数据读出。多字节写读函数的流程图如图16.10所示,多字节写读函数示例如下。
图 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
从中可以看出,主器件读取多个字节数据的数据操作格式与发送多字节数据类似,只不过寻址地址中的方向位应置为读取而已。