caniggia的笔记 https://bbs.21ic.com/?520249 [收藏] [复制] [RSS] 用笔和镜头记录生活,这里我用的是键盘!

日志

自己写的单片机IO口模拟i2c底层库文件,已上机调试过

已有 1163 次阅读2010-5-21 09:17 |个人分类:MCU / IC 应用|系统分类:单片机| I2C

/*自己编写的单片机IO口模拟i2c底层库文件,已上机调试过*/
/************************************************************************/
/* Name: I2C.C                                             */
/* Language: C51单片机编程语言                                          */
/* Platform:                                                            */
/* Author:  FRANK FONG  , huananfang@hotmail.com                        */          
/* Date: 2010-05-21,上海;                                              */
/* Version:                                   */
/* Deion: I2C  ,基于STK6032平台                                   */
/************************************************************************/
#include <string.h>
#include<stk6032.H>
#include <intrins.h>


#define DELAY_TIME 60                       
#define TRUE 1
#define FALSE 0
sbit SCL =  P0^6;
sbit SDA =  P0^7;
bit ACK;


/********** Definition 函数定义 ************/
  
   /* 延时函数*/
void DELAY(unsigned int t)           
{
    while(t!=0)
    t--;  
}


/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/ 
void I2C_Start(void)
{
          
 SDA=1;
 DELAY(DELAY_TIME); 
    SCL=1;          
    DELAY(DELAY_TIME);
    SDA=0;
    DELAY(DELAY_TIME);
    SCL=0;
    DELAY(DELAY_TIME);
}
 /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
void I2C_Stop(void)
{                                 
    SDA=0;
 DELAY(DELAY_TIME); 
    SCL=1;
    DELAY(DELAY_TIME);
    SDA=1;
    DELAY(DELAY_TIME);
    SCL=0;
    DELAY(DELAY_TIME);
}
 /*发送,在SCL为高电平时使SDA信号为低 ,SEND ACK*/  
void SEND_0(void)             
{
                               
    SDA=0;
 DELAY(DELAY_TIME);
    SCL=1;
    DELAY(DELAY_TIME);
    SCL=0;
    DELAY(DELAY_TIME);
}


 /*发送,在SCL为高电平时使SDA信号为高*/
void SEND_1(void)
{
                                 
    SDA=1;
 DELAY(DELAY_TIME);
    SCL=1;
    DELAY(DELAY_TIME);
    SCL=0;
    DELAY(DELAY_TIME);
}


 /* 发送完一个字节后检验设备的应答信号 */
bit Check_Acknowledge(void)
{
                                   
 SDA=1;
 DELAY(DELAY_TIME); 
    SCL=1;
 DELAY(DELAY_TIME);
 ACK=SDA;
 DELAY(DELAY_TIME);  
 SCL=0;  
 DELAY(DELAY_TIME);   
    if(ACK==1)
     return FALSE;
    else
  return TRUE; 
}
/*向I2C总线写一个字节*/
void WriteI2C_1_Byte(unsigned char b)
{                                        
 unsigned char i;


    for(i=0;i<8;i++)
 {
     if((b<<i)&0x80)
         SEND_1();
        else
            SEND_0();
 }
 if(!Check_Acknowledge())
 {
  I2C_Stop(); 
 } 
 
}  


/*向I2C总线写两个字节*/  
void WriteI2C_2_Byte(unsigned int b)
{
 WriteI2C_1_Byte((b >> 8) & 0xFF);
    WriteI2C_1_Byte(b & 0xFF);                  
}


 /*从I2C总线读一个字节*/ 
unsigned char ReadI2C_1_Byte(void)
{                                        
 unsigned char b=0,i;
    for(i=0;i<8;i++)
    {
   /*释放总线*/
      SDA = 1;
  DELAY(DELAY_TIME);
   /*接受数据*/        
        SCL = 1;                
        DELAY(DELAY_TIME);
        ACK=SDA;
        DELAY(DELAY_TIME);
        SCL=0;
        if(ACK==1)
        {
            b=b<<1;
            b=b|0x01;
        }
        else
            b=b<<1;
    }
   
 return b;
}
/*向器件寄存器组写数据*/
void Write_N_Bytes(unsigned int *buffer,unsigned char n,unsigned char addr)

 
 unsigned char i=0;                               
    I2C_Start();
/*the AR1010device address*/
 WriteI2C_1_Byte(0x20);  



/*the AR1010register address*/        
    WriteI2C_1_Byte(addr);
               
 for(i=0;i<n;i++)
    {
     WriteI2C_2_Byte(buffer);
    }
    I2C_Stop();
}
/*读器件寄存器数据*/       
unsigned int Read_2_Bytes(unsigned char addr)
{
 unsigned int a=0;
 unsigned int b=0;                          
    I2C_Start();
    WriteI2C_1_Byte(0x20);


 /*reg_address*/    
    WriteI2C_1_Byte(addr);


    I2C_Start();
    WriteI2C_1_Byte(0x21);
  
 a=ReadI2C_1_Byte();
 /* master发送应答*/
 SEND_0();
 a<<=8;
 b=ReadI2C_1_Byte();
/* master发送应答*/
 SEND_1();
 I2C_Stop();
 return a+=b;   
}


 


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)