lp5562.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "lp5562.h"
  2. #include "lp5562_reg.h"
  3. #include <api-hal.h>
  4. #include <stdio.h>
  5. bool lp5562_read(uint8_t address, uint8_t* data, size_t size) {
  6. bool ret;
  7. with_api_hal_i2c(bool, &ret, (){
  8. if (HAL_I2C_Master_Transmit(&POWER_I2C, LP5562_ADDRESS, &address, 1, 2000) != HAL_OK) {
  9. return false;
  10. }
  11. if (HAL_I2C_Master_Receive(&POWER_I2C, LP5562_ADDRESS, data, size, 2000) != HAL_OK) {
  12. return false;
  13. }
  14. return true;
  15. });
  16. return ret;
  17. }
  18. bool lp5562_read_reg(uint8_t address, uint8_t* data) {
  19. return lp5562_read(address, data, 1);
  20. }
  21. bool lp5562_write_reg(uint8_t address, uint8_t *data) {
  22. uint8_t buffer[2] = { address, *data };
  23. bool ret;
  24. with_api_hal_i2c(bool, &ret, (){
  25. if (HAL_I2C_Master_Transmit(&POWER_I2C, LP5562_ADDRESS, buffer, 2, 2000) != HAL_OK) {
  26. return false;
  27. }
  28. return true;
  29. });
  30. return ret;
  31. }
  32. void lp5562_reset() {
  33. Reg0D_Reset reg = {.value = 0xFF };
  34. lp5562_write_reg(0x0D, (uint8_t*)&reg);
  35. }
  36. void lp5562_configure() {
  37. Reg08_Config config = { .INT_CLK_EN = true, .PS_EN = true, .PWM_HF = true };
  38. lp5562_write_reg(0x08, (uint8_t*)&config);
  39. Reg70_LedMap map = {
  40. .red = EngSelectI2C,
  41. .green = EngSelectI2C,
  42. .blue = EngSelectI2C,
  43. .white = EngSelectI2C,
  44. };
  45. lp5562_write_reg(0x70, (uint8_t*)&map);
  46. }
  47. void lp5562_enable() {
  48. Reg00_Enable reg = { .CHIP_EN = true, .LOG_EN = true };
  49. lp5562_write_reg(0x00, (uint8_t*)&reg);
  50. }
  51. void lp5562_set_channel_current(LP5562Channel channel, uint8_t value) {
  52. uint8_t reg_no;
  53. if (channel == LP5562ChannelRed) {
  54. reg_no = 0x07;
  55. } else if (channel == LP5562ChannelGreen) {
  56. reg_no = 0x06;
  57. } else if (channel == LP5562ChannelBlue) {
  58. reg_no = 0x05;
  59. } else if (channel == LP5562ChannelWhite) {
  60. reg_no = 0x0F;
  61. } else {
  62. return;
  63. }
  64. lp5562_write_reg(reg_no, &value);
  65. }
  66. void lp5562_set_channel_value(LP5562Channel channel, uint8_t value) {
  67. uint8_t reg_no;
  68. if (channel == LP5562ChannelRed) {
  69. reg_no = 0x04;
  70. } else if (channel == LP5562ChannelGreen) {
  71. reg_no = 0x03;
  72. } else if (channel == LP5562ChannelBlue) {
  73. reg_no = 0x02;
  74. } else if (channel == LP5562ChannelWhite) {
  75. reg_no = 0x0E;
  76. } else {
  77. return;
  78. }
  79. lp5562_write_reg(reg_no, &value);
  80. }