drv_hard_i2c.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-06-18 thread-liu the first version
  9. */
  10. #include <board.h>
  11. #include "drv_hard_i2c.h"
  12. //#define DRV_DEBUG
  13. #define LOG_TAG "drv.hardi2c"
  14. #include <drv_log.h>
  15. I2C_HandleTypeDef hI2c4;
  16. int32_t BSP_I2C4_Init(void)
  17. {
  18. int32_t status = RT_EOK;
  19. if (HAL_I2C_GetState(&hI2c4) == HAL_I2C_STATE_RESET)
  20. {
  21. if (MX_I2C4_Init(&hI2c4) != HAL_OK)
  22. {
  23. status = -RT_EBUSY;
  24. }
  25. /* Init the I2C Msp */
  26. if (HAL_I2C_Init(&hI2c4) != HAL_OK)
  27. {
  28. LOG_D("I2C4 Init Error!\n");
  29. status = -RT_EBUSY;
  30. }
  31. }
  32. return status;
  33. }
  34. int32_t BSP_I2C4_DeInit(void)
  35. {
  36. int32_t status = RT_EOK;
  37. HAL_I2C_MspDeInit(&hI2c4);
  38. /* Init the I2C */
  39. if (HAL_I2C_DeInit(&hI2c4) != HAL_OK)
  40. {
  41. status = -RT_EEMPTY;
  42. }
  43. return status;
  44. }
  45. HAL_StatusTypeDef MX_I2C4_Init(I2C_HandleTypeDef *hI2c)
  46. {
  47. hI2c4.Instance = I2C4;
  48. hI2c->Init.Timing = I2C4_TIMING;
  49. hI2c->Init.OwnAddress1 = STPMU1_I2C_ADDRESS;
  50. hI2c->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  51. hI2c->Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  52. hI2c->Init.OwnAddress2 = 0;
  53. hI2c->Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  54. hI2c->Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  55. hI2c->Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  56. return HAL_I2C_Init(hI2c);
  57. }
  58. int32_t BSP_I2C4_WriteReg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length)
  59. {
  60. return I2C4_WriteReg(DevAddr, Reg, I2C_MEMADD_SIZE_8BIT, pData, Length);
  61. }
  62. int32_t BSP_I2C4_ReadReg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length)
  63. {
  64. return I2C4_ReadReg(DevAddr, Reg, I2C_MEMADD_SIZE_8BIT, pData, Length);
  65. }
  66. int32_t BSP_I2C4_WriteReg16(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length)
  67. {
  68. return I2C4_WriteReg(DevAddr, Reg, I2C_MEMADD_SIZE_16BIT, pData, Length);
  69. }
  70. int32_t BSP_I2C4_ReadReg16(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length)
  71. {
  72. return I2C4_ReadReg(DevAddr, Reg, I2C_MEMADD_SIZE_16BIT, pData, Length);
  73. }
  74. int32_t BSP_I2C4_IsReady(uint16_t DevAddr, uint32_t Trials)
  75. {
  76. int32_t status = RT_EOK;
  77. if(HAL_I2C_IsDeviceReady(&hI2c4, DevAddr, Trials, 1000) != HAL_OK)
  78. {
  79. status = -RT_EBUSY;
  80. }
  81. return status;
  82. }
  83. static int32_t I2C4_WriteReg(uint16_t DevAddr, uint16_t Reg, uint16_t MemAddSize, uint8_t *pData, uint16_t Length)
  84. {
  85. int32_t status = -RT_EIO;
  86. if(HAL_I2C_Mem_Write(&hI2c4, DevAddr, Reg, MemAddSize, pData, Length, 10000) == HAL_OK)
  87. {
  88. status = RT_EOK;
  89. }
  90. return status;
  91. }
  92. static int32_t I2C4_ReadReg(uint16_t DevAddr, uint16_t Reg, uint16_t MemAddSize, uint8_t *pData, uint16_t Length)
  93. {
  94. int32_t status = -RT_EIO;
  95. if (HAL_I2C_Mem_Read(&hI2c4, DevAddr, Reg, MemAddSize, pData, Length, 10000) == HAL_OK)
  96. {
  97. status = RT_EOK;
  98. }
  99. return status;
  100. }