Implement a secure ICS protocol targeting LoRa Node151 microcontroller for controlling irrigation.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

209 lines
4.9 KiB

  1. /*!
  2. * \file i2c.c
  3. *
  4. * \brief I2C driver implementation
  5. *
  6. * \copyright Revised BSD License, see section \ref LICENSE.
  7. *
  8. * \code
  9. * ______ _
  10. * / _____) _ | |
  11. * ( (____ _____ ____ _| |_ _____ ____| |__
  12. * \____ \| ___ | (_ _) ___ |/ ___) _ \
  13. * _____) ) ____| | | || |_| ____( (___| | | |
  14. * (______/|_____)_|_|_| \__)_____)\____)_| |_|
  15. * (C)2013-2017 Semtech
  16. *
  17. * \endcode
  18. *
  19. * \author Miguel Luis ( Semtech )
  20. *
  21. * \author Gregory Cristian ( Semtech )
  22. */
  23. #include <stdbool.h>
  24. #include "utilities.h"
  25. #include "i2c-board.h"
  26. /*!
  27. * Flag to indicates if the I2C is initialized
  28. */
  29. static bool I2cInitialized = false;
  30. void I2cInit( I2c_t *obj, I2cId_t i2cId, PinNames scl, PinNames sda )
  31. {
  32. if( I2cInitialized == false )
  33. {
  34. I2cInitialized = true;
  35. I2cMcuInit( obj, i2cId, scl, sda );
  36. I2cMcuFormat( obj, MODE_I2C, I2C_DUTY_CYCLE_2, true, I2C_ACK_ADD_7_BIT, 400000 );
  37. }
  38. }
  39. void I2cDeInit( I2c_t *obj )
  40. {
  41. I2cInitialized = false;
  42. I2cMcuDeInit( obj );
  43. }
  44. void I2cResetBus( I2c_t *obj )
  45. {
  46. I2cMcuResetBus( obj );
  47. }
  48. LmnStatus_t I2cWrite( I2c_t *obj, uint8_t deviceAddr, uint8_t data )
  49. {
  50. if( I2cInitialized == true )
  51. {
  52. if( I2cMcuWriteBuffer( obj, deviceAddr, &data, 1 ) == LMN_STATUS_ERROR )
  53. {
  54. // if first attempt fails due to an IRQ, try a second time
  55. if( I2cMcuWriteBuffer( obj, deviceAddr, &data, 1 ) == LMN_STATUS_ERROR )
  56. {
  57. return LMN_STATUS_ERROR;
  58. }
  59. else
  60. {
  61. return LMN_STATUS_OK;
  62. }
  63. }
  64. else
  65. {
  66. return LMN_STATUS_OK;
  67. }
  68. }
  69. else
  70. {
  71. return LMN_STATUS_ERROR;
  72. }
  73. }
  74. LmnStatus_t I2cWriteBuffer( I2c_t *obj, uint8_t deviceAddr, uint8_t *buffer, uint16_t size )
  75. {
  76. if( I2cInitialized == true )
  77. {
  78. if( I2cMcuWriteBuffer( obj, deviceAddr, buffer, size ) == LMN_STATUS_ERROR )
  79. {
  80. // if first attempt fails due to an IRQ, try a second time
  81. if( I2cMcuWriteBuffer( obj, deviceAddr, buffer, size ) == LMN_STATUS_ERROR )
  82. {
  83. return LMN_STATUS_ERROR;
  84. }
  85. else
  86. {
  87. return LMN_STATUS_OK;
  88. }
  89. }
  90. else
  91. {
  92. return LMN_STATUS_OK;
  93. }
  94. }
  95. else
  96. {
  97. return LMN_STATUS_ERROR;
  98. }
  99. }
  100. LmnStatus_t I2cWriteMem( I2c_t *obj, uint8_t deviceAddr, uint16_t addr, uint8_t data )
  101. {
  102. if( I2cInitialized == true )
  103. {
  104. if( I2cMcuWriteMemBuffer( obj, deviceAddr, addr, &data, 1 ) == LMN_STATUS_ERROR )
  105. {
  106. // if first attempt fails due to an IRQ, try a second time
  107. if( I2cMcuWriteMemBuffer( obj, deviceAddr, addr, &data, 1 ) == LMN_STATUS_ERROR )
  108. {
  109. return LMN_STATUS_ERROR;
  110. }
  111. else
  112. {
  113. return LMN_STATUS_OK;
  114. }
  115. }
  116. else
  117. {
  118. return LMN_STATUS_OK;
  119. }
  120. }
  121. else
  122. {
  123. return LMN_STATUS_ERROR;
  124. }
  125. }
  126. LmnStatus_t I2cWriteMemBuffer( I2c_t *obj, uint8_t deviceAddr, uint16_t addr, uint8_t *buffer, uint16_t size )
  127. {
  128. if( I2cInitialized == true )
  129. {
  130. if( I2cMcuWriteMemBuffer( obj, deviceAddr, addr, buffer, size ) == LMN_STATUS_ERROR )
  131. {
  132. // if first attempt fails due to an IRQ, try a second time
  133. if( I2cMcuWriteMemBuffer( obj, deviceAddr, addr, buffer, size ) == LMN_STATUS_ERROR )
  134. {
  135. return LMN_STATUS_ERROR;
  136. }
  137. else
  138. {
  139. return LMN_STATUS_OK;
  140. }
  141. }
  142. else
  143. {
  144. return LMN_STATUS_OK;
  145. }
  146. }
  147. else
  148. {
  149. return LMN_STATUS_ERROR;
  150. }
  151. }
  152. LmnStatus_t I2cRead( I2c_t *obj, uint8_t deviceAddr, uint8_t *data )
  153. {
  154. if( I2cInitialized == true )
  155. {
  156. return( I2cMcuReadBuffer( obj, deviceAddr, data, 1 ) );
  157. }
  158. else
  159. {
  160. return LMN_STATUS_ERROR;
  161. }
  162. }
  163. LmnStatus_t I2cReadBuffer( I2c_t *obj, uint8_t deviceAddr, uint8_t *buffer, uint16_t size )
  164. {
  165. if( I2cInitialized == true )
  166. {
  167. return( I2cMcuReadBuffer( obj, deviceAddr, buffer, size ) );
  168. }
  169. else
  170. {
  171. return LMN_STATUS_ERROR;
  172. }
  173. }
  174. LmnStatus_t I2cReadMem( I2c_t *obj, uint8_t deviceAddr, uint16_t addr, uint8_t *data )
  175. {
  176. if( I2cInitialized == true )
  177. {
  178. return( I2cMcuReadMemBuffer( obj, deviceAddr, addr, data, 1 ) );
  179. }
  180. else
  181. {
  182. return LMN_STATUS_ERROR;
  183. }
  184. }
  185. LmnStatus_t I2cReadMemBuffer( I2c_t *obj, uint8_t deviceAddr, uint16_t addr, uint8_t *buffer, uint16_t size )
  186. {
  187. if( I2cInitialized == true )
  188. {
  189. return( I2cMcuReadMemBuffer( obj, deviceAddr, addr, buffer, size ) );
  190. }
  191. else
  192. {
  193. return LMN_STATUS_ERROR;
  194. }
  195. }