drv_iic_middle.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #include "drv_iic_middle.h"
  2. #include "nrf_delay.h"
  3. static void IIC_MIDDLE_Start(void)
  4. {
  5. IIC_MIDDLE_SDA_SET;
  6. IIC_MIDDLE_SCL_SET;
  7. nrf_delay_us(5);
  8. IIC_MIDDLE_SDA_CLR;
  9. nrf_delay_us(5);
  10. IIC_MIDDLE_SCL_CLR;
  11. }
  12. static void IIC_MIDDLE_Stop(void)
  13. {
  14. IIC_MIDDLE_SCL_CLR;
  15. IIC_MIDDLE_SDA_CLR;
  16. nrf_delay_us(5);
  17. IIC_MIDDLE_SCL_SET;
  18. IIC_MIDDLE_SDA_SET;
  19. nrf_delay_us(5);
  20. }
  21. static void IIC_MIDDLE_ACK(void)
  22. {
  23. IIC_MIDDLE_SCL_CLR;
  24. nrf_delay_us(1);
  25. IIC_MIDDLE_SDA_CLR;
  26. nrf_delay_us(1);
  27. IIC_MIDDLE_SCL_SET;
  28. nrf_delay_us(1);
  29. IIC_MIDDLE_SCL_CLR;
  30. }
  31. static void IIC_MIDDLE_NoACK(void)
  32. {
  33. IIC_MIDDLE_SCL_CLR;
  34. IIC_MIDDLE_SDA_SET;
  35. nrf_delay_us(1);
  36. IIC_MIDDLE_SCL_SET;
  37. nrf_delay_us(1);
  38. IIC_MIDDLE_SCL_CLR;
  39. }
  40. static bool IIC_MIDDLE_WaitACK(void)
  41. {
  42. uint8_t tim = 0;
  43. // IIC_MIDDLE_SCL_CLR;
  44. IIC_MIDDLE_SDA_SET;
  45. nrf_delay_us(1);
  46. IIC_MIDDLE_SCL_SET;
  47. // nrf_delay_us(1);
  48. while(IIC_MIDDLE_SDA_READ){
  49. if(++tim>=50){
  50. IIC_MIDDLE_Stop();
  51. return false;
  52. }
  53. nrf_delay_us(1);
  54. }
  55. IIC_MIDDLE_SCL_CLR;
  56. return true;
  57. }
  58. static void IIC_MIDDLE_SendByte(uint8_t _byte)
  59. {
  60. uint8_t i = 0;
  61. for (i=0; i<8; i++){
  62. IIC_MIDDLE_SCL_CLR;
  63. nrf_delay_us(5);
  64. if (_byte&0x80) IIC_MIDDLE_SDA_SET;
  65. else IIC_MIDDLE_SDA_CLR;
  66. _byte <<= 1;
  67. IIC_MIDDLE_SCL_SET;
  68. nrf_delay_us(5);
  69. }
  70. IIC_MIDDLE_SCL_CLR;
  71. }
  72. static uint8_t IIC_MIDDLE_RecByte(void)
  73. {
  74. uint8_t i = 0;
  75. uint8_t rec_byte;
  76. IIC_MIDDLE_SDA_SET;
  77. for (i=0; i<8; i++){
  78. rec_byte <<= 1;
  79. IIC_MIDDLE_SCL_CLR;
  80. nrf_delay_us(5);
  81. IIC_MIDDLE_SCL_SET;
  82. nrf_delay_us(5);
  83. if (IIC_MIDDLE_SDA_READ) rec_byte |= 0x01;
  84. }
  85. IIC_MIDDLE_SCL_CLR;
  86. return rec_byte;
  87. }
  88. /********************************************/
  89. bool IIC_MIDDLE_WriteBytes(uint8_t add,uint8_t reg,uint8_t* p,uint8_t len)
  90. {
  91. uint8_t i = 0;
  92. IIC_MIDDLE_Start();
  93. IIC_MIDDLE_SendByte(add);
  94. if(!IIC_MIDDLE_WaitACK()) return false;
  95. IIC_MIDDLE_SendByte(reg);
  96. if(!IIC_MIDDLE_WaitACK()) return false;
  97. for(i=0;i<len;i++){
  98. IIC_MIDDLE_SendByte(p[i]);
  99. if(!IIC_MIDDLE_WaitACK()) return false;
  100. }
  101. IIC_MIDDLE_Stop();
  102. return true;
  103. }
  104. bool IIC_MIDDLE_ReadBytes(uint8_t add,uint8_t reg,uint8_t* p,uint8_t len)
  105. {
  106. uint8_t i = 0;
  107. IIC_MIDDLE_Start();
  108. IIC_MIDDLE_SendByte(add);
  109. if(!IIC_MIDDLE_WaitACK()) return false;
  110. IIC_MIDDLE_SendByte(reg);
  111. if(!IIC_MIDDLE_WaitACK()) return false;
  112. IIC_MIDDLE_Start();
  113. IIC_MIDDLE_SendByte(add+1);
  114. if(!IIC_MIDDLE_WaitACK()) return false;
  115. for(i=0;i<len-1;i++){
  116. p[i] = IIC_MIDDLE_RecByte(); IIC_MIDDLE_ACK();
  117. }
  118. p[i] = IIC_MIDDLE_RecByte(); IIC_MIDDLE_NoACK();
  119. IIC_MIDDLE_Stop();
  120. return true;
  121. }
  122. void IIC_MIDDLE_Init(void)
  123. {
  124. nrf_gpio_cfg(
  125. PIN_QMA7981_SCLK,
  126. NRF_GPIO_PIN_DIR_OUTPUT,
  127. NRF_GPIO_PIN_INPUT_DISCONNECT,
  128. NRF_GPIO_PIN_NOPULL,
  129. NRF_GPIO_PIN_S0S1,
  130. NRF_GPIO_PIN_NOSENSE);
  131. nrf_gpio_cfg_watcher(PIN_QMA7981_SCLK);
  132. nrf_gpio_pin_set(PIN_QMA7981_SCLK);
  133. nrf_gpio_cfg(
  134. PIN_QMA7981_SDA,
  135. NRF_GPIO_PIN_DIR_OUTPUT,
  136. NRF_GPIO_PIN_INPUT_DISCONNECT,
  137. NRF_GPIO_PIN_NOPULL,
  138. NRF_GPIO_PIN_S0S1,
  139. NRF_GPIO_PIN_NOSENSE);
  140. nrf_gpio_cfg_watcher(PIN_QMA7981_SDA);
  141. nrf_gpio_pin_set(PIN_QMA7981_SDA);
  142. }