微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请教前辈一个I2C程序,帮我我看看

请教前辈一个I2C程序,帮我我看看

时间:10-02 整理:3721RD 点击:
点不亮LED

  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define _nop()  _nop_()
  4. #define uchar unsigned char

  5. sbit sda=P2^2;
  6. sbit scl=P2^3;

  7. bit ack;

  8. void delayus(uchar t);
  9. void delayms(uchar t);

  10. void delayus(uchar t)
  11. {
  12. while(--t);
  13. }

  14. void delayms(uchar t)
  15. {
  16. while(t--)
  17.   {
  18.   delayus(245);
  19.   delayus(245);
  20.   }
  21. }

  22. void start()
  23. {
  24. sda=1;
  25. _nop();
  26. scl=1;
  27. _nop();
  28. _nop();
  29. _nop();
  30. _nop();
  31. _nop();
  32. sda=0;
  33. _nop();
  34. _nop();
  35. _nop();
  36. _nop();
  37. _nop();
  38. scl=0;
  39. _nop();
  40. _nop();
  41. }

  42. void stop()
  43. {
  44. sda=0;
  45. _nop();
  46. _nop();
  47. scl=1;
  48. _nop();
  49. _nop();
  50. _nop();
  51. _nop();
  52. _nop();
  53. sda=1;
  54. _nop();
  55. _nop();
  56. _nop();
  57. _nop();
  58. _nop();
  59. }

  60. void ACK_T(void)
  61. {
  62. sda=0;
  63. _nop();
  64. _nop();
  65. _nop();
  66. scl=1;
  67. _nop();
  68. _nop();
  69. _nop();
  70. _nop();
  71. _nop();
  72. scl=0;
  73. _nop();
  74. _nop();
  75. }

  76. void NOACK(void)
  77. {
  78. sda=1;
  79. _nop();
  80. _nop();
  81. _nop();
  82. scl=1;
  83. _nop();
  84. _nop();
  85. _nop();
  86. _nop();
  87. _nop();
  88. scl=0;
  89. _nop();
  90. _nop();
  91. }

  92. void write(uchar c)
  93. {
  94. uchar i,temp;
  95. temp=c;
  96. scl=0;
  97. for(i=0;i<8;i++)
  98. {
  99.   temp=temp<<1;
  100.   sda=CY;
  101.   _nop();
  102.   scl=1;
  103.   _nop();
  104.   _nop();
  105.   _nop();
  106.   _nop();
  107.   _nop();
  108.   scl=0;
  109. }
  110. _nop();
  111. _nop();
  112. sda=1;
  113. _nop();
  114. _nop();
  115. scl=1;
  116. _nop();
  117. _nop();
  118. _nop();
  119. if(sda==0)ack=0;
  120. else ack=1;
  121. scl=0;
  122. _nop();
  123. _nop();

  124. }

  125. unsigned char read()
  126. {
  127. unsigned char i;
  128. uchar j;
  129. uchar k;
  130. scl=0;
  131. for(i=0;i<8;i++)
  132. {
  133. j=sda;
  134. k=(k<<1)|j;
  135. scl=1;
  136. _nop();
  137. _nop();
  138. _nop();
  139. _nop();
  140. _nop();
  141. scl=0;
  142. _nop();
  143. _nop();
  144. }
  145. scl=0;
  146. _nop();
  147. _nop();
  148. return (k);
  149. }

  150. bit write_string(uchar duxie,uchar dizhi,uchar *s,uchar geshu )
  151. {
  152. uchar b;
  153. start();
  154. write(duxie);
  155. if(ack==0)return(0);
  156. write(dizhi);
  157. if(ack==0)return(0);
  158. for(b=0;b<geshu;b++)
  159. {
  160.   write(*s);
  161.   if(ack==0)return(0);
  162.   s++;
  163. }
  164. stop();
  165. return(1);
  166. }

  167. bit read_string(uchar duxie,uchar dizhi,uchar *s,uchar geshu )
  168. {
  169. uchar b;
  170. start();
  171. write(duxie);
  172. if(ack==0)return(0);
  173. write(dizhi);
  174. if(ack==0)return(0);
  175. for(b=0;b<geshu;b++)
  176.   {
  177.   *s=read();
  178.   ACK_T();
  179.   s++;
  180.   }
  181.   *s=read();
  182.   NOACK();
  183.   stop();
  184.   return(1);
  185. }

  186. void main()
  187. {
  188. uchar a;
  189. a=0xaa;

  190.   write_string(0xae,80,&a,1);
  191.   delayus(1000);
  192.   read_string(0xaf,80,&a,1);
  193.   while(1)
  194. {
  195.   P1=a;

  196. }
  197. }

复制代码


问题一:起始信号,结束信号不完整。
问题二:写的时候等待从机应答时间过短

读的时候应该在时钟的下降沿的时候读

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top