[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