IOI2C.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. #include "IOI2C.h"
  2. #define TRUE 1
  3. #define FALSE 0
  4. static uint8_t IIC_Start(void);
  5. static void IIC_Stop(void);
  6. static void IIC_Send_Byte(uint8_t txd);
  7. static uint8_t IIC_Read_Byte(void);
  8. static uint8_t IIC_Wait_Ack(void);
  9. static void IIC_Ack(void);
  10. static void IIC_NAck(void);
  11. /**************************实现函数********************************************
  12. *函数原型: void IIC_Start(void)
  13. *功  能: 产生IIC起始信号
  14. *******************************************************************************/
  15. static uint8_t IIC_Start(void)
  16. {
  17. SDA_H;
  18. SCL_H;
  19. nrf_delay_us(5);
  20. SDA_L;
  21. nrf_delay_us(5);
  22. SCL_L;
  23. return TRUE;
  24. }
  25. /**************************实现函数********************************************
  26. *函数原型: void IIC_Stop(void)
  27. *功  能: //产生IIC停止信号
  28. *******************************************************************************/
  29. static void IIC_Stop(void)
  30. {
  31. SCL_L;
  32. SDA_L;
  33. nrf_delay_us(5);
  34. SCL_H;
  35. SDA_H;
  36. nrf_delay_us(5);
  37. }
  38. /**************************实现函数********************************************
  39. *函数原型: uint8_t IIC_Wait_Ack(void)
  40. *功  能: 等待应答信号到来
  41. //返回值:1,接收应答失败
  42. // 0,接收应答成功
  43. *******************************************************************************/
  44. static uint8_t IIC_Wait_Ack(void)
  45. {
  46. uint8_t tim = 0;
  47. // SCL_L;
  48. SDA_H;
  49. nrf_delay_us(1);
  50. SCL_H;
  51. // nrf_delay_us(1);
  52. while(SDA_read){
  53. if(++tim>=50){
  54. IIC_Stop();
  55. return FALSE;
  56. }
  57. nrf_delay_us(1);
  58. }
  59. SCL_L;
  60. return TRUE;
  61. }
  62. /**************************实现函数********************************************
  63. *函数原型: void IIC_Ack(void)
  64. *功  能: 产生ACK应答
  65. *******************************************************************************/
  66. static void IIC_Ack(void)
  67. {
  68. SCL_L;
  69. nrf_delay_us(1);
  70. SDA_L;
  71. nrf_delay_us(1);
  72. SCL_H;
  73. nrf_delay_us(1);
  74. SCL_L;
  75. }
  76. /**************************实现函数********************************************
  77. *函数原型: void IIC_NAck(void)
  78. *功  能: 产生NACK应答
  79. *******************************************************************************/
  80. static void IIC_NAck(void)
  81. {
  82. SCL_L;
  83. SDA_H;
  84. nrf_delay_us(1);
  85. SCL_H;
  86. nrf_delay_us(1);
  87. SCL_L;
  88. }
  89. /**************************实现函数********************************************
  90. *函数原型: void IIC_Send_Byte(uint8_t txd)
  91. *功  能: IIC发送一个字节
  92. *******************************************************************************/
  93. static void IIC_Send_Byte(uint8_t SendByte)
  94. {
  95. uint8_t i=8;
  96. for (i=0; i<8; i++){
  97. SCL_L;
  98. // SCL_L;
  99. // SCL_L;
  100. // SCL_L;
  101. // SCL_L;
  102. nrf_delay_us(1);
  103. if (SendByte&0x80) SDA_H;
  104. else SDA_L;
  105. SendByte <<= 1;
  106. SCL_H;
  107. nrf_delay_us(1);
  108. }
  109. SCL_L;
  110. }
  111. /**************************实现函数********************************************
  112. *函数原型: uint8_t IIC_Read_Byte(unsigned char ack)
  113. *功  能: //读1串字节,ack=1时,发送ACK,ack=0,发送nACK
  114. *******************************************************************************/
  115. static unsigned char IIC_Read_Byte(void)
  116. {
  117. uint8_t i = 0;
  118. uint8_t rec_byte;
  119. SDA_H;
  120. for (i=0; i<8; i++){
  121. rec_byte <<= 1;
  122. SCL_L;
  123. // SCL_L;
  124. // SCL_L;
  125. // SCL_L;
  126. // SCL_L;
  127. nrf_delay_us(1);
  128. SCL_H;
  129. nrf_delay_us(1);
  130. if (SDA_read) rec_byte |= 0x01;
  131. }
  132. SCL_L;
  133. return rec_byte;
  134. }
  135. void VL53L1_IIC_Init(void)
  136. {
  137. nrf_gpio_cfg(
  138. PIN_SCL_1,
  139. NRF_GPIO_PIN_DIR_OUTPUT,
  140. NRF_GPIO_PIN_INPUT_DISCONNECT,
  141. NRF_GPIO_PIN_NOPULL,
  142. NRF_GPIO_PIN_H0D1,
  143. NRF_GPIO_PIN_NOSENSE);
  144. nrf_gpio_cfg_watcher(PIN_SCL_1);
  145. nrf_gpio_pin_set(PIN_SCL_1);
  146. nrf_gpio_cfg(
  147. PIN_SDA_1,
  148. NRF_GPIO_PIN_DIR_OUTPUT,
  149. NRF_GPIO_PIN_INPUT_DISCONNECT,
  150. NRF_GPIO_PIN_NOPULL,
  151. NRF_GPIO_PIN_H0D1,
  152. NRF_GPIO_PIN_NOSENSE);
  153. nrf_gpio_cfg_watcher(PIN_SDA_1);
  154. nrf_gpio_pin_set(PIN_SDA_1);
  155. }
  156. /**************************实现函数********************************************
  157. *函数原型: unsigned char IIC_ReadOneByte(unsigned char I2C_Addr,unsigned char addr)
  158. *功  能: 读取指定设备 指定寄存器的一个值
  159. 输入 I2C_Addr 目标设备地址
  160. addr 寄存器地址
  161. 返回 读出来的值
  162. *******************************************************************************/
  163. uint8_t IIC_ReadOneByte(uint8_t SlaveAddress,uint16_t REG_Address,uint8_t* data)
  164. {
  165. if(!IIC_Start())
  166. return FALSE;
  167. IIC_Send_Byte(SlaveAddress);
  168. if(!IIC_Wait_Ack())
  169. {
  170. IIC_Stop();
  171. return FALSE;
  172. }
  173. IIC_Send_Byte((uint8_t) REG_Address>>8);
  174. IIC_Wait_Ack();
  175. IIC_Send_Byte((uint8_t) REG_Address & 0x00ff);
  176. IIC_Wait_Ack();
  177. IIC_Start();
  178. IIC_Send_Byte(SlaveAddress+1);
  179. IIC_Wait_Ack();
  180. *data= IIC_Read_Byte();
  181. IIC_NAck();
  182. IIC_Stop();
  183. return TRUE;
  184. }
  185. /**************************实现函数********************************************
  186. *函数原型: uint8_t IICreadBytes(uint8_t dev, uint8_t reg, uint8_t length, uint8_t *data)
  187. *功  能: 读取指定设备 指定寄存器的 length个值
  188. 输入 dev 目标设备地址
  189. reg 寄存器地址
  190. length 要读的字节数
  191. *data 读出的数据将要存放的指针
  192. 返回 读出来的字节数量
  193. *******************************************************************************/
  194. uint8_t IICreadBytes(uint8_t SlaveAddress,uint16_t REG_Address,uint8_t len,uint8_t *data)
  195. {
  196. uint8_t i = 0;
  197. if(!IIC_Start())
  198. return FALSE;
  199. IIC_Send_Byte(SlaveAddress);
  200. if(!IIC_Wait_Ack())
  201. {
  202. IIC_Stop();
  203. return FALSE;
  204. }
  205. IIC_Send_Byte((uint8_t) REG_Address>>8);
  206. IIC_Wait_Ack();
  207. IIC_Send_Byte(REG_Address&0x00ff);
  208. IIC_Wait_Ack();
  209. IIC_Start();
  210. IIC_Send_Byte(SlaveAddress+1);
  211. IIC_Wait_Ack();
  212. for(i = 0;i<len;i++)
  213. {
  214. if(i != (len -1))
  215. {
  216. data[i]= IIC_Read_Byte();
  217. IIC_Ack();
  218. }
  219. else
  220. {
  221. data[i]= IIC_Read_Byte();
  222. IIC_NAck();
  223. }
  224. }
  225. IIC_Stop();
  226. return len;
  227. }
  228. /**************************实现函数********************************************
  229. *函数原型: uint8_t IICwriteBytes(uint8_t dev, uint8_t reg, uint8_t length, uint8_t* data)
  230. *功  能: 将多个字节写入指定设备 指定寄存器
  231. 输入 dev 目标设备地址
  232. reg 寄存器地址
  233. length 要写的字节数
  234. *data 将要写的数据的首地址
  235. 返回 返回写入长度
  236. *******************************************************************************/
  237. uint8_t IICwriteBytes(uint8_t dev, uint16_t reg, uint16_t length, uint8_t* data)
  238. {
  239. uint8_t count = 0;
  240. IIC_Start();
  241. IIC_Send_Byte(dev);
  242. IIC_Wait_Ack();
  243. IIC_Send_Byte(reg>>8);
  244. IIC_Wait_Ack();
  245. IIC_Send_Byte(reg & 0x00ff);
  246. IIC_Wait_Ack();
  247. for(count=0;count<length;count++)
  248. {
  249. IIC_Send_Byte(data[count]);
  250. IIC_Wait_Ack();
  251. }
  252. IIC_Stop();
  253. return length; //status == 0;
  254. }
  255. /**************************实现函数********************************************
  256. *函数原型: unsigned char IICwriteByte(unsigned char dev, unsigned char reg, unsigned char data)
  257. *功  能: 写入指定设备 指定寄存器一个字节
  258. 输入 dev 目标设备地址
  259. reg 寄存器地址
  260. data 将要写入的字节
  261. 返回 1
  262. *******************************************************************************/
  263. uint8_t IICwriteByte(uint8_t dev, uint16_t reg, uint8_t data)
  264. {
  265. return IICwriteBytes(dev, reg, 1, &data);
  266. }
  267. /**************************实现函数********************************************
  268. *函数原型: uint8_t IICwriteBit(uint8_t dev, uint8_t reg, uint8_t bitNum, uint8_t data)
  269. *功  能: 读 修改 写 指定设备 指定寄存器一个字节 中的1个位
  270. 输入 dev 目标设备地址
  271. reg 寄存器地址
  272. bitNum 要修改目标字节的bitNum位
  273. data 为0 时,目标位将被清0 否则将被置位
  274. 返回 成功 为1
  275. 失败为0
  276. *******************************************************************************/
  277. uint8_t IICwriteBit(uint8_t dev, uint16_t reg, uint8_t bitNum, uint8_t data)
  278. {
  279. uint8_t b;
  280. IIC_ReadOneByte(dev, reg, &b);
  281. b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum));
  282. return IICwriteByte(dev, reg, b);
  283. }
  284. //------------------End of File----------------------------