因项目中需要使用双网口,在F767+LAN8720的方案基础上,参考原子哥F103开发板的DM9000例程,加入了DM9000作为第二个网口。
由于硬件连线完全与F103中一致,按照F103的程序,在F767中对DM9000的FMC配置如下。
实际测试中,发现DHCP过程中,接收数据出错,持续提示“rx error stop device”
经排查发现,是读取MRCMD指令,获取status、 rxlen后,连续读取DATA,但是递增的DM9000的SRAM地址不正常,与rxlen不符。导致下一次读取MRCMDX的地址串位,读出的既不是0x00也不是0x01,最终导致接收错误。
在DM9000初始化配置寄存器函数中,读取配置完的寄存器,读数返回正常。
但是读SRAM数据,是连续执行 *data= DM9000->DATA,也就是连续的读操作。而不是读取寄存器时,先写入寄存器名再读回寄存器值的读写操作。
因此考虑是读时序的问题。按照F103例程配置为模式1 ,读写时序相同,尝试不同的ADDSET 、 DATASET,均没有效果。继续读手册,发现模式1中RD信号没有高低切换,与DM9000手册中的读时序不相符!
DM9000读时序中,要求RD信号拉低之前,要有T6时间的拉高,T6>80ns。
而配置了模式1的F767 ,在连续读操作时,显然不能满足T6>80ns。 而F103配置为模式1,连续读没有出错的原因,可能是F103主频较低,两次读操作之间的while循环语句时间超过了80ns(此原因为推测,并未验证)
将F767 FMC配置为更接近DM9000读时序的模式A,果然问题解决,可以正常连接网路,不再提示错误。
最终配置程序如下: