5320|4

13

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

我需要你的帮助! [复制链接]

我这是用单片机普通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);
}

最新回复

有尔等作为中国后继 中国官场幸甚 算了 这是我写的 /********************************************************************                        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  详情 回复 发表于 2007-4-12 14:00
点赞 关注

回复
举报

13

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

Re: 我需要你的帮助!

帮帮我呀
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

板凳
 

Re: 我需要你的帮助!

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

回复

13

帖子

0

TA的资源

一粒金砂(初级)

4
 

Re: 我需要你的帮助!

那就给我吧,我在网上找了许多例子,比较后还是没看出我的错误,
 
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

5
 

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
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表