Advertisement
Guest User

Quelltext

a guest
Dec 3rd, 2014
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.11 KB | None | 0 0
  1.  
  2. /**
  3. * @brief Transmits in master mode an amount of data in blocking mode.
  4. * @param hi2c : Pointer to a I2C_HandleTypeDef structure that contains
  5. * the configuration information for the specified I2C.
  6. * @param DevAddress: Target device address
  7. * @param pData: Pointer to data buffer
  8. * @param Size: Amount of data to be sent
  9. * @param Timeout: Timeout duration
  10. * @retval HAL status
  11. */
  12. HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
  13. {
  14. uint32_t sizetmp = 0;
  15.  
  16. if(hi2c->State == HAL_I2C_STATE_READY)
  17. {
  18. if((pData == NULL ) || (Size == 0))
  19. {
  20. return HAL_ERROR;
  21. }
  22.  
  23. if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
  24. {
  25. return HAL_BUSY;
  26. }
  27.  
  28. /* Process Locked */
  29. __HAL_LOCK(hi2c);
  30.  
  31. hi2c->State = HAL_I2C_STATE_MASTER_BUSY_TX;
  32. hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
  33.  
  34. /* Send Slave Address */
  35. /* Set NBYTES to write and reload if size > 255 and generate RESTART */
  36. /* Size > 255, need to set RELOAD bit */
  37. if(Size > 255)
  38. {
  39. I2C_TransferConfig(hi2c,DevAddress,255, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE);
  40. sizetmp = 255;
  41. }
  42. else
  43. {
  44. I2C_TransferConfig(hi2c,DevAddress,Size, I2C_AUTOEND_MODE, I2C_GENERATE_START_WRITE);
  45. sizetmp = Size;
  46. }
  47.  
  48. do
  49. {
  50. /* Wait until TXIS flag is set */
  51. if(I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout) != HAL_OK)
  52. {
  53. if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
  54. {
  55. return HAL_ERROR;
  56. }
  57. else
  58. {
  59. return HAL_TIMEOUT;
  60. }
  61. }
  62. /* Write data to TXDR */
  63. hi2c->Instance->TXDR = (*pData++);
  64. sizetmp--;
  65. Size--;
  66.  
  67. if((sizetmp == 0)&&(Size!=0))
  68. {
  69. /* Wait until TXE flag is set */
  70. if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout) != HAL_OK)
  71. {
  72. return HAL_TIMEOUT;
  73. }
  74.  
  75. if(Size > 255)
  76. {
  77. I2C_TransferConfig(hi2c,DevAddress,255, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
  78. sizetmp = 255;
  79. }
  80. else
  81. {
  82. I2C_TransferConfig(hi2c,DevAddress,Size, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
  83. sizetmp = Size;
  84. }
  85. }
  86.  
  87. }while(Size > 0);
  88.  
  89. /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
  90. /* Wait until STOPF flag is set */
  91. if(I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout) != HAL_OK)
  92. {
  93. if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
  94. {
  95. return HAL_ERROR;
  96. }
  97. else
  98. {
  99. return HAL_TIMEOUT;
  100. }
  101. }
  102.  
  103. /* Clear STOP Flag */
  104. __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
  105.  
  106. /* Clear Configuration Register 2 */
  107. __HAL_I2C_RESET_CR2(hi2c);
  108.  
  109. hi2c->State = HAL_I2C_STATE_READY;
  110.  
  111. /* Process Unlocked */
  112. __HAL_UNLOCK(hi2c);
  113.  
  114. return HAL_OK;
  115. }
  116. else
  117. {
  118. return HAL_BUSY;
  119. }
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement