I2C.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #include "I2C.h"
  2. #include "timeout.h"
  3. void delay_us(uint32_t nUs)
  4. {
  5. uint32_t i=0,j=0;
  6. for(i=0;i<nUs;i++){
  7. for(j=0;j<9;j++){
  8. ;
  9. }
  10. }
  11. }
  12. void delay_ms(uint16_t nms)
  13. {
  14. delay_us(nms*1000);
  15. }
  16. /*-----------------------------------------------
  17. * I2C 初始化
  18. * ----------------------------------------------*/
  19. void i2c_init(void)
  20. {
  21. rcu_periph_clock_enable(RCU_GPIOB);/* enable GPIO clock */
  22. rcu_periph_clock_enable(RCU_GPIOE);/* enable GPIO clock */
  23. gpio_bit_set(IIC_WP_PORT,IIC_WP_PIN); /* 写保护启用 */
  24. gpio_init(IIC_WP_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, IIC_WP_PIN);/*写使能 PE15 */
  25. gpio_bit_set(IIC_SCL_PORT,IIC_SCL_PIN); /* 时钟信号 置高 */
  26. gpio_init(IIC_SCL_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, IIC_SCL_PIN);/* SCL 时钟信号 PB6 */
  27. gpio_bit_set(IIC_SDA_PORT,IIC_SDA_PIN); /* 数据信号 置高 */
  28. gpio_init(IIC_SDA_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, IIC_SDA_PIN);/* DA 数据信号 PB7 */
  29. }
  30. /*--------------------------------------------------
  31. * I2C的起始信号
  32. * -------------------------------------------------*/
  33. void i2c_start(void)
  34. {
  35. SDA_OUT();
  36. IIC_SDA(1);//IIC_SDA = 1;
  37. IIC_SCL(1);//IIC_SCL = 1;
  38. delay_us(4);
  39. IIC_SDA(0);//IIC_SDA = 0;//START:when CLK is high,DATA change form high to low
  40. delay_us(4);
  41. IIC_SCL(0);//IIC_SCL = 0;
  42. }
  43. /*------------------------------------------------------
  44. * I2C的停止信号
  45. * -----------------------------------------------------*/
  46. void i2c_stop(void)
  47. {
  48. SDA_OUT();
  49. IIC_SDA(0);//IIC_SDA = 0;
  50. IIC_SCL(0);//IIC_SCL = 0;
  51. delay_us(4);
  52. IIC_SCL(1);//IIC_SCL = 1;
  53. delay_us(4);
  54. IIC_SDA(1);//IIC_SDA = 1;
  55. delay_us(4);
  56. }
  57. /*-----------------------------------------------------
  58. * I2C 等待信号应答
  59. * 返回: 0:接收应答成功
  60. * 1:接收应答失败
  61. * ---------------------------------------------------*/
  62. uint8_t i2c_wait_ack(void)
  63. {
  64. uint8_t ucErrTime=0;
  65. SDA_IN(); // SDA 配置成输入
  66. IIC_SDA(1);//IIC_SDA=1;
  67. delay_us(1);
  68. IIC_SCL(1);//IIC_SCL=1;
  69. delay_us(1);
  70. while(READ_SDA)
  71. {
  72. ucErrTime++;
  73. if(ucErrTime>250)
  74. {
  75. i2c_stop();
  76. return 1;
  77. }
  78. }
  79. IIC_SCL(0);//IIC_SCL=0;
  80. return 0;
  81. }
  82. /*-----------------------------------------------------
  83. * I2C 产生应答
  84. * ---------------------------------------------------*/
  85. void i2c_Ack(void)
  86. {
  87. IIC_SCL(0);//IIC_SCL = 0;
  88. SDA_OUT();
  89. IIC_SDA(0);//IIC_SDA = 0;
  90. delay_us(4);
  91. IIC_SCL(1);//IIC_SCL = 1;
  92. delay_us(2);
  93. IIC_SCL(0);//IIC_SCL = 0;
  94. }
  95. /*-----------------------------------------------------
  96. * I2C 没有产生应答
  97. * ---------------------------------------------------*/
  98. void i2c_NAck(void)
  99. {
  100. IIC_SCL(0);//IIC_SCL = 0;
  101. SDA_OUT();
  102. IIC_SDA(1);//IIC_SDA = 1;
  103. delay_us(4);
  104. IIC_SCL(1);//IIC_SCL = 1;
  105. delay_us(2);
  106. IIC_SCL(0);//IIC_SCL = 0;
  107. }
  108. /*-----------------------------------------------------
  109. * IIC 发送一个字节
  110. * 返回 1:有应答 0:无应答
  111. * ---------------------------------------------------*/
  112. void i2c_send_byte(uint8_t txd)
  113. {
  114. uint8_t t;
  115. IIC_SCL(0);//IIC_SCL=0;// 电平置低,开始传输数据
  116. SDA_OUT();
  117. for(t=0;t<8;t++)
  118. {
  119. // IIC_SDA=(txd&0x80)>>7;
  120. if((txd&0x80)>>7) IIC_SDA(1);
  121. else IIC_SDA(0);
  122. txd<<=1;
  123. delay_us(4); //
  124. IIC_SCL(1);//IIC_SCL=1;
  125. delay_us(2);
  126. IIC_SCL(0);//IIC_SCL=0;
  127. delay_us(2);
  128. }
  129. }
  130. /*-------------------------------------------------
  131. * 读1个字节,ack=1时,发送ACK,ack=0,发送nACK
  132. * -------------------------------------------------*/
  133. uint8_t i2c_read_byte(uint8_t ack)
  134. {
  135. uint8_t i,receive=0;
  136. SDA_IN();//SDA设置为输入
  137. for(i=0;i<8;i++ )
  138. {
  139. IIC_SCL(0);//IIC_SCL=0;
  140. delay_us(4);
  141. IIC_SCL(1);//IIC_SCL=1;
  142. receive<<=1;
  143. if(READ_SDA)receive++;
  144. delay_us(1);
  145. }
  146. if(!ack)
  147. i2c_NAck();//发送nACK
  148. else
  149. i2c_Ack(); //发送ACK
  150. return receive;
  151. }