EEPROM驱动程序中,需要处理复用GPIO初始化与I2C的设置,为了更好地读写EEPROM,字节写入、缓冲写入、页写入、缓冲读取与等待状态读等函数需要编写。下面就这些函数进行编写。
1.设置GPIO的I2C复用函数
函数如下:
这部分代码与之前写过的GPIO初始化代码基本一致,但这里需要注意,GPIO的输出模式必须是漏极开路GPIO_OType_OD,以满足I2C的电路特性的要求。
2.设置I2C的工作模式函数
函数如下:
设置I2C工作模式,首先定义初始化结构体,并根据实际情况对结构体赋值设置。完成初始化结构体后,使用I2C初始化函数,然后是使能I2C1、使能I2C1事件。
3.字节写入函数
编写I2C_EEPROM_ByteWrite()函数,目的是写一个字节到I2C EEPROM中,若写入成功,则返回1;若超时,则返回相应的错误代码。函数有两个形参,第一个形参是写入数据的指针,第二个形参是写入的目的地址。程序代码如下:
程序流程图与图10-10的时序逻辑图一致,在程序中加入了超时错误检测,以方便检查是哪个环节出现问题。
4.页写入函数
为了更高效地写入数据,我们编写页写入函数,一次可以写入多个字节,但一次写入的字节数不能超过EEPROM页的大小。AT24C02每页有8个字节。与字节写入函数类似,该函数有三个形参,第一个形参是写入数据的指针,第二个形参是写入的目的地址,第三个形参是写入的字节数。函数带返回值,若写入成功,则返回1;若发生超时错误,则返回相应的超时代码。
编写页写入函数主要是为了快捷写入多个字节(字节数小于页容量),当然字节写入函数也可以循环使用,但是效率会比页写入函数低。函数的流程图与图10-10的时序逻辑图描述一致,只不过写入多个字节过程中间没有发送停止信号P。
5.缓冲写入函数
为了高效地写入更多的数据,我们编写缓冲写入函数。写入字节数可以超过页容量。函数的形参有三个,第一个形参是写入数据的指针,第二个形参是写入的目的地址,第三个形参是写入的字节数。写入的字节数可以超过页容量。
程序看起来比较复杂,但逻辑基本与Nor Flash的写入类似,主要还是页边界对齐的问题,程序流程图如图10-24所示。
图10-24 缓冲写入函数流程图
6.读取数据到缓冲区函数(www.xing528.com)
实现从EEPROM里面读取若干字节的数据,编写读取数据到缓冲区函数函数有三个形参:第一个形参是存放从EEPROM读取的数据的缓冲区指针,第二个形参是需要读取数据的EEPROM的地址,第三个形参是要从EEPROM读取的字节数。函数带返回值,若读取成功,则返回1;若出现超时错误,则返回错误代码。
在读数据之前,程序首先要查询总线是否忙,因此使用了I2C_GetFlagStatus(EEPROM_I2C,I2C_FLAG_BUSY)函数。
程序流程分两步:
(1)主设备先往I2C总线发送起始信号S/检测EV5—发送AT24C02的7位地址设置写模式/检测EV6—发送EEPROM内部读取地址/检测EV8。这部分完成目的地址的输送,主设备作为发送设备。这部分流程与图10-10前半部分一致。
(2)主设备重新发送起始信号S/检测EV5—发送AT24C02的7位地址码并且设置读模式/检测EV6—主设备接收/检测EV7—关闭应答—发送结束信号P。这部分流程图与图10-11一致。
7.等待准备函数
缓冲写入函数的结尾都有一个I2C_EEPROM_WaitStandbyState()函数,该函数的作用是等待EEPROM准备好,即等待它处理完读写操作。函数如下:
程序通过读取状态寄存器SR1来获取忙信息。16位状态寄存器SR1的bit1是忙标志,所以程序使用了与运算进行判断:如果忙,则不断循环查询;如果不忙,则退出循环清除标志,发送结束信号P。
8.超时函数
在每个可能出现超时的地方,程序都设置了超时检测以及相应的错误代码输出,可以用来定位是哪个环节出错。函数形参为超时错误代码。若函数返回0,说明I2C通信失败。这个函数供内部使用。
函数如下:
最后编写EEPROM驱动程序EEPROM.c如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。