Sida 19 av 29

Re: STM32 har allt - Utom trådlöshet

Postat: 25 april 2022, 23:01:16
av DanielM
Så här. MAC-adressen stämmer enligt konfigurationen. :tumupp:
Men varför svarar den inte tillbaka när man pingar? :?: Tingeling tingeling, come on baby give me ping.

Kod: Markera allt

C:\Users\danie>arp -a 192.168.1.15

Interface: 192.168.1.34 --- 0xc
  Internet Address      Physical Address      Type
  192.168.1.15          80-80-a2-ae-13-41     dynamic

C:\Users\danie>

Re: STM32 har allt - Utom trådlöshet

Postat: 25 april 2022, 23:06:16
av TomasL
Är ICMP påslaget/Inkluderat?

Re: STM32 har allt - Utom trådlöshet

Postat: 25 april 2022, 23:27:44
av DanielM
Ja. Det är det.
Detta måste vara en bug hos ST.
Skärmklipp.PNG

Re: STM32 har allt - Utom trådlöshet

Postat: 25 april 2022, 23:37:01
av TomasL
Du får väl börja att debugga det hela.

Re: STM32 har allt - Utom trådlöshet

Postat: 26 april 2022, 00:48:14
av DanielM
Jag har verkligen aktiverat hela debug för LwIP. Men tydligen så verkar inget vara aktiverat.
Skärmklipp.PNG
Skärmklipp.PNG

Re: STM32 har allt - Utom trådlöshet

Postat: 26 april 2022, 10:19:39
av agehall
Sätt breakpoints och inspektera saker.

Re: STM32 har allt - Utom trådlöshet

Postat: 26 april 2022, 14:27:15
av DanielM
Jag har gjort det i 2 veckor nu.

Det jag har kommit fram till är:

- MAC adressen fungerar
- IP Adressen fungerar
- Inget minnesfel, trots att jag sätter heap på något slumpmässig adress. Jag vet inte vad jag ska sätta på, men jag sätter den runt 0x2000000 till 0x2000200 enligt vad RAM-minnet har.
- Jag får time out när jag pingar (Troligtvis så förstår den inte meddelandet)

Jag tror jag ska testa med WireShark för att analysera trafiken.

Re: STM32 har allt - Utom trådlöshet

Postat: 26 april 2022, 17:12:42
av agehall
Wireshark kommer inte ge dig speciellt mycket - den kommer visa att du skickar ett ICMP-paket och inget mer.

Sätt breakpoints i TCP/IP-stacken och kolla vad som händer när paket kommer in.

Re: STM32 har allt - Utom trådlöshet

Postat: 26 april 2022, 18:59:58
av davidi
Det vet man inte förrän man har provat. Om det t ex skickas ett felaktigt ping-svar kan man se det med Wireshark.

Re: STM32 har allt - Utom trådlöshet

Postat: 26 april 2022, 20:30:55
av agehall
Det är högst otroligt att det skickas ett svar och som är felaktigt. Och om så är fallet, så behöver man ändå inspektera koden som genererar svaret, så det är lika bra att börja där direkt.

Re: STM32 har allt - Utom trådlöshet

Postat: 27 april 2022, 20:17:21
av DanielM
agehall skrev: 26 april 2022, 17:12:42 Wireshark kommer inte ge dig speciellt mycket - den kommer visa att du skickar ett ICMP-paket och inget mer.

Sätt breakpoints i TCP/IP-stacken och kolla vad som händer när paket kommer in.
Jag kan inte ens se IP-adressen för att kolla i Wireshark. Så Wireshark är värdelös här.
agehall skrev: 26 april 2022, 20:30:55 Det är högst otroligt att det skickas ett svar och som är felaktigt. Och om så är fallet, så behöver man ändå inspektera koden som genererar svaret, så det är lika bra att börja där direkt.

Vid uppstarten så anropas denna funktion

Kod: Markera allt

/**
  * @brief  Write a value to a PHY register through the MDIO interface.
  * @param  DevAddr: PHY port address
  * @param  RegAddr: PHY register address
  * @param  RegVal: Value to be written
  * @retval 0 if OK -1 if Error
  */
int32_t ETH_PHY_IO_WriteReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t RegVal)
{
  if(HAL_ETH_WritePHYRegister(&heth, DevAddr, RegAddr, RegVal) != HAL_OK)
  {
    return -1;
  }

  return 0;
}
DevAddr = 0x1 och RegAddr = 0x0 samt RegVal = 0x8000

Detta betyder att RESET aktiveras hos Ethernet PHY, vilket är helt korrekt. Problemet är att....denna funktion ETH_PHY_IO_WriteReg, anropas BARA en gång vid uppstart av mikrokontrollern...den anropas inte mera....
Skärmklipp.PNG

Re: STM32 har allt - Utom trådlöshet

Postat: 27 april 2022, 21:38:06
av Klas-Kenny
Om PHY'et är i reset så skulle ARP aldrig fungera. Så det kan inte vara problemet, om ARP nu faktiskt fungerar.
Måste vara någonstans högre upp i IP-stacken det går fel.

Re: STM32 har allt - Utom trådlöshet

Postat: 27 april 2022, 21:48:55
av DanielM
Nej, alltså detta register återställer bara PHY så PHY får sina initiala värden.

Jag kollar lite på register som man kan sätta i STM32CubeIDE och det verkar fungera stämma överens med databladet.
Skärmklipp.PNG
Skärmklipp.PNG

Re: STM32 har allt - Utom trådlöshet

Postat: 27 april 2022, 21:53:16
av Klas-Kenny
Oavsett, PHY'et är inte att misstänka fel på om ARP fungerar.
Kommer inga paket alls fram på ena eller andra hållet kan man misstänka PHY, men eftersom ARP fungerar kan du släppa PHY'et och gå uppåt.

Re: STM32 har allt - Utom trådlöshet

Postat: 27 april 2022, 21:56:56
av DanielM
Nu äntligen har jag fått ett errormeddelande!
Se pilen längst ned.

Kod: Markera allt

/**
  * @brief  Read a received packet.
  * @param  heth: pointer to a ETH_HandleTypeDef structure that contains
  *         the configuration information for ETHERNET module
  * @param  pAppBuff: Pointer to an application buffer to receive the packet.
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_ETH_ReadData(ETH_HandleTypeDef *heth, void **pAppBuff)
{
  uint32_t descidx;
  ETH_DMADescTypeDef *dmarxdesc;
  uint32_t desccnt = 0U;
  uint32_t desccntmax;
  uint32_t bufflength;
  uint8_t rxdataready = 0U;


  if (pAppBuff == NULL)
  {
    heth->ErrorCode |= HAL_ETH_ERROR_PARAM;
    return HAL_ERROR;
  }

  if (heth->gState != HAL_ETH_STATE_STARTED)
  {
    return HAL_ERROR;
  }

  descidx = heth->RxDescList.RxDescIdx;
  dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
  desccntmax = ETH_RX_DESC_CNT - heth->RxDescList.RxBuildDescCnt;

  /* Check if descriptor is not owned by DMA */
  while ((READ_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_OWN) == (uint32_t)RESET) && (desccnt < desccntmax)
         && (rxdataready == 0U))
  {
    if (READ_BIT(dmarxdesc->DESC0,  ETH_DMARXDESC_LS)  != (uint32_t)RESET)
    {
      /* Get timestamp high */
      heth->RxDescList.TimeStamp.TimeStampHigh = dmarxdesc->DESC6;
      /* Get timestamp low */
      heth->RxDescList.TimeStamp.TimeStampLow  = dmarxdesc->DESC7;
    }
    if ((READ_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_FS) != (uint32_t)RESET) || (heth->RxDescList.pRxStart != NULL))
    {
      /* Check first descriptor */
      if (READ_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_FS) != (uint32_t)RESET)
      {
        heth->RxDescList.RxDescCnt = 0;
        heth->RxDescList.RxDataLength = 0;
      }

      /* Check if last descriptor */
      bufflength = heth->Init.RxBuffLen;
      if (READ_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_LS) != (uint32_t)RESET)
      {
        /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
        bufflength = ((dmarxdesc->DESC0 & ETH_DMARXDESC_FL) >> ETH_DMARXDESC_FRAMELENGTHSHIFT) - 4U;

        /* Save Last descriptor index */
        heth->RxDescList.pRxLastRxDesc = dmarxdesc->DESC0;

        /* Packet ready */
        rxdataready = 1;
      }

      /* Link data */
      WRITE_REG(dmarxdesc->BackupAddr0, dmarxdesc->DESC2);
#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
      /*Call registered Link callback*/
      heth->rxLinkCallback(&heth->RxDescList.pRxStart, &heth->RxDescList.pRxEnd,
                           (uint8_t *)dmarxdesc->BackupAddr0, bufflength);
#else
      /* Link callback */
      HAL_ETH_RxLinkCallback(&heth->RxDescList.pRxStart, &heth->RxDescList.pRxEnd,
                             (uint8_t *)dmarxdesc->BackupAddr0, (uint16_t) bufflength);
#endif  /* USE_HAL_ETH_REGISTER_CALLBACKS */
      heth->RxDescList.RxDescCnt++;
      heth->RxDescList.RxDataLength += bufflength;

      /* Clear buffer pointer */
      dmarxdesc->BackupAddr0 = 0;
    }

    /* Increment current rx descriptor index */
    INCR_RX_DESC_INDEX(descidx, 1U);
    /* Get current descriptor address */
    dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
    desccnt++;
  }

  heth->RxDescList.RxBuildDescCnt += desccnt;
  if ((heth->RxDescList.RxBuildDescCnt) != 0U)
  {
    /* Update Descriptors */
    ETH_UpdateDescriptor(heth);
  }

  heth->RxDescList.RxDescIdx = descidx;

  if (rxdataready == 1U)
  {
    /* Return received packet */
    *pAppBuff = heth->RxDescList.pRxStart;
    /* Reset first element */
    heth->RxDescList.pRxStart = NULL;

    return HAL_OK;
  }

  /* Packet not ready */
  return HAL_ERROR; <<<<------------------
}