Advertisement
abdullahkahraman

I2C-Bitbang-C-File

Dec 21st, 2012
942
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.58 KB | None | 0 0
  1. #ifndef _XTAL_FREQ
  2. #define _XTAL_FREQ 8000000 // XTAL frequency is 8MHz. This is needed for the __delay_us() function of the XC8.
  3. #endif
  4. #define I2C_Half_Clock_Period   50
  5. #define I2C_Clock_Period    100
  6. #include "software_I2C.h"
  7. #include <xc.h> // Include the header file needed by the compiler
  8. bit software_I2C_started;
  9.  
  10. void software_I2C_startCondition(void)
  11. {
  12.     if (software_I2C_started == 1)
  13.     {
  14.         I2C_SCL = 0;
  15.         __delay_us(I2C_Half_Clock_Period);
  16.         I2C_SDA = 1;
  17.         __delay_us(I2C_Half_Clock_Period);
  18.     }
  19.     I2C_SCL = 1;
  20.     __delay_us(I2C_Half_Clock_Period);
  21.  
  22.     I2C_SDA = 0;
  23.     __delay_us(I2C_Half_Clock_Period);
  24.  
  25.     software_I2C_started = 1;
  26. }
  27.  
  28. void software_I2C_stopCondition(void)
  29. {
  30.     I2C_SCL = 0;
  31.     __delay_us(I2C_Half_Clock_Period);
  32.     I2C_SDA = 0;
  33.     __delay_us(I2C_Half_Clock_Period);
  34.  
  35.     I2C_SCL = 1;
  36.     __delay_us(I2C_Half_Clock_Period);
  37.     I2C_SDA = 1;
  38.     __delay_us(I2C_Half_Clock_Period);
  39.     software_I2C_started = 0;
  40. }
  41.  
  42. void software_I2C_sendBit(unsigned char bitToBeSent)
  43. {
  44.     I2C_SCL = 0;
  45.     __delay_us(I2C_Half_Clock_Period);
  46.     I2C_SDA = 0x01 && (bitToBeSent & 0x01);
  47.     __delay_us(I2C_Half_Clock_Period);
  48.     I2C_SCL = 1;
  49.     __delay_us(I2C_Clock_Period);
  50. }
  51.  
  52. bit software_I2C_readBit(void)
  53. {
  54.     static bit readValue;
  55.     I2C_SCL = 0;
  56.     __delay_us(5);
  57.     I2C_SDA_TRIS = 1;
  58.     __delay_us(I2C_Clock_Period);
  59.     I2C_SCL = 1;
  60.     __delay_us(I2C_Half_Clock_Period);
  61.     readValue = I2C_SDA;
  62.     __delay_us(I2C_Half_Clock_Period);
  63.     I2C_SDA_TRIS = 0;
  64.     return readValue;
  65. }
  66.  
  67. bit software_I2C_sendByte(unsigned char byteToBeSent)
  68. {
  69.     static unsigned char counter;
  70.     static unsigned char mask;
  71.     mask = 0x80;
  72.     for (counter = 0; counter < 8; counter++)
  73.     {
  74.         if (mask == (byteToBeSent & mask))
  75.         {
  76.             software_I2C_sendBit(1);
  77.         }
  78.         else
  79.         {
  80.             software_I2C_sendBit(0);
  81.         }
  82.         mask >> = 1;
  83.     }
  84.     return software_I2C_readBit();
  85. }
  86.  
  87. unsigned char software_I2C_readByte(unsigned char nack)
  88. {
  89.     static unsigned char counter;
  90.     static unsigned char buffer;
  91.     buffer = 0;
  92.     for (counter = 0; counter < 8; counter++)
  93.     {
  94.         buffer <<= 1;
  95.         buffer |= software_I2C_readBit();
  96.     }
  97.     if (nack)software_I2C_sendBit(1);
  98.     else software_I2C_sendBit(0);
  99.     return buffer;
  100. }
  101.  
  102. void software_I2C_initialize(void)
  103. {
  104.     I2C_SCL_TRIS = 0;
  105.     I2C_SDA_TRIS = 0;
  106.     __delay_us(5);
  107.     I2C_SCL = 1;
  108.     __delay_us(5);
  109.     I2C_SDA = 1;
  110.     __delay_ms(10);
  111.     software_I2C_started = 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement