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.
 
 
 
 
 
 

172 lines
5.2 KiB

  1. /*!
  2. * \file i2c-board.c
  3. *
  4. * \brief Target board 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 "stm32l0xx.h"
  24. #include "utilities.h"
  25. #include "board-config.h"
  26. #include "i2c-board.h"
  27. /*!
  28. * The value of the maximal timeout for I2C waiting loops
  29. */
  30. #define TIMEOUT_MAX 0x8000
  31. static I2C_HandleTypeDef I2cHandle = { 0 };
  32. static I2cAddrSize I2cInternalAddrSize = I2C_ADDR_SIZE_8;
  33. void I2cMcuInit( I2c_t *obj, I2cId_t i2cId, PinNames scl, PinNames sda )
  34. {
  35. __HAL_RCC_I2C1_CLK_DISABLE( );
  36. __HAL_RCC_I2C1_CLK_ENABLE( );
  37. __HAL_RCC_I2C1_FORCE_RESET( );
  38. __HAL_RCC_I2C1_RELEASE_RESET( );
  39. obj->I2cId = i2cId;
  40. I2cHandle.Instance = ( I2C_TypeDef * )I2C1_BASE;
  41. GpioInit( &obj->Scl, scl, PIN_ALTERNATE_FCT, PIN_OPEN_DRAIN, PIN_NO_PULL, GPIO_AF4_I2C1 );
  42. GpioInit( &obj->Sda, sda, PIN_ALTERNATE_FCT, PIN_OPEN_DRAIN, PIN_NO_PULL, GPIO_AF4_I2C1 );
  43. }
  44. void I2cMcuFormat( I2c_t *obj, I2cMode mode, I2cDutyCycle dutyCycle, bool I2cAckEnable, I2cAckAddrMode AckAddrMode, uint32_t I2cFrequency )
  45. {
  46. __HAL_RCC_I2C1_CLK_ENABLE( );
  47. if( I2cFrequency == 100000 )
  48. {
  49. I2cHandle.Init.Timing = 0x00707CBB;
  50. }
  51. else if( I2cFrequency == 400000 )
  52. {
  53. I2cHandle.Init.Timing = 0x00300F38;
  54. }
  55. I2cHandle.Init.OwnAddress1 = 0;
  56. I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  57. I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  58. I2cHandle.Init.OwnAddress2 = 0;
  59. I2cHandle.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  60. I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  61. I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  62. HAL_I2C_Init( &I2cHandle );
  63. HAL_I2CEx_ConfigAnalogFilter( &I2cHandle, I2C_ANALOGFILTER_ENABLE );
  64. HAL_I2CEx_ConfigDigitalFilter( &I2cHandle, 0 );
  65. }
  66. void I2cMcuResetBus( I2c_t *obj )
  67. {
  68. __HAL_RCC_I2C1_CLK_DISABLE( );
  69. __HAL_RCC_I2C1_CLK_ENABLE( );
  70. __HAL_RCC_I2C1_FORCE_RESET( );
  71. __HAL_RCC_I2C1_RELEASE_RESET( );
  72. GpioInit( &obj->Scl, I2C_SCL, PIN_ALTERNATE_FCT, PIN_OPEN_DRAIN, PIN_NO_PULL, GPIO_AF4_I2C1 );
  73. GpioInit( &obj->Sda, I2C_SDA, PIN_ALTERNATE_FCT, PIN_OPEN_DRAIN, PIN_NO_PULL, GPIO_AF4_I2C1 );
  74. I2cMcuFormat( obj, MODE_I2C, I2C_DUTY_CYCLE_2, true, I2C_ACK_ADD_7_BIT, 400000 );
  75. }
  76. void I2cMcuDeInit( I2c_t *obj )
  77. {
  78. HAL_I2C_DeInit( &I2cHandle );
  79. __HAL_RCC_I2C1_FORCE_RESET();
  80. __HAL_RCC_I2C1_RELEASE_RESET();
  81. __HAL_RCC_I2C1_CLK_DISABLE( );
  82. GpioInit( &obj->Scl, obj->Scl.pin, PIN_ANALOGIC, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
  83. GpioInit( &obj->Sda, obj->Sda.pin, PIN_ANALOGIC, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
  84. }
  85. void I2cSetAddrSize( I2c_t *obj, I2cAddrSize addrSize )
  86. {
  87. I2cInternalAddrSize = addrSize;
  88. }
  89. LmnStatus_t I2cMcuWriteBuffer( I2c_t *obj, uint8_t deviceAddr, uint8_t *buffer, uint16_t size )
  90. {
  91. LmnStatus_t status = LMN_STATUS_ERROR;
  92. status = ( HAL_I2C_Master_Transmit( &I2cHandle, deviceAddr, buffer, size, 2000 ) == HAL_OK ) ? LMN_STATUS_OK : LMN_STATUS_ERROR;
  93. return status;
  94. }
  95. LmnStatus_t I2cMcuReadBuffer( I2c_t *obj, uint8_t deviceAddr, uint8_t *buffer, uint16_t size )
  96. {
  97. LmnStatus_t status = LMN_STATUS_ERROR;
  98. status = ( HAL_I2C_Master_Receive( &I2cHandle, deviceAddr, buffer, size, 2000 ) == HAL_OK ) ? LMN_STATUS_OK : LMN_STATUS_ERROR;
  99. return status;
  100. }
  101. LmnStatus_t I2cMcuWriteMemBuffer( I2c_t *obj, uint8_t deviceAddr, uint16_t addr, uint8_t *buffer, uint16_t size )
  102. {
  103. LmnStatus_t status = LMN_STATUS_ERROR;
  104. uint16_t memAddSize = 0;
  105. if( I2cInternalAddrSize == I2C_ADDR_SIZE_8 )
  106. {
  107. memAddSize = I2C_MEMADD_SIZE_8BIT;
  108. }
  109. else
  110. {
  111. memAddSize = I2C_MEMADD_SIZE_16BIT;
  112. }
  113. status = ( HAL_I2C_Mem_Write( &I2cHandle, deviceAddr, addr, memAddSize, buffer, size, 2000 ) == HAL_OK ) ? LMN_STATUS_OK : LMN_STATUS_ERROR;
  114. return status;
  115. }
  116. LmnStatus_t I2cMcuReadMemBuffer( I2c_t *obj, uint8_t deviceAddr, uint16_t addr, uint8_t *buffer, uint16_t size )
  117. {
  118. LmnStatus_t status = LMN_STATUS_ERROR;
  119. uint16_t memAddSize = 0;
  120. if( I2cInternalAddrSize == I2C_ADDR_SIZE_8 )
  121. {
  122. memAddSize = I2C_MEMADD_SIZE_8BIT;
  123. }
  124. else
  125. {
  126. memAddSize = I2C_MEMADD_SIZE_16BIT;
  127. }
  128. status = ( HAL_I2C_Mem_Read( &I2cHandle, deviceAddr, addr, memAddSize, buffer, size, 2000 ) == HAL_OK ) ? LMN_STATUS_OK : LMN_STATUS_ERROR;
  129. return status;
  130. }
  131. LmnStatus_t I2cMcuWaitStandbyState( I2c_t *obj, uint8_t deviceAddr )
  132. {
  133. LmnStatus_t status = LMN_STATUS_ERROR;
  134. status = ( HAL_I2C_IsDeviceReady( &I2cHandle, deviceAddr, 300, 4096 ) == HAL_OK ) ? LMN_STATUS_OK : LMN_STATUS_ERROR;
  135. return status;
  136. }