PCI-PCI桥启动时,一般需要从EEPROM预读取配置数据。更改EEPROM中的数据一般需要专用的烧结器,这给调试过程带来不便。尤其是采用表贴封装的EEPROM。本文以Intel公司的Dec21554PCI-PCI桥为例,介绍一种在线读写EEPROM的方法。
EEPROM选用的是ATMEL公司生产的AT93LC66,4Kbit,按512×8bit组织。AT93LC66与Dec21554的硬件连线如图1所示。
Dec21554提供了一组寄存器,用于访问外接的串行ROM。寄存器位于CSR(控制状态寄存器组)空间中,基地址是PCI配置头部Secondary BAR2寄存器的值,文中定义为base。寄存器包括:
①ROM数据寄存器(RDR)。8位宽,用于存放读写数据。偏移地址是0x0CA。
②ROM地址寄存器(RAR)。24位宽,偏移地址是0x0CC,比特分配如下:
bit位置 | 23:11 | 10:9 | 8:7 | 6:0 |
意义 | 无用 | 操作码 | 操作码扩展 | 地址 |
操作码的意义:
01b——写(SROM_OpWrite);
10b——读(SROM_OpRead);
11b——擦;
00b——见操作码扩展位(SROM_OpGeneral)。
00b——写无效;
01b——全写;
10b——全擦;
11b——写有效(SROM_GeneralWriteEnable)。
操作码扩展位同时兼作地址的7、8位。该寄存器上电后的默认值为0x000400。
③ROM控制寄存器(RCR)。各bit含义如表1所列。
表1
bit位置 | 7:4 | 3 | 2 | 1 | 0 |
名称 | Reserved | SROM_POLL | RW_CTL | P_ROM_START | ROM_START |
意义 | 保留 | 反映串行ROM的查询结果 | 并行ROM读写控制 | 开始并行ROM的读写操作,并返回状态 | 开始串行ROM的读写操作,并返回状态 |
寄存器8位宽,偏移地址是0x0CF。
为了读取串行ROM垢数据,必须首先清除ROM控制寄存器的ROM_START位,然后进行如下操作:
①在ROM地址寄存器中写入读取数据的地址(address),以及读数据操作码。代码为
PUT32(base+0xCC,address|SROM_OpRead);
②在ROM控制寄存器中置ROM_START为1,开始读取;
PUT8(base+0xCF,ROM_START);
③当ROM_START位为0时,ROM数据寄存器中的值就是读取的值;
while(GET8(base+0xCF)&ROM_START)delay(1);
value=GET8(base+0xCA);
value就是读得的数据。那么,如何更改数据呢?
因为串行ROM在上电后,处于擦/写无效状态,所以在写数据之前,必须先设置擦/写为有效。步骤如下:
①在ROM地址寄存器中写入地址和操作码;
PUT32(base+0xCC,SROM_OpGeneral|SROM_GeneralWriteEnable);
②同时在ROM控制寄存器中设置ROM_START位为1;
PUT8(base+0xCF,ROM_START);
③当ROM_START位为0时,操作完成;
一旦串行ROM擦/写有效后,就可以写数据了,步骤如下:
①在ROM地址寄存器中写入地址和操作码;
PUT32(base+0xCC,address|SROM_OpWrite);
②在ROM数据寄存器中写入8位数据;
PUT8(base+0xCA,data);
③在ROM控制寄存器中置ROM_START位为1;
PUT8(base+0xCF,ROM_START);
④当ROM控制寄存器中的ROM_START位为0时,将ROM_START位置为1,SROM_POLL位自动置为1,开始查询操作,以验证写操作是否完成;
while(GET8(base+0xCF)&ROM_START)delay(4);
PUT8(base+0xCF,ROM_START);
while(GET8(base+0xCF)&ROM_START);
⑤SROM_POLL位显示了查询操作的状态。如果为1,串行ROM还要接着查询,否则,写操作完成。
While(GET8(base+0xCF)&SROM_POLL){
PUT8(base+0xCF,ROM_START);
while(GET8(base+0xCF)&ROM_START);
}
这样就完成了EEPROM的写操作过程。我们可以读出刚才写入的数据,验证是否写的正确。在调试过程中,只需要编写两个短小的读写程序,就可以解除经常使用烧写器带来的不例,提高调试效率。
上一篇:一种12位双通道高速数据采集处理系统
下一篇:DDRSRAM与HSTL电平标准