Menu Close

FPGA I2C(IIC) Verilog 开发学习(四):eeprom检测程序

大家好,我们上几篇里分享了I2C的基础操作,这一篇我们做个工作中可能会用到的程序:eerpom芯片检测程序。比如工作中领导给了你一块板子,说让你检测一下eerpom芯片有没有问题,就会用得到。这不是很简单么?只要每个地址都写入一个数,再依次读出,检查一下是不是刚才写入的数据就ok了呀?是的,方法上没错。只不过这里还有点注意事项。

我们以Atmel公司的AT24C02为例,这款eerpom芯片是I2C接口,具有256个8bit寄存器空间(芯片datasheet中称之为“字”,很多资料中也称之为“寄存器”,我们这里也称之为寄存器。)。本来,使用I2C通讯只需要遵守I2C通讯的规则就可以进行读写了,大部分操作是没问题的,但也有特例,就是在这个程序里要用到的——连续写(手册里称“page write(页写)”)。

先构思一下程序实现过程,第一步写数据,第二步读出数据并检查对错。在第一步写数据里,我们可以用的方法有随机地址写和连续写(或页写)。第二步的方法有随机地址读和连续读。很显然,对一整个芯片进行读写检查,它的地址是连续的,因此使用连续写和连续读是效率最高的。

查看AT24C02的datasheet,它的内部空间被划分成32个页,每个页8个word,每个word 8个bit。可以进行长度为8字节的页写。如果进行超过8字节的页写,则地址会滚动到最前面,并会把最前面的数据覆盖。例如地址0-7,8-15,16-23…..为每页的地址范围,AT24C02有32个页,如果连续写的地址跨页,则地址会滚动到该页最前面,并会把最前面的数据覆盖。例如开始地址为5,连续写4个数据,则会对地址 5,6,7,0进行写入。这时候不但地址8的数据不会写入,而且会错误的改变0地址的数据。如果对AT24C02 全部空间进行读写,则不能一次连续写,必须分32次写,每次写8个地址。每次写通讯结束后,芯片需要5ms时间才能把数据真正写入到寄存器里。连续读操作没有限值。

因此我们的想法是,一个起始地址0,一个结束地址255,写入的数据是255到0,依次递减。使用页写模式。先全部写入,完成后再全部读出。(部分代码如下:请见附件工程代码)

其他模块,我们还需要一个开始模块,用于给上面的I2C检测模块发出开始命令。一个数码管显示模块,用于显示错误信息,一个led控制模块,用于输出指示灯。顶层框图如下:

附件:

工程代码:test_eeprom_quartus_pra006

AT24C02_datasheet:AT24C02

附件下载

Posted in FPGA 教材教案, 教材与教案

发表评论

您的电子邮箱地址不会被公开。

Leave the field below empty!

相关链接