当前位置:   article > 正文

STM32与FPGA实现以太网功能--web、UDP、tcp测试_stm32 jepg udp

stm32 jepg udp

web网管程序在ETH工程已经做好并验证完成了,现在STM32+FPGA实现ping功能,那么web功能应该一样能实现

问题1:浏览器输入192.168.1.30,能出现登入界面,但是输入密码点击没反应,果然没有一帆风顺的。

原因:发现有一个设备正常,另一个设备通过TFTP下发web网页偶尔正常。打印排查下,发现读网页大小不对(估计用W25Q16弄的文件系统哪里bug,记录下,等以后处理)

解决:FPAG程序问题,问题2的第四条+问题3

问题2:web网管有的卡,登入界面不是很流畅

原因:浏览器下发命令,STM32上传web数据帧,网页数据比较大,有10K以上,需要发送10帧以上数据,STM32与FPGA数据传输效率不行,

解决方法:

1、FSMC驱动速率尽可能快,减少与FPGA通信时间

  1. /* ComSpaceTiming */
  2. ComSpaceTiming.SetupTime = 0;
  3. ComSpaceTiming.WaitSetupTime = 2;
  4. ComSpaceTiming.HoldSetupTime = 2;
  5. ComSpaceTiming.HiZSetupTime = 1;
  6. /* AttSpaceTiming */
  7. AttSpaceTiming.SetupTime = 0;
  8. AttSpaceTiming.WaitSetupTime = 2;
  9. AttSpaceTiming.HoldSetupTime = 2;
  10. AttSpaceTiming.HiZSetupTime = 1;

2、STM32网络输出等待FPGA发送完(数据频率快,可能出现丢包现象)

  1. uint8_t fpgaBuf[1600] = {0};
  2. uint8_t fpga_SendPacket(struct pbuf *p)
  3. {
  4. struct pbuf* q = NULL;
  5. uint8_t regData = 0;
  6. uint16_t txLen = 0;
  7. xSemaphoreTake(FSMC_Handle, 1000);
  8. regData = fpga_One_read(FPAG_TX_ISR);
  9. while((regData &0X01)==1)//FPGA中有未发送完成数据
  10. {
  11. xSemaphoreGive( FSMC_Handle );//给出互斥量
  12. // printf("FPGA donot send over %d\r\n", regData);
  13. return 0;
  14. }
  15. q = p;
  16. txLen = 0;
  17. while(q)
  18. {
  19. if(txLen + q->len >= 1600)
  20. {
  21. xSemaphoreGive( FSMC_Handle );//给出互斥量
  22. printf("FPGA err %d %d\r\n", txLen, q->len);
  23. return 0;
  24. }
  25. memcpy(&fpgaBuf[txLen], (uint8_t*)q->payload, q->len);
  26. txLen += q->len;
  27. q = q->next;
  28. }
  29. if(txLen < 60)// 最少60,ARP应答42字节无效?
  30. {
  31. memset(&fpgaBuf[txLen], 0, (60 - txLen));
  32. txLen = 60;
  33. }
  34. fpga_write(FPAG_TX_ADD, fpgaBuf, txLen);
  35. fpga_One_write(FPAG_TX_LEN_ADDH,(txLen>>8)&0XFF);
  36. fpga_One_write(FPAG_TX_LEN_ADDL, txLen&0XFF);
  37. fpga_One_write(FPAG_TX_ISR, 0X01);
  38. while((fpga_One_read(FPAG_TX_ISR)&0X01)); //等待发送完成
  39. // printf("FPGA send start %d\r\n", txLen);
  40. xSemaphoreGive( FSMC_Handle );//给出互斥量
  41. return 1;
  42. }

3、减小web网页,减少发送次数

web网管实现,udp、tcp通讯应该没问题,这监控数据通信,频率很低,数据很少

4、接收保存网络数据帧的RAM块只有一个,网络帧间隔0.5ms以下可能出现STM32处理不过来的现象,增加个RAM块

问题3:STM32发送的网络帧偶尔出现异常

原因:使用方式1变化RAM地址获取RAM数据,通过网络工具抓包分析异常帧发现读RAM数据地址不是从0开始(上个帧的接收地址开始?)

  1. TXCNT:与GMII接收通讯一帧数据第几时序
  2. RAM_TX_RADD :RAM模块地址
  3. 方式1:一帧数据开始时候RAM地址清零,在固定时序RAM地址不断+1
  4. RAM_TX_RADD <= RAM_TX_RADD + '1';
  5. 方式2:一帧数据开始时候RAM地址清零,与固定时序值关联
  6. RAM_TX_RADD <= TXCNT(11 downto 1) - "00000000101";

解决:查看代码确定新的一帧开始有把地址清零,使用方式2,问题解决

问题4:FPGA采集2M接口数据不断通过UDP发送个另一台设备,10多分钟后1台设备fifo出现空标志,另一台出现满标志,监控状态发现UDP并没有丢包

原因:两个设备的晶振频率存在偏差,25M晶振频率偏差±10ppm,FPGA采集发送数据频率是按本地晶振控制的,但FPGA发送数据是远端设备采集到后通过UDP发送过来的,也就是远端1S采集(25+0.000001)Mbit数据,本地1S只能发出(25-0.000001)Mbit数据,频率不完全一致

解决:使用动态频率发送数据,接收fifo中几乎满标志出现,发送频率加快,几乎空标志出现,发送频率降低。动态频率需要测试发送数据接口业务是否正常(对频率有严格要求的可能业务异常)

  1. --读取fifo_tx时钟
  2. divTClk_H <= "01010" when fifo_TX_AlmostFull = '1' else
  3. "01100" when FIFO_TX_AlmostEmpty = '1' else
  4. "01011";
  5. PROCESS(CLK25M)
  6. BEGIN
  7. if(CLK25M'event and CLK25M='1') then
  8. if(divTClk >= "01011" and CLK2M_TX = '1')then divTClk <= (others => '0');CLK2M_TX <= '0';
  9. elsif(divTClk >= divTClk_H and CLK2M_TX = '0')then divTClk <= (others => '0');CLK2M_TX <= '1';
  10. else divTClk <= divTClk + '1';
  11. end if;
  12. end if;
  13. END PROCESS;

问题5:设备点对点 直连没FPGA传输业务数据没问题,但是中间加两台交换机后,FPGA业务不同

原因:①排查对比STM32发送的UDP数据帧,发现FPGA发送的UDP数据校验和没处理为0,修改FPGA程序实现校验和计算,FPGA发送的UDP帧还是不通

②对比经过交换机与不要交换机UDP数据帧,发现接收到UDP帧的源MAC地址与发送设备的MAC地址不一样,交换机MAC地址进行映射

解决:STM32解析目标设备MAC地址,设置FPGA参数

问题5:设备A电口1与设备B电口1连接,A\B设备正常通讯,A电口1与A电口1网线都拔出后再插到A电口2与B电口2,需要间隔3~4分钟才能通讯上(A电口1拔出插到A电口2上,能很快通讯上。用电脑cmd命令发送arp -d也可以)

原因:交换机内部有MAC映射表,这表是监控ARP帧应答获取MAC地址形成的。lwi中通讯成功后,间隔5分钟才发送一次ARP帧

解决:修改ARP_MAXAGE  值为20,20秒发送一次(不知道STM32直接接RMII口是否也有这问题?以前没有这样使用过)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/972282
推荐阅读
相关标签
  

闽ICP备14008679号