Advertisement
Guest User

Untitled

a guest
Feb 27th, 2020
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.83 KB | None | 0 0
  1. #include "Includes.h"
  2.  
  3. // Function Purpose: Produce approximate delay in given uSecs.
  4. void __delay_us(unsigned int d)
  5. {
  6. unsigned int i, limit;
  7. limit = d/15;
  8.  
  9. for(i=0;i<limit;i++);
  10. }
  11.  
  12.  
  13. // Function Purpose: Set initial values of SCK and SDA pins
  14. void InitI2C(void)
  15. {
  16. // Make SDA and SCK pins input initially
  17. SDA = 1;
  18. SCK = 1;
  19. }
  20.  
  21.  
  22. // Function Purpose: I2C_Start sends start bit sequence
  23. void I2C_Start(void)
  24. {
  25. Set_SCK_High; // Make SCK pin high
  26. Set_SDA_High; // Make SDA pin High
  27. __delay_us(HalfBitDelay); // Half bit delay
  28. Set_SDA_Low; // Make SDA Low
  29. __delay_us(HalfBitDelay); // Half bit delay
  30. }
  31.  
  32.  
  33. // Function Purpose: I2C_ReStart sends start bit sequence
  34. void I2C_ReStart(void)
  35. {
  36. Set_SCK_Low; // Make SCK pin low
  37.  
  38. __delay_us(HalfBitDelay/2); // Data pin should change it's value,
  39. // when it is confirm that SCK is low
  40. Set_SDA_High; // Make SDA pin High
  41.  
  42. __delay_us(HalfBitDelay/2); // 1/4 bit delay
  43. Set_SCK_High; // Make SCK pin high
  44. __delay_us(HalfBitDelay/2); // 1/4 bit delay
  45. Set_SDA_Low; // Make SDA Low
  46. __delay_us(HalfBitDelay/2); // 1/4 bit delay
  47. }
  48.  
  49.  
  50. //Function : I2C_Stop sends stop bit sequence
  51. void I2C_Stop(void)
  52. {
  53. Set_SCK_Low; // Make SCK pin low
  54.  
  55. __delay_us(HalfBitDelay/2); // Data pin should change it's value,
  56. // when it is confirm that SCK is low
  57. Set_SDA_Low; // Make SDA pin low
  58.  
  59. __delay_us(HalfBitDelay/2); // 1/4 bit delay
  60. Set_SCK_High; // Make SCK pin high
  61. __delay_us(HalfBitDelay/2); // 1/4 bit delay
  62. Set_SDA_High; // Make SDA high
  63. __delay_us(HalfBitDelay/2); // 1/4 bit delay
  64. }
  65.  
  66.  
  67.  
  68. //Function : I2C_Send_ACK sends ACK bit sequence
  69. void I2C_Send_ACK(void)
  70. {
  71. Set_SCK_Low; // Make SCK pin low
  72. __delay_us(HalfBitDelay/2); // Data pin should change it's value,
  73. // when it is confirm that SCK is low
  74. Set_SDA_Low; // Make SDA Low
  75. __delay_us(HalfBitDelay/2); // 1/4 bit delay
  76. Set_SCK_High; // Make SCK pin high
  77. __delay_us(HalfBitDelay); // Half bit delay
  78. }
  79.  
  80.  
  81. //Function : I2C_Send_NACK sends NACK bit sequence
  82. void I2C_Send_NACK(void)
  83. {
  84. Set_SCK_Low; // Make SCK pin low
  85. __delay_us(HalfBitDelay/2); // Data pin should change it's value,
  86. // when it is confirm that SCK is low
  87. Set_SDA_High; // Make SDA high
  88. __delay_us(HalfBitDelay/2); // 1/4 bit delay
  89. Set_SCK_High; // Make SCK pin high
  90. __delay_us(HalfBitDelay); // Half bit delay
  91. }
  92.  
  93.  
  94. // Function Purpose: I2C_Write_Byte transfers one byte
  95. bit I2C_Write_Byte(unsigned char Byte)
  96. {
  97. unsigned char i; // Variable to be used in for loop
  98.  
  99. for(i=0;i<8;i++) // Repeat for every bit
  100. {
  101. Set_SCK_Low; // Make SCK pin low
  102.  
  103. __delay_us(HalfBitDelay/2); // Data pin should change it's value,
  104. // when it is confirm that SCK is low
  105.  
  106. if((Byte<<i)&0x80) // Place data bit value on SDA pin
  107. Set_SDA_High; // If bit is high, make SDA high
  108. else // Data is transferred MSB first
  109. Set_SDA_Low; // If bit is low, make SDA low
  110.  
  111. __delay_us(HalfBitDelay/2); // Toggle SCK pin
  112. Set_SCK_High; // So that slave can
  113. __delay_us(HalfBitDelay); // latch data bit
  114. }
  115.  
  116. // Get ACK from slave
  117. Set_SCK_Low;
  118. Set_SDA_High;
  119. __delay_us(HalfBitDelay);
  120. Set_SCK_High;
  121. __delay_us(HalfBitDelay);
  122.  
  123. return SDA;
  124. }
  125.  
  126.  
  127. // Function Purpose: I2C_Read_Byte reads one byte
  128. unsigned char I2C_Read_Byte(void)
  129. {
  130. unsigned char i, d, RxData = 0;
  131.  
  132. for(i=0;i<8;i++)
  133. {
  134. Set_SCK_Low; // Make SCK pin low
  135. Set_SDA_High; // Don't drive SDA
  136. __delay_us(HalfBitDelay); // Half bit delay
  137. Set_SCK_High; // Make SCK pin high
  138. __delay_us(HalfBitDelay/2); // 1/4 bit delay
  139. d = SDA; // Capture Received Bit
  140. RxData = RxData|(d<<(7-i)); // Copy it in RxData
  141. __delay_us(HalfBitDelay/2); // 1/4 bit delay
  142. }
  143.  
  144. return RxData; // Return received byte
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement