(16)对93C46编程

日期 2001-11-04
作者 老古 http://www.laogu.com Email:zhangshenggu@vip.163.com
内容

如果RTL8019AS使用了93C46,那么如何通过单片机对它进行编程呢?
93C46是一个有128字节的eeprom,可以是8位或16位的存储模式,在RTL8019AS中,用的是16位的模式,也就是总共有64个16位的存储单元.16位方式下,存储地址为0---63 .每个地址存储两个字节,低位字节在前,高位字节在后(这跟单片机的存储相反,单片机是高位在前,低位在后).
下表是93c46存储的内容,地址是用字节表示的.

 


设置为跳线方式,i/o地址 240h 的时候,00h-03h的内容如下:
config2 01H: 0x00
config1 00H: 0x96
config4 03H: 0x01
config3 02H: 0x10
04h-09h 是6个字节的网卡地址,也可以修改.

如果我们不使用Plug and Play方式,那么从12h到7fh地址空间可以用来存储用户自己的数据.用户可以在12-7f里写入任何的数据.这样就可以节省用户自己的eeprom(比如24c02).
对93c46读或写要用到两个寄存器,一个是RTL8019AS的命令寄存器CR,一个是第3页的9346CR寄存器.
先向CR写入0xE2选择第3页的寄存器,然后就可以通过存取9346CR来进行93c46的读或者写了.
读93C46的程序:
1.移位输出8位数据的子程序:

注解:
uchar 为unsigned char
reg01即9346CR
reg00为CR
关于reg00 reg01的定义见我前面的相关文章.
9346CR含义:

对93C46读或者写必须使EEM1=1 EEM0=0.
EECS控制93C46的CS脚, RTL8019AS的输出,93C46的输入.
EESK控制93c46的SK脚, RTL8019AS的输出,93C46的输入.
EEDI控制93c46的DI脚, RTL8019AS的输出,93C46的输入.
EEDO是93c46的DO脚的状态,为RTL8019AS的输入,93C46的输出.
93C46引脚图:

93C46的操作的命令:
93C46读操作的时序:

93C46读的程序:

注解:
address为地址,为0---63,字地址,而不是字节地址.
字节地址:00 ,01 用字地址为0
字节地址:02,03 用字地址为1
....
最后一句reg01=0x00,表示向9346CR写入0,退出93C46的读写. 这句不能忽略
返回值为16位的uint(unsigned int).返回值中的高字节为位0--7,低字节为8-15,注意跟单片机的相反.
操作命令为上面的Instution Set里的read.
时序为上面的Read Timing.



93C46的写程序:

注解:
写程序中,address为地址0---63,value为16位(两个字节),必须一次性写入2个字节.
wait for write finish里的for循环是为了不至于程序死锁,比如出错时,可能引起93c46一直处于忙的状态.
这样最多执行查询1万次就退出.这是用户必须注意的,当你编写类似的程序,比如IIC总线的写操作,也要这样做,否则你的单片机可能死在那里.
93C46写入一次的时间为1毫秒左右,最大不超过10毫秒.
93C46允许最大的sk时钟为2Mhz,因为单片机的总线速度不超过2Mhz ,所以每两条指令之间不用插入延时.如果你用比较快的cpu,比如AVR或DSP,可能要插入延时.
reg01=0x00,表示向9346CR写入0,每完成一个93C46的命令,都以它结束.这句不能忽略
写需要执行3个93c46命令:
1.EWEN command写使能
2.WRITE command写数据
3.EWDS command禁止写
三个命令的时序图:


将3个命令结合在一起,才能写入93C46.

对于写入PCI接口的网卡RTL8029AS的93C46 是类似的,不作重复论述.


来源
老古网

欢迎技术探讨和发表评论