原创 mega128写24C02程序,晶振7.3728M.测试通过

2010-5-22 11:54 2431 7 7 分类: 消费电子

#ifndef _IICAPPH_H_
#define _IICAPPH_H_


/*
********************************************************************************************************************
*       变量及函数的引用定义
********************************************************************************************************************
*/
#ifndef _IICAPP_GLOBAL_
 #define IICAPP_GLOBAL extern
#else
 #define IICAPP_GLOBAL
#endif


#define I2C_SCL_H  (PORTD|= (0x01 << PD0))
#define I2C_SCL_L  (PORTD&= ~(0x01 << PD0))
#define I2C_SDA_H  (PORTD|= (0x01 << PD1))
#define I2C_SDA_L  (PORTD&= ~(0x01 << PD1))
#define I2C_SDA_IN  (DDRD &= ~(0x01 << DDD1))
#define I2C_SDA_OUT  (DDRD |= (0x01 << DDD1))
#define I2C_SDA_Test (PIND & (0x01 << PIND1))


#define WrDevAddr  0xAE
#define RdDevAddr  0xAF


IICAPP_GLOBAL void write_I2C(uchar ContorAdd,uchar T_Data, uchar RomAddress);


IICAPP_GLOBAL uchar read_I2C(uchar ContorAdd,uchar RomAddress);


///////////////////////////////////////////////////////////////////////////////////////////////////////////////


//I2C延时
void I2CDelay(uchar Ms)
{
 uchar i,j;


 for (i = 0; i<Ms; i++)
 {
  for (j = 0; j < 20; j++)
  {
   NOP();
  }
 
 }
}


/************************************************************************************
*函数介绍:启动IIC设备
*输入参数:无
*输出参数:无
*返回值  : 无
*************************************************************************************/
void Start(void)
{
 I2CDelay(8);
 I2C_SDA_H;  // SDA = 1
 I2CDelay(8);
 I2C_SCL_H;  // SCL = 1
 I2CDelay(8);
 I2C_SDA_L;  // SDA = 0
 I2CDelay(8);
 I2C_SCL_L;  // SCL = 0
 I2CDelay(8);
}



/************************************************************************************
*函数介绍:停止IIC设备
*输入参数:无
*输出参数:无
*返回值  : 无
*************************************************************************************/
void Stop(void)
{
 I2CDelay(8);
 I2C_SCL_L;  // SCL = 0
  I2CDelay(8);
 I2C_SDA_L;  // SDA = 0
 I2CDelay(8);
 I2C_SCL_H;  // SCL = 1
 I2CDelay(8);
 I2C_SDA_H;  // SDA = 1
 I2CDelay(70);    // 等待EEPROM内部写完成
}


/************************************************************************************
*函数介绍:ACK信号
*输入参数:无
*输出参数:无
*返回值  : 无
*************************************************************************************/
void Ack(void)
{
 I2CDelay(8);
 I2C_SDA_L;  // SDA = 0
 I2CDelay(8);
 I2C_SCL_H;  // SCL = 1
 I2CDelay(8);
 I2C_SCL_L;  // SCL = 0
 I2CDelay(8);
 I2C_SDA_H;  // SDA = 1
 I2CDelay(8);
}


/************************************************************************************
*函数介绍:握手
*输入参数:无
*输出参数:无
*返回值  : 无
*************************************************************************************/
void NoAck(void)
{
 I2CDelay(8);
 I2C_SDA_H;  // SDA = 1
 I2CDelay(8);
 I2C_SCL_H;  // SCL = 1
 I2CDelay(8);
 I2C_SCL_L;  // SCL = 0
 I2CDelay(8);
}



/************************************************************************************
*函数介绍:测试ack
*输入参数:无
*输出参数:无
*返回值  : 无
*************************************************************************************/
uchar TestAck(void)
{
 uchar AckFlag;
 
 I2CDelay(20);
 I2C_SDA_H;  // SDA = 1
 I2CDelay(20);
 I2C_SCL_H;  // SCL = 1
 I2C_SDA_IN; // SDA Input 
 I2CDelay(20);
 if(I2C_SDA_Test)
 {
  AckFlag = 1;
 }
 //AckFlag = PIND & (0x01 << PIND1);
 I2C_SCL_L;  // SCL = 0
 I2CDelay(20);
 I2C_SDA_OUT;  // SDA Output 
 
 return(AckFlag);
}



/************************************************************************************
*函数介绍:写1个字节的数据
*输入参数:待写的数据
*输出参数:无
*返回值  : 无
*************************************************************************************/
void Write8bit(uchar T_Data)
{
 unsigned char i ;
 
 for(i = 8; i != 0; i--)
 {
  if (T_Data & 0x80)
   I2C_SDA_H;  // SDA = 1
  else
   I2C_SDA_L;  // SDA = 0
  I2CDelay(8);
  I2C_SCL_H;  // SCL = 1
  I2CDelay(8);
  I2C_SCL_L;  // SCL = 0
  I2CDelay(8);
  T_Data = T_Data << 1 ;
  I2CDelay(2);
 }
}


/************************************************************************************
*函数介绍:读1个字节的数据
*输入参数:无
*输出参数:无
*返回值  : 无
*************************************************************************************/
uchar Read8bit(void)
{
 uchar i = 0 ;
 uchar R_Data = 0x00 ;
 
 I2C_SDA_IN; // SDA Input 
 for(i = 8; i != 0; i--)
 {
  I2C_SDA_H;  // SDA = 1
  I2CDelay(8);
  I2C_SCL_L;  // SCL = 0
  I2CDelay(8);
  I2C_SCL_H;  // SCL = 1
  R_Data = R_Data << 1 ;
  if (I2C_SDA_Test)
   R_Data |= 0x01;
  I2CDelay(8);
 }
 I2C_SDA_OUT;  // SDA Output 
 
 return(R_Data);
}


/************************************************************************************
*函数介绍:写1个字节的数据到指定的地址
*输入参数:器件地址,待写的数据、指定的地址
*输出参数:无
*返回值  : 无
*************************************************************************************/
void write_I2C(uchar ContorAdd, uchar T_Data, uchar RomAddress)
{
 Start();
 Write8bit(ContorAdd);
 TestAck();
 Write8bit(RomAddress);
 TestAck();
 Write8bit(T_Data);
 TestAck();
 Stop();
}



/************************************************************************************
*函数介绍:从指定的地址读1个字节的数据
*输入参数:器件写地址,指定的地址.器件读地址=器件写地址+1;
*输出参数:无
*返回值  : 无
*************************************************************************************/
uchar read_I2C(uchar ContorAdd, uchar RomAddress)
{
 uchar R_Data = 0x00 ;
 
 Start() ;
 Write8bit(ContorAdd);
 TestAck();
 Write8bit(RomAddress);
 TestAck();
 Start();
 Write8bit(ContorAdd+1);
 TestAck() ;
 R_Data = Read8bit();
 NoAck();
 Stop();
 
 return(R_Data);
}


 

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条