⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 LCD OSD 程序用於8051 開發lcd
💻 C
字号:
#include "types.h"
#include "i2cdef.h"
#include "board.h"
#include "debug.h"
#include "misc.h"


#define i2cSlaveAddr(deviceID, addr)	deviceID|((addr>>8)<<1)
#define i2cWordAddr(addr)		addr&0xFF



//====================================
// Setup i2c Start condition
Bool i2c_Start(void)
{ Set_i2c_SDA();
  Delay4us();
  Set_i2c_SCL();
  Delay4us();
  if (i2c_SDALo() || i2c_SCLLo())
    return FALSE;
  Clr_i2c_SDA();
  Delay4us();
  Clr_i2c_SCL();
  return TRUE;
}
//=============================================
// Setup i2c Stop condition
void i2c_Stop(void)
{ // SCL=L, SDA=L, Stop condition.
  Clr_i2c_SCL();
  Delay4us();
  Clr_i2c_SDA();  
  Delay4us();
  Set_i2c_SCL();
  Delay4us();
  Set_i2c_SDA();
}

//============================================
Bool i2c_SendByte(BYTE value)
{ BYTE i;
  Bool result;
  
  for (i=0; i<8; i++) // Send data via i2c pin
    { if (value&BIT7)
        Set_i2c_SDA();
      else
      	Clr_i2c_SDA();      
      Delay4us();
      Set_i2c_SCL();      
      value<<=1;
      Delay4us();    //0329
      Clr_i2c_SCL(); 
    }
  Set_i2c_SDA();
  Delay4us();
  Set_i2c_SCL();
  Delay4us();    //0329
  result=i2c_SDALo(); // see if ACK
  Clr_i2c_SCL();
  Delay4us();
  Clr_i2c_SDA();
    
  return result;
}

//============================================
BYTE i2c_ReceiveByte(const Bool ack)
{ BYTE i;
  BYTE value;

  for (i=0; i<8; i++)
    { value<<=1;
      Set_i2c_SDA();
      Set_i2c_SCL();
      Delay4us();
      if (i2c_SDAHi())
      	value|=BIT0;
      Clr_i2c_SCL();
    }
  if (ack)
    Clr_i2c_SDA();
  else
    Set_i2c_SDA();
  Delay4us();
  Set_i2c_SCL();
  Delay4us();
  Clr_i2c_SCL();
  
  return value;  	
}

Bool i2c_BurstWrite(BYTE count, BYTE *buffer)
{ while (count--)
    { if (i2c_SendByte(*(buffer++))==FALSE)
        return FALSE;
    }
 return TRUE;
}
Bool i2c_BurstRead(BYTE count, BYTE * buffer)
{ BYTE i;

  for (i=0; i<count-1; i++)
    *(buffer+i)=i2c_ReceiveByte(1);
  *(buffer+i)=i2c_ReceiveByte(0);
  i2c_Stop();
  return TRUE;
}

Bool i2c_MasterStart(I2C_Direction direct, BYTE addr)
{ BYTE retry=5;

  if (direct==I2C_READ) // Set I2C direction bit.
    addr|=BIT0;
  else
    addr&=~BIT0;
  
  while (retry--)
    { if (i2c_Start()==FALSE)
        continue;
      
      if (i2c_SendByte(addr)==TRUE) // send address success
        return TRUE;
      i2c_Stop();
      Delay1ms(1);
    }
  return FALSE;
}


void i2c_WriteTBL(BYTE deviceID, WORD addr, BYTE *buffer, BYTE count)
{ BYTE slaveAddr;
  BYTE wordAddr;
  BYTE offset=0;
  BYTE tempSize;
  Bool succ=TRUE;
  
  while (count)
    { slaveAddr=i2cSlaveAddr(deviceID, addr+offset);
      wordAddr=i2cWordAddr(addr+offset);
      if (i2c_MasterStart(I2C_WRITE, slaveAddr)==FALSE)
      	break;
      if (i2c_BurstWrite(1, &wordAddr)==FALSE)
      	break;
      tempSize=0x10-(wordAddr&0xF);
      if (count>tempSize)
      	{ if (i2c_BurstWrite(tempSize, (BYTE*)(buffer+offset))==FALSE)
      	    break;
      	  i2c_Stop();
      	  count-=tempSize;
      	  offset+=tempSize;
      	}
      else if (count>0x10)
      	{ if (i2c_BurstWrite(0x10, (BYTE*)(buffer+offset))==FALSE)
            break;
      	  i2c_Stop();
      	  count-=0x10;
      	  offset+=0x10;
      	}
      else
      	{ if (i2c_BurstWrite(count, (BYTE*)(buffer+offset))==FALSE)
      	    break;
      	  i2c_Stop();
          count=0;
      	}
      ForceDelay1ms(5);   //0329//1);   //ASW for some slower eeprom
    }
  i2c_Stop();
  ForceDelay1ms(10);   //0329
}

void i2c_ReadTBL(BYTE deviceID, WORD addr, BYTE *buffer, BYTE count)
{ WORD retry=5;
  BYTE slaveAddr;
  BYTE wordAddr;

  slaveAddr=i2cSlaveAddr(deviceID, addr);
  wordAddr=i2cWordAddr(addr);
  while (retry--)
    { if (i2c_MasterStart(I2C_WRITE, slaveAddr)==FALSE)
        continue;
      if (i2c_BurstWrite(1, &wordAddr)==FALSE)
      	continue;
      if (i2c_MasterStart(I2C_READ, slaveAddr)==FALSE)
        continue;
      if (i2c_BurstRead(count, buffer)==FALSE)
      	continue;      
      return;
    }  
}

#if 0
void i2c_WriteByte(BYTE deviceID, WORD addr, BYTE *value)
{ i2c_WriteTBL(deviceID, addr, value, 1);
}
void i2c_ReadByte(BYTE deviceID, WORD addr, BYTE *value)
{ i2c_ReadTBL(deviceID, addr, value, 1);
}
#endif








⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -