老古开发网首页
导航:老古开发网首页文章索引索引第2044页文章分类存储器第8页→[PCI-PCI桥在线读写EEPROM的技巧]
| -文章搜索 - 最新文章 - |

第41979篇:PCI-PCI桥在线读写EEPROM的技巧

发布时间:2006年5月19日 点击次数:645
来源:   作者:上海贝尔有限公司 王 江
 

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时,操作完成;

    while((value=GET8(base+0xCF))&ROM_START)delay(1);

一旦串行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的写操作过程。我们可以读出刚才写入的数据,验证是否写的正确。在调试过程中,只需要编写两个短小的读写程序,就可以解除经常使用烧写器带来的不例,提高调试效率。


欢迎进入老古论坛进行讨论
[存储器] 相关文章:
基于闪烁存储器的TMS320VC5409DSP并行引导装载方法
简介:
摘要: 闪烁存储器Am29LV400B的主要特点及编程方法;通过把FLASH的前32K映射到DSP TMS320VC5409的数据空间,按照自举表(Boottable)的格式在FLASH中存储程序代码,由DSP引导装载(Bootloader)程序实现了FLASH的16位并行引导装载;结合实例介绍了该引导装载方法的实现过程。 ......

大容量串行FlashMM36SB010系列特点及应用
闪存LH28F160及基于DSP的编程写入
东芝卷入闪存侵权风暴,数亿赔付之余大量产品将要付诸东流
SanDisk和Micron为争霸主竞相并购Lexar
 
下一个:[存储器]DDRSRAM与HSTL电平标准
简介:
摘要: DDR技术和HSTL电平标准是近年来出现的高速数据传输技术,结合实际课题探讨应用了这两种技术的DDR SRAM器件的具体使用。 关键词: DDR SRAM HSTL电......

上一个:[通信网络]混沌置换网络的设计及其硬件实现

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:30分钟 执行时间:47毫秒