[讨论] 我需要你的帮助!

gaorenxiang   2007-4-12 13:12 楼主

我这是用单片机普通I/O模拟IIC,向E2PROM中写1个字节的,然后读出来校验,可以就是出错,我不知道是读错误,还是根本没有写进去,下面是我的程序,帮忙看看,谢谢了

#define  CSI24WC02     0xA0             /* 定义从要地址,忽略通用地址 */
#define  SCL   (1<<2)
#define  SDA   (1<<3)
#define  LED1  (1<<22)
void i2c_start(void)//发送开始信号
{
      IO0SET = SDA;
      IO0SET = SCL;
      IO0CLR = SDA;
      IO0CLR = SCL;
      return;
}
//****************************************************************************
void i2c_stop(void)//发送停止信号
{
      IO0CLR = SDA;
      IO0SET = SCL;
      IO0SET = SDA;
      return;
}    
//****************************************************************************
uint8   i2c_ack(void)//确认信号
{
      uint8    ack;
      IO0SET = SDA;
      IO0SET = SCL;
      if(SDA==1)
           ack = 1;
       else
           ack = 0;
       IO0CLR = SCL;
       return  (ack);
}
//****************************************************************************
void i2c_send8bit(uint8 b)
{
       uint8 a;
       for(a=0;a<8;a++)
        {
          if (b&0x80==1)
             IO0SET = SDA;
          else
             IO0CLR = SDA;
          IO0SET = SCL;
          IO0CLR = SCL;
         }
       
       return;
}

//****************************************************************************
uint8 i2c_receive8bit(void)
{
       uint8 a;
       uint8 b=0;
       for(a=0;a<8;a++)
          {
            IO0SET = SCL;
            b=b<<1;
            if(SDA==1)
                b=b|0x01;       //按位或
            IO0CLR = SCL;
           }
       return(b);
}

//****************************************************************************
//i2c_write(地址,数据),写一个字节

void i2c_write(uint8 Address,uint8 Data)
{
       i2c_start();
       i2c_send8bit(CSI24WC02);          
       do{   
          i2c_send8bit(Address);
           }while(i2c_ack());
       do{
           i2c_send8bit(Data);
            }while(i2c_ack());
       i2c_stop();
       return;
}

//****************************************************************************
//i2c_read(地址,数据),写一个字节

uint8 i2c_read(uint8 Address)
{
       uint8 c;
       i2c_start();
       i2c_send8bit(CSI24WC02);                      
       do{                   
           i2c_send8bit(Address);      
           }while(i2c_ack());
       do{
           i2c_start();
           i2c_send8bit(0xA1);
       }while(i2c_ack());
       do{      
           c=i2c_receive8bit();
           }while(i2c_ack());
       i2c_stop();
       return(c);
int main(void)
{
       uint8 dd;
       PINSEL0 = 0x00000000;   // 设置I2C口连接
       PINSEL1 = 0x00000000;
        i2c_write(0x02,0x06);
       DelayNS(5);
       dd=i2c_read(0x02);
        for(;;)
        {}
       return(0);
}

回复评论 (4)

Re: 我需要你的帮助!

帮帮我呀
点赞  2007-4-12 13:18

Re: 我需要你的帮助!

根据时序写就可以了 不难得 你到网上可以找到很多这样的例子 实在找不到 再找我 我有一个 5年前写的
南京璞晓电子   www.cpx0.com需要 msn:njlianjian@hotmail.com
点赞  2007-4-12 13:46

Re: 我需要你的帮助!

那就给我吧,我在网上找了许多例子,比较后还是没看出我的错误,
点赞  2007-4-12 13:50

Re: 我需要你的帮助!

有尔等作为中国后继 中国官场幸甚 算了 这是我写的 /******************************************************************** VIIC_C51.C 此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据 及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的 与用户程序连接并扩展..... 注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器周期,即晶振频率要小于12MHZ) ********************************************************************/ #include /*头文件的包含*/ #include #define uchar unsigned char /*宏定义*/ #define uint unsigned int #define _Nop() _nop_() /*定义空指令*/ /* 常,变量定义区 */ /*端口位定义*/ sbit SDA=P1^7; /*模拟I2C数据传送位*/ sbit SCL=P1^6; /*模拟I2C时钟控制位*/ sbit WP =P1^0; /*状态标志*/ bit ack; /*应答标志位*/ /******************************************************************* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. ********************************************************************/ void Start_I2c() { SDA=1; /*发送起始条件的数据信号*/ _Nop(); SCL=1; _Nop(); /*起始条件建立时间大于4.7us,延时*/ _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /*发送起始信号*/ _Nop(); /* 起始条件锁定时间大于4μs*/ _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /*钳住I2C总线,准备发送或接收数据 */ _Nop(); _Nop(); } /******************************************************************* 结束总线函数 函数原型: void Stop_I2c(); 功能: 结束I2C总线,即发送I2C结束条件. ********************************************************************/ void Stop_I2c() { SDA=0; /*发送结束条件的数据信号*/ _Nop(); /*发送结束条件的时钟信号*/ SCL=1; /*结束条件建立时间大于4μs*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /*发送I2C总线结束信号*/ _Nop(); _Nop(); _Nop(); _Nop(); } /******************************************************************* 字节数据传送函数 函数原型: void SendByte(uchar c); 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0 假) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。 ********************************************************************/ void SendByte(uchar c) { uchar BitCnt; for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/ { if((c<
南京璞晓电子   www.cpx0.com需要 msn:njlianjian@hotmail.com
点赞  2007-4-12 14:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复