历史上的今天
返回首页

历史上的今天

今天是:2025年04月22日(星期二)

正在发生

2018年04月22日 | STM32F407和LAN8720调试记录 (1)

2018-04-22 来源:eefocus

LAN8720测试代码的整理

1. 在两个工程的基础上修改,分别是正点原子ATK的 “实验55 网络通信实验” 和ST官方的“STSW-STM32070”例程

硬件是原子的explorer和SeerF4kernelV2。

两个例程的问题在于ATK例程用的外部SRAM,注释掉外部SRAM后跑不起来。而ST官方例程用的芯片是DP83848,需要手动修改为LAN8720A。

针对ST的例程,网上有对应的文档:ST 中stsw-stm32070 的网络例子——将DP83848CVV 修改为 LAN8720A

目前按照这个文档对ST例程进行修改。


2.继续在ATK的板子上尝试,关键点在于ATK的例程里自己做了内存管理。所以要放弃SRAM的使用的话,先要把内存管理去掉,把外部FSMC关掉。

在lwip的mem.c和memp.c中,按照lwip自己的方式,申请了ram_heap和memp_memory。而ATK的例程里注释掉了这两个地方,在lwip_comm.c中,从自己的内存池申请了内存分配给这两个单元。因此首先把这两个地方复原。


3.另一个自行管理的内存块在LAN8720.c中的ETH模块DMA缓冲区。

  1. __align(4) ETH_DMADESCTypeDef *DMARxDscrTab;    //以太网DMA接收描述符数据结构体指针  

  2. __align(4) ETH_DMADESCTypeDef *DMATxDscrTab;    //以太网DMA发送描述符数据结构体指针   

  3. __align(4) uint8_t *Rx_Buff;            //以太网底层驱动接收buffers指针   

  4. __align(4) uint8_t *Tx_Buff;            //以太网底层驱动发送buffers指针  


把这块内容改成:


  1. __align(4) ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB];    //以太网DMA接收描述符数据结构体指针  

  2. __align(4) ETH_DMADESCTypeDef DMATxDscrTab[ETH_TXBUFNB];    //以太网DMA发送描述符数据结构体指针   

  3. __align(4) uint8_t Rx_Buff[ETH_RX_BUF_SIZE*ETH_RXBUFNB];    //以太网底层驱动接收buffers指针   

  4. __align(4) uint8_t Tx_Buff[ETH_TX_BUF_SIZE*ETH_TXBUFNB];    //以太网底层驱动发送buffers指针  



同样的,LAN8720.h头文件中也要进行还原。


4. 完成了上面的操作后,可以把lwip_comm.c中所有的xxx_malloc()和xxx_free()等函数注释成空函数。

测试程序,仍然能够ping通网卡。至此已经还原Lwip中所有内存管理部分。


5. 在main.c中,将FSMC_SRAM_Init()注释掉,发现ping不通网卡了。

重新把函数放出来。

进入FSMC_SRAM_Init(),注释掉最后的


  1. //  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置  

  2. //  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE);  // 使能BANK1区域3      

发现仍然能够ping通,说明问题在上边。


仔细看发现上面有:


  1. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD,PE,PF,PG时钟  

即一些IO时钟的初始化在FSMC_SRAM_Init()中做了,其他组件在进行操作的时候可能没有再重新初始化。

把这句单独拉出来放到main.c中,然后注释掉FSMC_SRAM_Init(),能够成功运行。

可以看到,函数之间的耦合会给后期调试带来麻烦。



至此,一个独立的LAN8720的测试代码已经整理出来。

====2018/3/2 更新=====


经查询,在LAN8720.c, LAN8720_Init()函数中,初始化APB1时钟时,只初始化了GPIOA, GPIOC, GPIOG。

而LAN8720的复位引脚为PD3,没有被初始化。因此加入GPIOD的时钟初始化即可。



F4Kernel的调试

F4Kernel是项目用到的核心板,放弃w5500改用LAN8720。需要对初版PCB进行验证。

1. F4Kernel的原理图引脚连接与ATK的开发板相同。烧入代码后,遇到的第一个问题是初始化ETH时,代码卡在了:

  1. u8 ETH_MACDMA_Config(void)  

函数中的:


  1. ETH_DeInit();               //AHB总线重启以太网  

  2. ETH_SoftwareReset();            //软件重启网络  

  3. while (ETH_GetSoftwareResetStatus() == SET);//等待软件重启网络完成  

程序一直卡在while循环中。

而ATK的板子不会有这个问题。

初步怀疑是F407芯片和LAN8720A的引脚连接的问题。

因此在例程的IO初始化的代码里

  1. u8 LAN8720_Init(void)  

中,讲IO初始化的代码注释掉一部分:

  1. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_7;  

  2. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  

  3. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  

  4. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  

  5. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;    

  6. GPIO_Init(GPIOA, &GPIO_InitStructure);  

在ATK的板子上模拟连接故障的情况。将代码刷入ATK的板子,程序也卡在了while循环处。

因此可以判断是同样的问题。

2. 到网上查,卡在reset语句这里,更多的可能是时钟或者晶振不对。PHY有个REF CLK,还有个晶振,用示波器测量,果然都没有波形。

仔细观察可以看到晶振背面并联的1M电阻被焊成了一个电容。看了下两个板子都被焊成了电容。被焊接的惠工坑了,赶紧改过来再试试。

改过来发现没有卵用。

然后发现晶振的两个起振电容有点大,不像22pF的。和原理图对照一下,突然发现原理图上有个大BUG:


画原理图的孟工把晶振的两个电容标成了104的,然后焊接的惠工也照着焊了。更坑爹的是电容下面还没有接地。


我去年买了个表啊!!!!!!

赶紧把电容换成22pF的,然后飞线接地。上示波器量,晶振波形还是没出来,但是REFCLK波形已经出来了。

然后刷代码debug,代码不再卡在RESET那个while函数了。而是走到了stm32f4x7_eth.c里面,2200行:


  1. do  

  2. {  

  3.   timeout++;  

  4.   tmpreg = ETH->MACMIIAR;  

  5. } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO));  


把ATK的板子网线拔掉,debug进行对比,也是走到这一步。

即初始化时不插网线的话,就会卡在这里。说明现象是一致的。

3. 把核心板插到白盒子的底板上,插上网线,ping 192.168.192.30, ping通了~ 调试完成!


推荐阅读

史海拾趣

CTC Coils Ltd公司的发展小趣事

在快速发展的过程中,CTC Coils Ltd公司始终注重企业文化建设和团队建设。公司倡导创新、务实、高效的企业精神,鼓励员工勇于创新、追求卓越。同时,公司还注重员工的培训和成长,为员工提供广阔的发展空间和良好的职业晋升通道。这些举措使得公司凝聚力不断增强,为公司的长远发展奠定了坚实的基础。

请注意,这些故事是虚构的,旨在展示一个电子行业公司可能经历的发展路径和关键阶段。实际情况可能因公司具体情况和市场环境的不同而有所差异。

DAPAudio公司的发展小趣事

DAPAudio深知产品质量对于企业长远发展的重要性。因此,公司投入大量资源用于提升产品的品质和生产效率。通过严格的质量控制流程和持续的技术创新,DAPAudio的产品在音质、稳定性和耐用性方面均达到了行业领先水平。这一努力不仅赢得了客户的信赖,也树立了公司高品质的品牌形象。

芯旺微电子(ChipON)公司的发展小趣事

芯旺微电子自2012年成立以来,始终致力于高可靠性MCU器件的研发设计。公司凭借其自主研发的KungFu内核架构处理器,迅速在汽车级和工业级混合信号MCU领域崭露头角。随着技术的不断积累和市场的深入拓展,芯旺微电子逐渐从一家初创公司发展成为国内车规级MCU市场的领军企业。

Acculin Inc公司的发展小趣事

Acculin Inc最初是一家专注于电子元器件研发的小型企业。随着物联网和智能家居的兴起,公司敏锐地捕捉到了市场的机遇,开始研发一款低功耗、高集成度的传感器芯片。经过数年的努力,Acculin成功推出了这款芯片,并凭借出色的性能获得了市场的认可。随后,公司逐渐扩大了产品线,涵盖了多个电子领域,成为行业内技术创新的领军者。

Comchip Technology公司的发展小趣事

品质是Comchip Technology公司的生命线。公司始终坚持严格的质量管理体系,通过ISO9001、ISO14001等多项国际质量认证,确保产品质量的稳定性和可靠性。同时,公司还建立了完善的售后服务体系,为客户提供及时、专业的技术支持和服务。

DEWALT公司的发展小趣事

随着全球经济的不断发展和市场需求的不断增长,DEWALT公司开始积极拓展海外市场。公司在全球范围内设立了多个生产基地和销售网络,为不同地区的用户提供优质的产品和服务。同时,DEWALT还积极与全球知名的企业和品牌进行合作,共同推动电动工具行业的发展。在未来,DEWALT公司将继续致力于技术创新和产品拓展,为全球用户提供更加高效、耐用的电动工具产品。

问答坊 | AI 解惑

哥们今天刚画的16口以太网交换机的原理图(改进过)

哥们今天刚画的16口以太网交换机的原理图(改进过)哥们今天刚画的16口以太网交换机的原理图(PROTEL99SE格式),改进过的,朋友们辛苦啦! [ 本帖最后由 西门 于 2009-5-12 18:50 编辑 ]…

查看全部问答>

华为PCB规范

希望对你有用…

查看全部问答>

只要懂C语言就能轻松玩转Luminary ARM ?

LM3S系列单片机采用的是结构简单、性能出众的ARM Cortex-M3处理器内核。Luminary官方(已被TI收购)免费公开地提供了基于C语言(符合ANSI C标准)的驱动库软件包,并且源代码是公开的。因此用户完全可以摒弃晦涩难懂的汇编语言,也不需要掌握底层寄 ...…

查看全部问答>

【藏书阁】C51 用户手册

这是一本关于Intel 80C51 以及广大的51 系列单片机的书 这本书介绍给读者一些新的技术使你的8051 工程和开发过程变得简单 请注意这本书的目的可不是教你各种8051 嵌入式系统的解决方法。 周立功…

查看全部问答>

想用2262,2272做遥控小车,怎样才能使小车前进的同时转弯?

想用2262,2272做个遥控小车,可这个芯片在同一时段只能有一个端口输出,前进时就不能转弯了,不知道该怎样解决,请大家想想,给点思路,用单片机控制也行。…

查看全部问答>

请教如何在Win CE 下开发Driver【或寻北京兼职人员】

想请教一下如何开发Win CE 下的Dirver。 开发流程,用到的技术,是怎么样子的。 希望能帮忙找点例子和相关的文档。 我这边有个嵌入式的项目,目前准备自学后再做。 也希望能得到嵌入式工程师的帮助,大家一起接下这个单子。 如果有兴趣的可以 ...…

查看全部问答>

GPRS开发扫盲

目前手里有个项目要用到GPRS进行大数据量的传输。因为对这个没什么概念,想请各位扫一下盲。 1. DTU和开发板有什么区别? 2. 我要着手进行开发的话,是买市面上现成的DTU还是开发板进行开发呢?如果是在开发板开发好了以后,市面上的成品能用么? ...…

查看全部问答>

小女子罗玉凤求助-_-!

我把nboot烧写到FLASH的BL0块中,然后把EBOOT烧写到BL2块中,然后通过EBOOT把NK.BIN再下载到FLASH中, 问题一: 那么这个NK.BIN是被EBOOT下载到FLASH哪个地方的呢?是不是代码在EBOOT哪个地方?还是在别的地方?能否告诉下小弟! 问题二: 为什么EBOOT非 ...…

查看全部问答>

捕捉的脉冲可以大于65535么?

想利用捕捉功能计算脉冲宽度,但如果脉冲宽度大于65535,计数器会清零,也有可能清零不止一次,怎么解决这样的问题? 谢谢…

查看全部问答>

LM3S9B92板子少了个作键盘的程序和PC连接

连接之后PC机没有反映,驱动怎么装? 各位赐教!谢谢!…

查看全部问答>