打印
[复制链接]
2169|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
caniggia|  楼主 | 2012-12-10 18:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2c, TI, sd, se, ck
/*自己编写的单片机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;   
}

相关帖子

沙发
uet_cache| | 2012-12-10 20:58 | 只看该作者

使用特权

评论回复
板凳
赛元sc| | 2012-12-11 00:04 | 只看该作者
我是看不明白  不过我要好好学习一下  不错的东东

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

40

帖子

0

粉丝