Skocz do zawartości

Próba odtworzenia minimalnego przykładu WiFi echo dla ST67W61M


Pomocna odpowiedź

Napisano

Dzień dobry,

Od kilku dni staram się utworzyć minimalną aplikacje dla ST67W61M (nowo wypuszczonego modułu WiFI/BLE od ST). Zestaw nad którym pracuje to NUCLEO-H753ZI i X-NUCLEO-67W61M (płytki połączone są przez standardowe złącze arduino).

Tutaj link do kodu: https://github.com/RolandSobczak/H753ZI_WIFI

Problem polega na tym, że nie jestem w stanie opuścić semafora w kodzie sterownika dostarczanego przez ST. Mianowicie w pliku:

`Middlewares/ST/ST67W6X_Network_Driver/Driver/W61_at/w61_at_common.c:372`

  xReturned = xSemaphoreTake(mdm->sem_if_ready, pdMS_TO_TICKS(4000));
  if (xReturned != pdPASS)
  {
    SYS_LOG_ERROR("sem_if_ready not received\n");
    ret = -1;
    goto __err;
  }

Do modułu staram się podłączyć przez SPI1. Tutaj jest moja inicjalizacja SPI1:

void MX_SPI1_Init(void)
{

  /* USER CODE BEGIN SPI1_Init 0 */

  /* USER CODE END SPI1_Init 0 */

  /* USER CODE BEGIN SPI1_Init 1 */

  /* USER CODE END SPI1_Init 1 */
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 0x0;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
  hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
  hspi1.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
  hspi1.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
  hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
  hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
  hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
  hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
  hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN SPI1_Init 2 */

  /* USER CODE END SPI1_Init 2 */

}

Tutaj moja konfiguracja GPIO:

#define CHIP_EN_Pin GPIO_PIN_11
#define CHIP_EN_GPIO_Port GPIOE
#define SPI_RDY_Pin GPIO_PIN_13
#define SPI_RDY_GPIO_Port GPIOE
#define STLINK_RX_Pin GPIO_PIN_8
#define STLINK_RX_GPIO_Port GPIOD
#define STLINK_TX_Pin GPIO_PIN_9
#define STLINK_TX_GPIO_Port GPIOD
#define SPI_CS_Pin GPIO_PIN_14
#define SPI_CS_GPIO_Port GPIOD

Patrząc w schematy ze strony ST:

https://www.st.com/resource/en/schematic_pack/mb2230-antenna-a04-schematic.pdf
https://www.st.com/resource/en/schematic_pack/mb1364-h753zi-c01_schematic.pdf

Po lewej schemat pinout X-NUCLEO po prawej płytki z MCU

ST67_CN5.thumb.png.2cae471f37db0e5afb58090d610f3f82.pngH753ZI.thumb.png.8f687317539273006b9badd535e63326.png
Na powyższych
 grafikach widać, że połączenia powinny wyglądać następująco:
connections.thumb.png.d5a43325ff54386c66b0a3997240f6ac.png

Czy ktoś jest mi wstanie podpowiedzieć dlaczego nie mogę przejść tego kroku? Widzę, że ten semafor jest opuszczany w tym miejscu:
`Middlewares/ST/ST67W6X_Network_Driver/Driver/W61_at/w61_at_common.c:723`

MODEM_CMD_DEFINE(on_cmd_ready) {
  struct modem *mdm = (struct modem *)data->user_data;

  (void)xSemaphoreGive(mdm->sem_if_ready);

  return 0;
}

Ale nie rozumiem co wywołuje tą część kodu...

Poniżej jeszcze zrzuty konfiguracji w CubeMX:
H753ZI_GPIO_CUBE.thumb.png.732f9e75404700d95bacf60cd831cfe4.pngSPI1_Cube.thumb.png.83f29865ad9384d693dac9c2b0308907.png

Widzę, że nikt nie odpowiedział na post. Być może zbyt zawile sformułowałem pytanie. Zamówiłem płytkę pod którą ST wypuściło największą ilość przykładów dla tego modułu (NUCLEO-U575ZI-Q). Spróbuje na debugerze prześledzić, co dokładnie dzieje się w przykładach od ST i może to pozwoli mi zrozumieć w jaki sposób działa kod. Jeżeli się uda wrzucę tutaj wyjaśnienie. 

Niestety kod jest napisany w dość skomplikowany sposób. Teraz już rozumiem dlaczego mówi się, że makra utrudniają zrozumienie kodu...:

MODEM_CMD_DEFINE(on_cmd_ready) {
  struct modem *mdm = (struct modem *)data->user_data;

  (void)xSemaphoreGive(mdm->sem_if_ready);

  return 0;
}

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...