drv_i2c.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. * 2017-11-14 勤为本 first version
  9. */
  10. #include <rtthread.h>
  11. #include <drivers/i2c.h>
  12. #include <drivers/i2c-bit-ops.h>
  13. #include "drv_i2c.h"
  14. #include "../libraries/ls1c_gpio.h"
  15. #include "../libraries/ls1c_delay.h"
  16. #define LS1C_I2C_SCL (51) // gpio57
  17. #define LS1C_I2C_SDA (50) // gpio56
  18. #define LS1C_SET_GPIO_MODE
  19. static void ls1c_i2c_gpio_init(void)
  20. {
  21. gpio_init(LS1C_I2C_SCL, gpio_mode_output);
  22. gpio_set(LS1C_I2C_SCL, gpio_level_high);
  23. gpio_init(LS1C_I2C_SDA, gpio_mode_output);
  24. gpio_set(LS1C_I2C_SDA, gpio_level_high);
  25. return ;
  26. }
  27. static void ls1c_udelay(rt_uint32_t us)
  28. {
  29. delay_us((int)us);
  30. }
  31. static void ls1c_set_sda(void *data, rt_int32_t state)
  32. {
  33. #ifdef LS1C_SET_GPIO_MODE
  34. gpio_init(LS1C_I2C_SDA, gpio_mode_output);
  35. ls1c_udelay(5);
  36. #endif
  37. gpio_set(LS1C_I2C_SDA, state);
  38. return ;
  39. }
  40. static void ls1c_set_scl(void *data, rt_int32_t state)
  41. {
  42. #ifdef LS1C_SET_GPIO_MODE
  43. gpio_init(LS1C_I2C_SCL, gpio_mode_output);
  44. ls1c_udelay(5);
  45. #endif
  46. gpio_set(LS1C_I2C_SCL, state);
  47. return ;
  48. }
  49. static rt_int32_t ls1c_get_sda(void *data)
  50. {
  51. #ifdef LS1C_SET_GPIO_MODE
  52. gpio_init(LS1C_I2C_SDA, gpio_mode_input);
  53. ls1c_udelay(5);
  54. #endif
  55. return gpio_get(LS1C_I2C_SDA);
  56. }
  57. static rt_int32_t ls1c_get_scl(void *data)
  58. {
  59. #ifdef LS1C_SET_GPIO_MODE
  60. gpio_init(LS1C_I2C_SCL, gpio_mode_input);
  61. ls1c_udelay(5);
  62. #endif
  63. return gpio_get(LS1C_I2C_SCL);
  64. }
  65. static const struct rt_i2c_bit_ops bit_ops = {
  66. .data = RT_NULL,
  67. .set_sda = ls1c_set_sda,
  68. .set_scl = ls1c_set_scl,
  69. .get_sda = ls1c_get_sda,
  70. .get_scl = ls1c_get_scl,
  71. .udelay = ls1c_udelay,
  72. .delay_us = 20, // 此值为周期(us)
  73. .timeout = 10, // 单位为tick
  74. };
  75. int ls1c_i2c_init(void)
  76. {
  77. static struct rt_i2c_bus_device bus = {0};
  78. bus.priv = (void *)&bit_ops;
  79. ls1c_i2c_gpio_init();
  80. rt_i2c_bit_add_bus(&bus, "i2c3");
  81. return RT_EOK;
  82. }