初级会员
- 积分
- 131
- 金钱
- 131
- 注册时间
- 2018-11-13
- 在线时间
- 30 小时
|
因为项目需求需要调试一款双网口模块,采用的是STM32F407+DM9162+D9000的方案。调试完DM9162后开始调试DM9000。本以为会轻车熟路几天弄完,没想到噩梦就此开始。方案移植完之后就开始出现串口端一直出现dm9000 rx: rx error, stop device以及ping不通。然后参考各个论坛的各种帖子,各有各的说法,但是问题始终得不到解决。最后干脆还是回到原点参考正点原子的STM32F1 LWIP开发手册(DM9000)及相关程序,LWIP相关文件和正点原子一模一样,然后鬼使神差的修改了下FSMC参数,最后就ping通了。回头对比测试最后定位故障点其实就是FSMC的参数配置问题。FSMC的参数有几个,我们采用的是A模式,实际上真正需要配置的有三个。
/*-- FSMC Configuration ------------------------------------------------------*/ /* FMC使用的HCLK,主频168MHz,1个FMC时钟周期就是5.95ns */ ReadWriteTiming.FSMC_AddressSetupTime = 4; /* 设置为0、1会出错; 3正常 */ReadWriteTiming.FSMC_AddressHoldTime = 0; /* 地址保持时间,配置为模式A时,用不到此参数 范围1 -15个时钟周期个数 */
ReadWriteTiming.FSMC_DataSetupTime = 3; /* 设置为0、1、2出错,3正常 */
ReadWriteTiming.FSMC_BusTurnAroundDuration = 2; /* 两次连续数据之间的时间间隔,范围1 -15个时钟周期个数 0、1出错*/
ReadWriteTiming.FSMC_CLKDivision = 0x00; /* 此配置用不到这个参数 */
ReadWriteTiming.FSMC_DataLatency = 0x00; /* 此配置用不到这个参数 */
ReadWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;//使用模式A
1、FSMC_BusTurnAroundDuration 两次连续数据之间的时间间隔,这个数值太低会导致串口持续收到dm9000 rx: rx error, stop device。这个参数可以参考时序图中的T6.
2、ReadWriteTiming.FSMC_AddressSetupTime = 3; /* 设置为0、1会出错; 3正常 */
3、ReadWriteTiming.FSMC_DataSetupTime = 2; /* 设置为0、1、2出错,3正常 */
FSMC_AddressSetupTime 、FSMC_DataSetupTime 这两个参数设置过低会导致工作一段时间后dm9000 rx: rx error, stop device,此时DM9000不再工作。
另外值得注意的地方是我的电路中CMD采用的是A18地址线,RST是采用单独的端口控制。各位根据自己电路实际情况做调整。
以上仅作参考。
当然最后奉上代码(无操作系统-中断模式)。发这个帖子的初衷也是因为各个帖子要么不上传代码,要么就是只传一部分,所以当初就有ping通之后就把代码共享的想法。
最后祝大家早日ping通。
|
|