myiic.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "myiic.h"
  2. static uint8_t SMBUS_SDA_READ(void)
  3. {
  4. IotGpioValue temp = {0};
  5. IoTGpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_0,&temp);
  6. return temp;
  7. }
  8. //����IIC��ʼ�ź�
  9. void IIC_Start(void)
  10. {
  11. SDA_OUT(); //sda�����
  12. IIC_SDA=1;
  13. IIC_SCL=1;
  14. DelayUs(4);
  15. IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  16. DelayUs(4);
  17. IIC_SCL=0;//ǯסI2C���ߣ�׼�����ͻ��������
  18. }
  19. //����IICֹͣ�ź�
  20. void IIC_Stop(void)
  21. {
  22. SDA_OUT();//sda�����
  23. IIC_SCL=0;
  24. IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  25. DelayUs(4);
  26. IIC_SCL=1;
  27. IIC_SDA=1;//����I2C���߽����ź�
  28. DelayUs(4);
  29. }
  30. //�ȴ�Ӧ���źŵ���
  31. //����ֵ��1������Ӧ��ʧ��
  32. // 0������Ӧ��ɹ�
  33. u8 IIC_Wait_Ack(void)
  34. {
  35. u8 ucErrTime=0;
  36. SDA_IN(); //SDA��������
  37. IIC_SDA=1;DelayUs(1);
  38. IIC_SCL=1;DelayUs(1);
  39. while(READ_SDA)
  40. {
  41. ucErrTime++;
  42. if(ucErrTime>250)
  43. {
  44. IIC_Stop();
  45. return 1;
  46. }
  47. }
  48. IIC_SCL=0;//ʱ�����0
  49. return 0;
  50. }
  51. //����ACKӦ��
  52. void IIC_Ack(void)
  53. {
  54. IIC_SCL=0;
  55. SDA_OUT();
  56. IIC_SDA=0;
  57. DelayUs(2);
  58. IIC_SCL=1;
  59. DelayUs(2);
  60. IIC_SCL=0;
  61. }
  62. //������ACKӦ��
  63. void IIC_NAck(void)
  64. {
  65. IIC_SCL=0;
  66. SDA_OUT();
  67. IIC_SDA=1;
  68. DelayUs(2);
  69. IIC_SCL=1;
  70. DelayUs(2);
  71. IIC_SCL=0;
  72. }
  73. //IIC����һ���ֽ�
  74. //���شӻ�����Ӧ��
  75. //1����Ӧ��
  76. //0����Ӧ��
  77. void IIC_Send_Byte(u8 txd)
  78. {
  79. u8 t;
  80. SDA_OUT();
  81. IIC_SCL=0;//����ʱ�ӿ�ʼ���ݴ���
  82. for(t=0;t<8;t++)
  83. {
  84. //IIC_SDA=(txd&0x80)>>7;
  85. if((txd&0x80)>>7)
  86. IIC_SDA=1;
  87. else
  88. IIC_SDA=0;
  89. txd<<=1;
  90. DelayUs(2); //��TEA5767��������ʱ���DZ����
  91. IIC_SCL=1;
  92. DelayUs(2);
  93. IIC_SCL=0;
  94. DelayUs(2);
  95. }
  96. }
  97. //��1���ֽڣ�ack=1ʱ������ACK��ack=0������nACK
  98. u8 IIC_Read_Byte(unsigned char ack)
  99. {
  100. unsigned char i,receive=0;
  101. SDA_IN();//SDA��������
  102. for(i=0;i<8;i++ )
  103. {
  104. IIC_SCL=0;
  105. DelayUs(2);
  106. IIC_SCL=1;
  107. receive<<=1;
  108. if(READ_SDA)receive++;
  109. DelayUs(1);
  110. }
  111. if (!ack)
  112. IIC_NAck();//����nACK
  113. else
  114. IIC_Ack(); //����ACK
  115. return receive;
  116. }