pcf8574.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. *
  7. * Change Logs:
  8. * Date Author Notes
  9. * 2018-11-21 SummerGift first version
  10. * 2018-11-22 flybreak Make the first version of pcf8574's package
  11. */
  12. #include "pcf8574.h"
  13. #define DBG_ENABLE
  14. #define DBG_SECTION_NAME "pcf8574"
  15. #define DBG_LEVEL DBG_INFO
  16. #define DBG_COLOR
  17. #include <rtdbg.h>
  18. rt_uint8_t pcf8574_port_read(pcf8574_device_t dev)
  19. {
  20. rt_uint8_t value;
  21. rt_device_read(&dev->bus->parent, dev->i2c_addr, &value, 1);
  22. return value;
  23. }
  24. void pcf8574_port_write(pcf8574_device_t dev, rt_uint8_t value)
  25. {
  26. rt_device_write(&dev->bus->parent, dev->i2c_addr, &value, 1);
  27. }
  28. rt_uint8_t pcf8574_pin_read(pcf8574_device_t dev, rt_uint8_t bit)
  29. {
  30. rt_uint8_t data;
  31. data = pcf8574_port_read(dev);
  32. if (data & (1 << bit))
  33. return 1;
  34. else
  35. return 0;
  36. }
  37. void pcf8574_pin_write(pcf8574_device_t dev, rt_uint8_t bit, rt_uint8_t value)
  38. {
  39. rt_uint8_t data;
  40. data = pcf8574_port_read(dev);
  41. if (value == 0)
  42. data &= ~(1 << bit);
  43. else
  44. data |= 1 << bit;
  45. pcf8574_port_write(dev, data);
  46. }
  47. pcf8574_device_t pcf8574_init(const char *dev_name, rt_uint8_t i2c_addr)
  48. {
  49. rt_uint8_t buffer[] = { 0xFF };
  50. pcf8574_device_t dev = RT_NULL;
  51. RT_ASSERT(dev_name);
  52. dev = rt_calloc(1, sizeof(struct pcf8574_device));
  53. if (dev == RT_NULL)
  54. {
  55. LOG_E("Can't allocate memory for pcf8574 device on '%s' ", dev_name);
  56. goto __exit;
  57. }
  58. dev->bus = (struct rt_i2c_bus_device *)rt_device_find(dev_name);
  59. if (dev->bus == RT_NULL)
  60. {
  61. LOG_E("i2c_bus %s for PCF8574 not found!", dev_name);
  62. goto __exit;
  63. }
  64. if (i2c_addr != RT_NULL)
  65. dev->i2c_addr = i2c_addr;
  66. else
  67. dev->i2c_addr = PCF8574_ADDR_DEFAULT;
  68. if (rt_device_open(&dev->bus->parent, RT_NULL) != RT_EOK)
  69. {
  70. LOG_D("i2c_bus %s for PCF8574 opened failed!", dev_name);
  71. goto __exit;
  72. }
  73. rt_device_write(&dev->bus->parent, dev->i2c_addr, &buffer, 1);
  74. LOG_D("pcf8574 init done", dev_name);
  75. return dev;
  76. __exit:
  77. if (dev != RT_NULL)
  78. rt_free(dev);
  79. return RT_NULL;
  80. }
  81. void pcf8574_deinit(struct pcf8574_device *dev)
  82. {
  83. RT_ASSERT(dev);
  84. rt_free(dev);
  85. }