luat_i2c.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #ifndef LUAT_I2C_H
  2. #define LUAT_I2C_H
  3. #include "luat_base.h"
  4. enum{
  5. I2C_SPEED_SLOW = 0,
  6. I2C_SPEED_FAST,
  7. I2C_SPEED_PLUS,
  8. I2C_SPEED_HSMODE,
  9. };
  10. /**
  11. * @defgroup luatos_device_i2c I2C接口
  12. * @{
  13. */
  14. /**
  15. * @brief 检查i2c是否存在
  16. *
  17. * @param id i2c_id
  18. * @return 1存在 0不存在
  19. */
  20. int luat_i2c_exist(int id);
  21. /**
  22. * @brief 初始化i2c
  23. *
  24. * @param id i2c_id
  25. * @param speed i2c 速度
  26. * @return 0成功 其他失败
  27. */
  28. int luat_i2c_setup(int id, int speed);
  29. /**
  30. * @brief 关闭 i2c
  31. *
  32. * @param id i2c_id
  33. * @return 0成功 其他失败
  34. */
  35. int luat_i2c_close(int id);
  36. /**
  37. * @brief I2C 发送数据
  38. *
  39. * @param id i2c_id
  40. * @param addr 7位设备地址
  41. * @param buff 数据buff
  42. * @param len 数据长度
  43. * @param stop 是否发送停止位
  44. * @return 0成功 其他失败
  45. */
  46. int luat_i2c_send(int id, int addr, void* buff, size_t len, uint8_t stop);
  47. /**
  48. * @brief I2C 接受数据
  49. *
  50. * @param id i2c_id
  51. * @param addr 7位设备地址
  52. * @param buff 数据buff
  53. * @param len 数据长度
  54. * @return 0成功 其他失败
  55. */
  56. int luat_i2c_recv(int id, int addr, void* buff, size_t len);
  57. /**
  58. * @brief I2C 写寄存器
  59. *
  60. * @param id i2c_id
  61. * @param addr 7位设备地址
  62. * @param reg 寄存器地址
  63. * @param buff 数据
  64. * @param len 数据长度
  65. * @param stop 是否发送停止位
  66. * @return 0成功 其他失败
  67. */
  68. int luat_i2c_write_reg(int id, int addr, int reg, void* buff, size_t len, uint8_t stop);
  69. /**
  70. * @brief I2C 读寄存器
  71. *
  72. * @param id i2c_id
  73. * @param addr 7位设备地址
  74. * @param reg 寄存器地址
  75. * @param buff 数据
  76. * @param len 数据长度
  77. * @return 0成功 其他失败
  78. */
  79. int luat_i2c_read_reg(int id, int addr, int reg, void* buff, size_t len);
  80. /**
  81. * @brief I2C 收发数据
  82. *
  83. * @param id i2c_id
  84. * @param addr 7位设备地址
  85. * @param reg 读的寄存器
  86. * @param reg_len 寄存器长度
  87. * @param buff 如果reg,reg_len 不为NULL,buff 为读的数据保存缓冲区,反之为写的缓冲区
  88. * @param len 数据长度
  89. * @return 0成功 其他失败
  90. */
  91. int luat_i2c_transfer(int id, int addr, uint8_t *reg, size_t reg_len, uint8_t *buff, size_t len);
  92. /**
  93. * @brief I2C 收发数据(异步)
  94. *
  95. * @param id i2c_id
  96. * @param addr 7位设备地址
  97. * @param is_read 是否为读写
  98. * @param reg 读的寄存器
  99. * @param reg_len 寄存器长度
  100. * @param buff 如果reg,reg_len 不为NULL,buff 为读的数据保存缓冲区,反之为写的缓冲区
  101. * @param len 数据长度
  102. * @param Toms 数据长度
  103. * @param CB 回调函数
  104. * @param pParam 回调函数参数
  105. * @return 0成功 其他失败
  106. */
  107. int luat_i2c_no_block_transfer(int id, int addr, uint8_t is_read, uint8_t *reg, size_t reg_len, uint8_t *buff, size_t len, uint16_t Toms, void *CB, void *pParam);
  108. /**
  109. * @brief 设置i2c复用
  110. * @attention
  111. * @attention
  112. * @param id i2c_id
  113. * @return -1 失败 其他正常
  114. */
  115. int luat_i2c_set_iomux(int id, uint8_t value);
  116. int luat_i2c_set_polling_mode(int id, uint8_t on_off);
  117. /**
  118. * @brief 锁定I2C,只有主模式下才能使用,多个设备挂载在同一条总线上需要使用
  119. *
  120. * @param id i2c总线id
  121. * @return int 成功返回0,其他-1
  122. */
  123. int luat_i2c_lock(int id);
  124. /**
  125. * @brief 释放I2C,只有主模式下才能使用,多个设备挂载在同一条总线上需要使用
  126. *
  127. * @param id i2c总线id
  128. * @return int 成功返回0,其他-1
  129. */
  130. int luat_i2c_unlock(int id);
  131. /**@}*/
  132. /** @}*/
  133. #define LUAT_EI2C_TYPE "EI2C*"
  134. typedef struct luat_ei2c {
  135. int8_t sda;
  136. int8_t scl;
  137. int16_t udelay;
  138. int ei2c_ref;
  139. } luat_ei2c_t;//软件i2c
  140. int i2c_soft_setup(luat_ei2c_t *ei2c);
  141. int i2c_soft_recv(luat_ei2c_t *ei2c, unsigned char addr, char *buff, size_t len);
  142. int i2c_soft_send(luat_ei2c_t *ei2c, unsigned char addr, char *data, size_t len, uint8_t stop);
  143. int i2c_soft_close(luat_ei2c_t *ei2c);
  144. #define toei2c(L) ((luat_ei2c_t *)luaL_checkudata(L, 1, LUAT_EI2C_TYPE))
  145. #endif