[elektro] STM32H7 SPI problema

uprogc uprogc at gmail.com
Thu Dec 12 10:30:16 CET 2019


Sziasztok,

*Felteszem ide is, hatha erdekel valakit....aztan innen megy az STM
forumra.*
*( a kod gorgetheto, igy jott le a forumrol, nem rossz: ) )*

HAL SPI.
Keszitettem egy 16b-es valtozatot a HAL_SPI_Transmit( )-bol.


   1. HAL_SPI_Transmit_16b(SPI_HandleTypeDef *hspi, uint16_t *pData,
   uint16_t Size, uint32_t Timeout)



A lenyegi resze:

Az Init-ben levo, ide vonatkozo:
DSIZE = 16b.


   1. hspi5.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;



Transmit( ):


   1. /* Transmit data in 16 Bit mode */
   2.   if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
   3.   {
   4.       /* Transmit data in 16 Bit mode */
   5.       while (hspi->TxXferCount > 0U)
   6.       {
   7.         /* Wait until TXE flag is set to send data */
   8.         if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE))
   9.         {
   10.                 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXTF)) {
   11.                  __HAL_SPI_CLEAR_TXTFFLAG(hspi);
   12.                 }
   13.
   14.                 *((__IO uint16_t *)&hspi->Instance->TXDR) = (*(
   uint16_t*)pTxBuffPtr);
   15.
   16.                 pTxBuffPtr ++;
   17.                 hspi->TxXferCount--;
   18.
   19.         }
   20.         else
   21.         {
   22.           /* Timeout management */
   23.           if ((Timeout == 0U) || ((Timeout != HAL_MAX_DELAY) && ((
   HAL_GetTick() - tickstart) >=  Timeout)))
   24.           {
   25.             /* Set the error code and execute error callback*/
   26.             SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_TIMEOUT);
   27.             HAL_SPI_ErrorCallback(hspi);
   28.
   29.             /* Set the SPI State ready */
   30.             hspi->State = HAL_SPI_STATE_READY;
   31.
   32.             /* Process Unlocked */
   33.             __HAL_UNLOCK(hspi);
   34.             return HAL_ERROR;
   35.           }
   36.         }
   37.       }
   38.   }
   39.
   40.         /* wait for Tx data to be sent */
   41.   if ( (errorcode = SPI_WaitFlagStateUntilTimeout(hspi,
   SPI_FLAG_EOT, SPI_FLAG_EOT, SPI_DEFAULT_TIMEOUT, tickstart)) != HAL_OK)
   42.   {
   43.     SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);
   44.   }
   45.   else
   46.   {
   47.     __HAL_SPI_CLEAR_EOTFLAG(hspi);
   48.     __HAL_SPI_CLEAR_TXTFFLAG(hspi);
   49.   }



Debugerben lepesrol lepesre regiszter szinten ellenorizve, mukodik, ha 3
16b-es adatot kuldok ki folyamatosan.
Ha 1 elemu adattal hasznalom, akkor nem allitja be a TXTF flaget amikor
kellene, viszont a regiszterek alapjan ugy tunik hogy kikuldi az adatot (
TXC, EOT -t beallitja ), es a vegen le is torli a megfelelo flageket.
Ha ezutan meghivom ugy hogy ujra 3 elemet kuldjon ki, akkor ido elott beall
a TXTF es az alabbi sornal timeout lesz:


   1. if ( (errorcode = SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_EOT,
   SPI_FLAG_EOT, SPI_DEFAULT_TIMEOUT, tickstart)) != HAL_OK)



Namost a kodban lathato hogy en ezt flaget figyelem es ha ido elott
beallitja, akkor letorlom. Ezzel igy ugy tunik hogy mukodik, de nem ertem
hogy miert tortenik mindez konkretan.
A _01DATA az initben, ha jol ertem annyit jelent hogy egyszerre egy DSIZE
meretu adat ( jelen esetben 16b ) tarolhato egyszerre a FIFOban.

Valakinek otlete ?

Udv.
Szabi


More information about the Elektro mailing list