iic_driver.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include "iic_driver.h"
  2. #define sm2315_en 1
  3. #define SDA 25
  4. #define SCL 24
  5. #define IIC_HIGH (0x3f)
  6. #define IIC_LOW (0x3e)
  7. /*********************************************************
  8. 功能:延时
  9. *********************************************************/
  10. void iic_delay(char i)
  11. {
  12. int y;
  13. for(;i>0;i--)
  14. for(y=2;y>0;y--)
  15. {;;;;;}
  16. }
  17. /*********************************************************
  18. 功能:开始
  19. *********************************************************/
  20. void hal_iic_start(void)
  21. {
  22. HWRITE(0x8080+SDA,IIC_HIGH);
  23. HWRITE(0x8080+SCL,IIC_HIGH);
  24. iic_delay(1);
  25. HWRITE(0x8080+SDA,IIC_LOW);
  26. iic_delay(1);
  27. HWRITE(0x8080+SCL,IIC_LOW);
  28. }
  29. /*********************************************************
  30. 功能:应答
  31. *********************************************************/
  32. void hal_iic_ack(void)
  33. {
  34. HWRITE(0x8080+SCL,IIC_LOW);
  35. iic_delay(1);
  36. HWRITE(0x8080+SCL,IIC_HIGH);
  37. iic_delay(1);
  38. HWRITE(0x8080+SCL,IIC_LOW);
  39. }
  40. /*********************************************************
  41. 功能:停止
  42. *********************************************************/
  43. void hal_iic_stop(void)
  44. {
  45. HWRITE(0x8080+SDA,IIC_LOW);
  46. HWRITE(0x8080+SCL,IIC_HIGH);
  47. iic_delay(1);
  48. HWRITE(0x8080+SDA,IIC_HIGH);
  49. }
  50. /*********************************************************
  51. 功能:写8位数据
  52. *********************************************************/
  53. void hal_iic_send_onebyte(unsigned char dat)
  54. {
  55. unsigned char i;
  56. for(i=0;i<8;i++)
  57. {
  58. HWRITE(0x8080+SCL,IIC_LOW);
  59. if(dat&0x80)
  60. HWRITE(0x8080+SDA,IIC_HIGH);
  61. else
  62. HWRITE(0x8080+SDA,IIC_LOW);
  63. iic_delay(3);
  64. dat=dat<<1;
  65. HWRITE(0x8080+SCL,IIC_HIGH);
  66. iic_delay(3);
  67. }
  68. hal_iic_ack();
  69. }
  70. /*********************************************************
  71. 功能:写灰度位数据
  72. *********************************************************/
  73. void hal_iic_send_grayscale_dat(unsigned short dat)
  74. {
  75. hal_iic_send_onebyte( dat>>8) ;
  76. hal_iic_send_onebyte( dat & 0xFF) ;
  77. }
  78. /*********************************************************
  79. 功能:指令1
  80. *********************************************************/
  81. void hal_iic_send_control_cmd(unsigned char com)
  82. {
  83. hal_iic_stop();
  84. ;;
  85. hal_iic_start();
  86. hal_iic_send_onebyte(com);
  87. }
  88. #if (sm2235_en==1)
  89. #define sm2235_ch_addr 0xd8
  90. #define sm2235_curr_val 0x69 //rgb=4.5w 24mA c/w=50ma
  91. //#define sm2235_curr_val 0xff
  92. void hal_send_light_control_dataout(uint16_t red,uint16_t gree,uint16_t blue,uint16_t cool,uint16_t wwarm)
  93. {
  94. hal_iic_send_control_cmd(sm2235_ch_addr);
  95. hal_iic_send_onebyte(sm2235_curr_val);
  96. // hal_iic_send_grayscale_dat(red); //跟手册rgb通道对应的参数值 可以兼容低压灯板
  97. // hal_iic_send_grayscale_dat(gree);
  98. // hal_iic_send_grayscale_dat(blue);
  99. hal_iic_send_grayscale_dat(blue); //兼容我们的灯板控制顺序
  100. hal_iic_send_grayscale_dat(gree);
  101. hal_iic_send_grayscale_dat(red);
  102. hal_iic_send_grayscale_dat(cool);
  103. hal_iic_send_grayscale_dat(wwarm);
  104. hal_iic_stop();
  105. }
  106. #endif
  107. #if (sm2315_en==1)
  108. #define sm2315_ch_addr 0xC0
  109. #define sm2315_curr_val 0x3b //rgb=24ma cw=40ma
  110. void hal_send_light_control_dataout(uint16_t red,uint16_t gree,uint16_t blue,uint16_t cool,uint16_t wwarm)
  111. {
  112. hal_iic_send_control_cmd(sm2315_ch_addr);
  113. hal_iic_send_onebyte(sm2315_curr_val);
  114. if((blue==0&&gree==0&&red==0)&&cool==0&&wwarm==0)
  115. {
  116. hal_iic_send_onebyte(0x20);//on待机功能
  117. }else{
  118. hal_iic_send_onebyte(0x00);//关闭待机功能
  119. }
  120. hal_iic_send_onebyte(blue/4); //兼容我们的灯板控制顺序
  121. hal_iic_send_onebyte(gree/4);
  122. hal_iic_send_onebyte(red/4);
  123. hal_iic_send_onebyte(cool/4);
  124. hal_iic_send_onebyte(wwarm/4);
  125. hal_iic_stop();
  126. }
  127. #endif