| 内容 |  如果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 是类似的,不作重复论述.
 |