STM32 har allt - Utom trådlöshet

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

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

Inlägg 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>
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45167
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg av TomasL »

Är ICMP påslaget/Inkluderat?
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

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

Inlägg av DanielM »

Ja. Det är det.
Detta måste vara en bug hos ST.
Skärmklipp.PNG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45167
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg av TomasL »

Du får väl börja att debugga det hela.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

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

Inlägg av DanielM »

Jag har verkligen aktiverat hela debug för LwIP. Men tydligen så verkar inget vara aktiverat.
Skärmklipp.PNG
Skärmklipp.PNG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
agehall
Inlägg: 418
Blev medlem: 12 augusti 2020, 19:27:54

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

Inlägg av agehall »

Sätt breakpoints och inspektera saker.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

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

Inlägg 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.
agehall
Inlägg: 418
Blev medlem: 12 augusti 2020, 19:27:54

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

Inlägg 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.
davidi
Inlägg: 571
Blev medlem: 13 oktober 2011, 16:45:38
Ort: Ekerö

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

Inlägg 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.
agehall
Inlägg: 418
Blev medlem: 12 augusti 2020, 19:27:54

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

Inlägg 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.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

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

Inlägg 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
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Klas-Kenny
Inlägg: 11291
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

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

Inlägg 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.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

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

Inlägg 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
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Klas-Kenny
Inlägg: 11291
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

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

Inlägg 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.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

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

Inlägg 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; <<<<------------------
}
Skriv svar