iic2.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include "iic2.h"
  2. #include "delay.h"
  3. #include "includes.h"
  4. void iic2_init(void)
  5. {
  6. rcu_periph_clock_enable(RCU_GPIOB);//使能GPIOB时钟
  7. rcu_periph_clock_enable(RCU_GPIOE);
  8. //IIC时钟信号位
  9. gpio_init(IIC2_SCL_PORT,GPIO_MODE_OUT_OD,GPIO_OSPEED_50MHZ,IIC2_SCL_PIN);
  10. gpio_bit_set(IIC2_SCL_PORT,IIC2_SCL_PIN);
  11. //IIC数据信号位
  12. gpio_init(IIC2_SDA_PORT,GPIO_MODE_OUT_OD,GPIO_OSPEED_50MHZ,IIC2_SDA_PIN);
  13. gpio_bit_set(IIC2_SDA_PORT,IIC2_SDA_PIN);
  14. }
  15. //产生IIC起始信号
  16. void IIC2_Start(void)
  17. {
  18. IIC2_SDA_OUT();
  19. IIC2_SDA(1);//IIC_SDA = 1;
  20. IIC2_SCL(1);//IIC_SCL = 1;
  21. delay_us(4);
  22. IIC2_SDA(0);//IIC_SDA = 0;//START:when CLK is high,DATA change form high to low
  23. delay_us(4);
  24. IIC2_SCL(0);//IIC_SCL = 0;//钳住I2C总线,准备发送或接收数据
  25. }
  26. //产生IIC停止信号
  27. void IIC2_Stop(void)
  28. {
  29. IIC2_SDA_OUT();
  30. IIC2_SDA(0);//IIC_SDA = 0;
  31. IIC2_SCL(0);//IIC_SCL = 0;
  32. delay_us(4);
  33. IIC2_SCL(1);//IIC_SCL = 1;
  34. IIC2_SDA(1);//IIC_SDA = 1;
  35. delay_us(4);
  36. }
  37. //等待应答信号到来
  38. //返回值:
  39. // 1,接收应答失败
  40. // 0,接收应答成功
  41. u8 IIC2_Wait_Ack(void)
  42. {
  43. uint8_t ucErrTime=0;
  44. IIC2_SDA_IN(); // SDA 配置成输入
  45. IIC2_SDA(1);//IIC_SDA=1;
  46. delay_us(1);
  47. IIC2_SCL(1);//IIC_SCL=1;
  48. delay_us(1);
  49. while(IIC2_READ_SDA)
  50. {
  51. ucErrTime++;
  52. if(ucErrTime>250)
  53. {
  54. IIC2_Stop();
  55. return 1;
  56. }
  57. }
  58. IIC2_SCL(0);//IIC_SCL=0;
  59. return 0;
  60. }
  61. //产生ACK应答
  62. void IIC2_Ack(void)
  63. {
  64. IIC2_SCL(0);//IIC_SCL = 0;
  65. IIC2_SDA_OUT();
  66. IIC2_SDA(0);//IIC_SDA = 0;
  67. delay_us(4);
  68. IIC2_SCL(1);//IIC_SCL = 1;
  69. delay_us(2);
  70. IIC2_SCL(0);//IIC_SCL = 0;
  71. }
  72. //不产生ACK应答
  73. void IIC2_NAck(void)
  74. {
  75. IIC2_SCL(0);//IIC_SCL = 0;
  76. IIC2_SDA_OUT();
  77. IIC2_SDA(1);//IIC_SDA = 1;
  78. delay_us(4);
  79. IIC2_SCL(1);//IIC_SCL = 1;
  80. delay_us(2);
  81. IIC2_SCL(0);//IIC_SCL = 0;
  82. }
  83. //IIC发送一个字节
  84. //返回从机有无应答
  85. //1,有应答
  86. //0,无应答
  87. void IIC2_Send_Byte(u8 txd)
  88. {
  89. uint8_t t;
  90. IIC2_SCL(0);//IIC_SCL=0;// 电平置低,开始传输数据
  91. IIC2_SDA_OUT();
  92. for(t=0;t<8;t++)
  93. {
  94. // IIC_SDA=(txd&0x80)>>7;
  95. if((txd&0x80)>>7) IIC2_SDA(1);
  96. else IIC2_SDA(0);
  97. txd<<=1;
  98. delay_us(4); //
  99. IIC2_SCL(1);//IIC_SCL=1;
  100. delay_us(2);
  101. IIC2_SCL(0);//IIC_SCL=0;
  102. delay_us(2);
  103. }
  104. }
  105. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
  106. u8 IIC2_Read_Byte(u8 ack)
  107. {
  108. uint8_t i,receive=0;
  109. IIC2_SDA_IN();//SDA设置为输入
  110. for(i=0;i<8;i++ )
  111. {
  112. IIC2_SCL(0);//IIC_SCL=0;
  113. delay_us(4);
  114. IIC2_SCL(1);//IIC_SCL=1;
  115. receive<<=1;
  116. if(IIC2_READ_SDA)receive++;
  117. delay_us(1);
  118. }
  119. if(!ack)
  120. IIC2_NAck();//发送nACK
  121. else
  122. IIC2_Ack(); //发送ACK
  123. return receive;
  124. }
  125. //////////////////////////////////////////////////////////////////////////////////
  126. void Tmp75_read(u8 *pBuffer)
  127. {
  128. u16 lentow;
  129. lentow = 2;
  130. IIC2_Start();
  131. IIC2_Send_Byte(0x90);//写
  132. IIC2_Wait_Ack();
  133. IIC2_Send_Byte(0x00); //发送寄存器地址
  134. IIC2_Wait_Ack();
  135. delay_us(4);
  136. IIC2_Start();
  137. IIC2_Send_Byte(0x91); //读 //进入接收模式
  138. IIC2_Wait_Ack();
  139. while(lentow)
  140. {
  141. *pBuffer=IIC2_Read_Byte(1);
  142. pBuffer++;
  143. //ReadAddr++;
  144. lentow--;
  145. }
  146. IIC2_Stop();//产生一个停止条件
  147. }
  148. u8 Temp_buf[4];
  149. float Temp_test(void)
  150. {
  151. float temp_data,tmp;
  152. iic2_init();
  153. Tmp75_read(Temp_buf);
  154. //data_dump("temp Read", Temp_buf, 2);
  155. // printf("\ntemp Read ");
  156. // printf("%d ",Temp_buf[0]);
  157. // printf("%d \n",Temp_buf[1]);
  158. tmp = (float)(Temp_buf[1]>>4);
  159. tmp /= 16.0;
  160. temp_data = (float)Temp_buf[0] + tmp;
  161. // printf("\ntemp Read: ");
  162. // printf("%f\n",temp_data);
  163. return temp_data;
  164. }