Guest User

Quelltext

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