pca9685.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  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. * 2019-05-15 greedyhao first version
  10. */
  11. #include "pca9685.h"
  12. // #define DBG_ENABLE
  13. #define DBG_SECTION_NAME "pca9685"
  14. #define DBG_LEVEL DBG_INFO
  15. #define DBG_COLOR
  16. #include <rtdbg.h>
  17. /**
  18. * This function writes the value of the register for pca9685
  19. *
  20. * @param dev the pointer of device driver structure
  21. * @param reg the register for pca9685
  22. * @param data value to write
  23. *
  24. * @return the writing status, RT_EOK reprensents writing the value of the register successfully.
  25. */
  26. static rt_err_t write_reg(pca9685_device_t dev, rt_uint8_t reg, unsigned short length, const unsigned char *data)
  27. {
  28. rt_int8_t res = 0;
  29. #ifdef RT_USING_I2C
  30. struct rt_i2c_msg msgs;
  31. rt_uint8_t buf[length+1];
  32. buf[0] = reg;
  33. int i;
  34. for ( i = 1; i <= length; i++)
  35. {
  36. buf[i] = data[i-1];
  37. }
  38. #endif
  39. if (dev->bus->type == RT_Device_Class_I2CBUS)
  40. {
  41. #ifdef RT_USING_I2C
  42. msgs.addr = dev->i2c_addr; /* slave address */
  43. msgs.flags = RT_I2C_WR; /* write flag */
  44. msgs.buf = buf; /* Send data pointer */
  45. msgs.len = length+1;
  46. if (rt_i2c_transfer((struct rt_i2c_bus_device *)dev->bus, &msgs, 1) == 1)
  47. {
  48. res = RT_EOK;
  49. }
  50. else
  51. {
  52. res = -RT_ERROR;
  53. }
  54. #endif
  55. }
  56. else
  57. {
  58. res = -RT_ERROR;
  59. }
  60. return res;
  61. }
  62. /**
  63. * This function reads the value of registers for pca9685
  64. *
  65. * @param dev the pointer of device driver structure
  66. * @param reg the register for pca9685
  67. * @param len number of register
  68. * @param buf read data pointer
  69. *
  70. * @return the reading status, RT_EOK reprensents reading the value of registers successfully.
  71. */
  72. static rt_err_t read_regs(pca9685_device_t dev, rt_uint8_t reg, rt_uint8_t len, rt_uint8_t *buf)
  73. {
  74. rt_int8_t res = 0;
  75. #ifdef RT_USING_I2C
  76. struct rt_i2c_msg msgs[2];
  77. #endif
  78. if (dev->bus->type == RT_Device_Class_I2CBUS)
  79. {
  80. #ifdef RT_USING_I2C
  81. msgs[0].addr = dev->i2c_addr; /* Slave address */
  82. msgs[0].flags = RT_I2C_WR; /* Write flag */
  83. msgs[0].buf = &reg; /* Slave register address */
  84. msgs[0].len = 1; /* Number of bytes sent */
  85. msgs[1].addr = dev->i2c_addr; /* Slave address */
  86. msgs[1].flags = RT_I2C_RD; /* Read flag */
  87. msgs[1].buf = buf; /* Read data pointer */
  88. msgs[1].len = len; /* Number of bytes read */
  89. if (rt_i2c_transfer((struct rt_i2c_bus_device *)dev->bus, msgs, 2) == 2)
  90. {
  91. res = RT_EOK;
  92. }
  93. else
  94. {
  95. res = -RT_ERROR;
  96. }
  97. #endif
  98. }
  99. else
  100. {
  101. res = -RT_ERROR;
  102. }
  103. return res;
  104. }
  105. /**
  106. * @brief set the frequency of pwm needed to output
  107. *
  108. * @param dev the pointer of device structure
  109. * @param freq pwm frequency(24 < freq < 1526)
  110. */
  111. void pca9685_set_pwm_freq(pca9685_device_t dev, float freq)
  112. {
  113. rt_uint8_t reg = 0;
  114. if (freq > 1526)
  115. {
  116. LOG_E("invalid pwm frequency input(24 < freq < 1526)");
  117. LOG_E("change to max of the freqency(1526)");
  118. freq = 1526;
  119. }
  120. if (freq < 24)
  121. {
  122. LOG_E("invalid pwm frequency input(24 < freq < 1526)");
  123. LOG_E("change to min of the freqency(24)");
  124. freq = 24;
  125. }
  126. freq *= (float)0.982; // Correct for overshoot in the frequency setting
  127. float prescaleval = 25000000;
  128. prescaleval /= 4096;
  129. prescaleval /= freq;
  130. prescaleval -= 1;
  131. rt_uint8_t prescale = (rt_uint8_t)(prescaleval + (float)0.5);
  132. LOG_D("prescale:%d",prescale);
  133. // https://cdn-shop.adafruit.com/datasheets/PCA9685.pdf page 25
  134. // prescale value = round(osc_clock/(4096 * frequency) ) - 1
  135. // internal osc_clock is 25MHz
  136. rt_uint8_t oldmode = 0;
  137. read_regs(dev, PCA9685_MODE1, 1, &oldmode);
  138. rt_uint8_t newmode = ((oldmode & 0x7F) | 0x10);
  139. write_reg(dev, PCA9685_MODE1, 1, &newmode); // go to sleep
  140. read_regs(dev,PCA9685_MODE1, 1, &reg);
  141. LOG_D("after sleep reg:%p", reg);
  142. write_reg(dev, PCA9685_PRESCALE, 1, &prescale); // set the prescaler
  143. read_regs(dev,PCA9685_MODE1, 1, &reg);
  144. LOG_D("after prescaler reg:%p", reg);
  145. write_reg(dev, PCA9685_MODE1, 1, &oldmode);
  146. read_regs(dev,PCA9685_MODE1, 1, &reg);
  147. LOG_D("after oldmode reg:%p", reg);
  148. rt_thread_mdelay(5);
  149. if (PWM_All_Call)
  150. {
  151. oldmode |= 0xA1;
  152. }
  153. else
  154. {
  155. oldmode |= 0xA0;
  156. }
  157. LOG_D("auto run..");
  158. write_reg(dev, PCA9685_MODE1, 1, &oldmode); // This sets the MODE1 register to turn on auto increment.
  159. read_regs(dev,PCA9685_MODE1, 1, &reg);
  160. LOG_D("after auto reg:%p", reg);
  161. }
  162. /**
  163. * @brief set the pwm pulse of one pin
  164. *
  165. * @param dev the pointer of device structure
  166. * @param num the number of the pin needed to control
  167. * @param on pwm high level start time(0-4095)
  168. * @param off pwm high level stop time(0-4095)
  169. */
  170. void pca9685_set_pwm(pca9685_device_t dev, rt_uint8_t num, rt_uint16_t on, rt_uint16_t off)
  171. {
  172. rt_uint8_t outputBuffer[4] = {on, (on >> 8), off, (off >> 8)};
  173. LOG_D("set pwm..");
  174. write_reg(dev, LED0_ON_L + 4*num, 4, outputBuffer);
  175. }
  176. /**
  177. * @brief make pca9685 restart
  178. *
  179. * @param dev the pointer of device structure
  180. */
  181. void pca9685_restart(pca9685_device_t dev)
  182. {
  183. rt_uint8_t reg;
  184. read_regs(dev, PCA9685_MODE1, 1, &reg);
  185. if ((reg & 0x80) != 0)
  186. {
  187. LOG_I("restart..");
  188. reg = reg & 0xBF;
  189. write_reg(dev, PCA9685_MODE1, 1, &reg);
  190. rt_thread_mdelay(1);
  191. reg = reg | 0x80; //reset
  192. write_reg(dev, PCA9685_MODE1, 1, &reg);
  193. }
  194. }
  195. pca9685_device_t pca9685_init(const char *dev_name, rt_uint8_t i2c_addr)
  196. {
  197. rt_uint8_t reg;
  198. pca9685_device_t dev = RT_NULL;
  199. RT_ASSERT(dev_name);
  200. dev = rt_calloc(1, sizeof(struct pca9685_device));
  201. if (dev == RT_NULL)
  202. {
  203. LOG_E("Can't allocate memory for pca9685 device on '%s' ", dev_name);
  204. goto __exit;
  205. }
  206. dev->bus = rt_device_find(dev_name);
  207. if (dev->bus == RT_NULL)
  208. {
  209. LOG_E("i2c_bus %s for PCA9685 not found!", dev_name);
  210. goto __exit;
  211. }
  212. if (dev->bus->type == RT_Device_Class_I2CBUS)
  213. {
  214. if (i2c_addr != RT_NULL)
  215. dev->i2c_addr = i2c_addr;
  216. else
  217. dev->i2c_addr = PCA9685_ADDR_DEFAULT;
  218. }
  219. else
  220. {
  221. LOG_E("Unsupported device:'%s'!", dev_name);
  222. goto __exit;
  223. }
  224. /* reset before use it */
  225. if (write_reg(dev, PCA9685_MODE1, 1, &reg) != RT_EOK)
  226. {
  227. LOG_E("i2c_bus %s for PCA9685 opened failed!", dev_name);
  228. goto __exit;
  229. }
  230. read_regs(dev, PCA9685_MODE1, 1, &reg);
  231. LOG_D("rest mode:%p", reg);
  232. rt_thread_mdelay(10);
  233. pca9685_set_pwm_freq(dev, 50);
  234. LOG_D("pca9685 init done", dev_name);
  235. return dev;
  236. __exit:
  237. if (dev != RT_NULL)
  238. rt_free(dev);
  239. return RT_NULL;
  240. }
  241. void pca9685_deinit(pca9685_device_t dev)
  242. {
  243. RT_ASSERT(dev);
  244. rt_free(dev);
  245. }