/home/daqweb/fgddaq/c8051/Protocols/I2C_handler.c File Reference

#include "../asum/mscbemb.h"
#include "I2C_handler.h"

Functions

void I2C_Clear (void)
void I2C_Start (void)
void I2C_Stop (void)
unsigned char I2C_WriteByte (unsigned char datByte, unsigned char flag)
unsigned char I2C_ReadByte (bit flag)
void I2C_ClockOnce (void)

Variables

sbit I2C_SDA = MSCB_I2C_SDA
sbit I2C_SCL = MSCB_I2C_SCL

Function Documentation

void I2C_Clear ( void   ) 

00030 {
00031         //Bus freeTime between Stop and Start condition
00032         I2C_SDA = 1;
00033         I2C_SCL = 1;
00034         delay_us(I2C_T_BUF); 
00035 }

void I2C_ClockOnce ( void   ) 

00124 {
00125         I2C_SCL = 1;
00126         delay_us(I2C_T_HIGH);
00127         I2C_SCL = 0;
00128         delay_us(I2C_T_LOW);    
00129 }

unsigned char I2C_ReadByte ( bit  flag  ) 

00099 {
00100         char i = 0;
00101         char dataRead = 0x00;
00102 
00103         for(i = 7; i >= 0; i--)
00104         {
00105                 dataRead |= ((unsigned char) I2C_SDA) << i;
00106                 I2C_ClockOnce();
00107         }
00108 
00109         //send ACK / NACK
00110         if(flag == ACK)
00111         {
00112                 I2C_SDA = 0;
00113         }
00114         else if(flag == I2C_NACK)
00115         {
00116                 I2C_SDA = 1;
00117         }
00118         I2C_ClockOnce();
00119 
00120         return dataRead;
00121 }

void I2C_Start ( void   ) 

00038 {
00039         //Bus freeTime between Stop and Start condition (Clearing function)
00040         I2C_Clear();
00041 
00042         //Start condition: I2C_SDA goes from HIGH to LOW while I2C_SCL is HIGH
00043         delay_us(I2C_SU_STA);
00044         I2C_SDA = 0;
00045         delay_us(I2C_HD_STA);
00046         I2C_SCL = 0;    
00047 }

void I2C_Stop ( void   ) 

00050 {
00051         //Stop condition: I2C_SDA goes from LOW to HIGH while I2C_SCL is HIGH
00052         I2C_SCL = 1;
00053         delay_us(I2C_SU_STO);
00054         I2C_SDA = 1;
00055 }

unsigned char I2C_WriteByte ( unsigned char  datByte,
unsigned char  flag 
)

00058 {
00059         char i = 0;
00060         unsigned char toBeSent = 0;
00061 
00062         if(flag == I2C_WRITE_FLAG)
00063         {
00064                 toBeSent = (datByte << 1) & 0xFE;
00065         }
00066         else if(flag == I2C_READ_FLAG)
00067         {
00068                 toBeSent = (datByte << 1) | 0x01;
00069         }
00070         else
00071         {
00072                 toBeSent = datByte;
00073         }
00074         for(i = 7; i >= 0; i--)
00075         {
00076                 I2C_SDA = (toBeSent >> i) & 0x01;
00077                 delay_us(1); //SU;DAT
00078                 I2C_ClockOnce();
00079         }
00080 
00081         if(I2C_SDA == 1)
00082         {
00083                 I2C_ClockOnce();
00084                 return I2C_ACK;
00085         }
00086         else if(I2C_SDA == 0)
00087         {
00088                 I2C_ClockOnce();
00089                 return I2C_NACK;
00090         }
00091         else
00092         {
00093                 I2C_ClockOnce();
00094                 return I2C_WRITE_ERROR;
00095         }
00096 }


Variable Documentation

sbit I2C_SCL = MSCB_I2C_SCL

sbit I2C_SDA = MSCB_I2C_SDA


Generated on 10 Jun 2013 for FGDC8051 by  doxygen 1.4.7