打印

软件读写24C02

[复制链接]
3161|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jwwhy|  楼主 | 2011-8-24 14:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,请问下,软件读写K24C02,怎么读出来一直是00
//-----------------------------------------------------------
#include "mylib.h"
#include    <SH79F082.H>
#include    <intrins.h>
//-----------------------常量定义-------------------------------
#define                sda          P0_4
#define                scl          P0_5
//-----------------------------变量定义--------------------------
bit            f_ACK;
bit           f_I2C_rede_on;
bit           f_I2C_write_on;
//--------------------------------------------------------------                                                  
INT8U        b_i2i_buf;                  //数据临时值
INT8U        temp;                       //读写的次数
INT8U        b_error_sum;                //错误的次数
INT8U   RF_value1=0x80;             //
INT8U   RF_value2=0x70;             //
INT8U        b_i2i_value1;
INT8U        b_i2i_value2;
//---------------延时函数---------------------------------------
//**************************************;1us的基准时间----------
void delay_us(INT16U i)
{
for(;i>0;i--)
      _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();

}
void init(void)
{

CLKCON = 0X00;
P0CR|=0XFF;       //输出状态0005000            
// P0CR|=0X20;       //输出状态0050000
sda=1;
      scl=1;
ADCH = 0x00;
}
//-------------------------发起起始位------------------------
void start_i2i(void)
{        
      
P0CR|=0X10;       //输出状态0005000            
P0CR|=0X20;       //输出状态0050000
  
      sda=1;
      scl=1;
      delay_us(10);                                 
      sda=0;
      delay_us(10);                                 
      scl=0;
}
//----------------------------发送停止信号------------------
void stop_i2i(void)
{         
sda=0;
      scl=1;
      delay_us(10);                                 
      sda=1;
}
//-----------------检查应答信号,没有应答信号f_ACK=0------------
void check_ack(void)
{        
      //sdam=0;                               //置 SDA 为输入模式
P0CR&=0XEF;
      scl=1;                                  //钳着总线,等待应答
      f_ACK=1;
      if(sda==1)  {f_ACK=0;}                  //无应答信号
      scl=0;                                  //释放总线,准备收发数据
     // sdam=1;                               //使 SDA 线输出
      P0CR|=0X10;
}
//--------------------------发送应答位子程序------------------------
void ask_i2c(void)
{        
sda=0;                           //sda=0,应答信号
      scl=1;                           //钳着总线sda,稳定数据
      delay_us(10);        
      scl=0;                          //释放总线
}
//--------------------功能:发无确认信号----------------------------
void nask_i2c(void )
{        
sda=1;                          // sda=1,非应答信号
      scl=1;                          //钳着总线sda,稳定数据
      delay_us(10);
      scl=0;                         //释放总线
}
//------------------功能:向 I2IC  器件里写入 1 字节----------------
void write_8bit(void)
{               

for(temp=0;temp<8;temp++)
      {
      
      // b_i2i_buf=b_i2i_buf<<=1;       //取将要写的数据位
  b_i2i_buf<<=1;
            if(sda==1) {sda=1;}       //fc
            else       {sda=0;}
            scl=1;                        //钳着总线,数据稳定
            delay_us(10);
            scl=0;                        //释放总线
      }
}
//-----------------功能:从 I2IC  器件里读取 1 字节--------------------
void read_8bit(void )
{

                        
P0CR&= 0XEF;                      //使SDA线输入
      delay_us(10);
      for(temp=0;temp<8;temp++)                        
      {
       scl=1;                          //时钟线为高,接受数据位
            delay_us(10);        
            sda=1;                         //假设sda=1
            if(sda==0){sda=0;}             //        
            //b_i2i_buf=b_i2i_buf<<=1;
  b_i2i_buf<<=1;                 //
            scl=0;
      }   
P0CR|=0X10;                         //使SDA线输出
                             
}
//---------------------------------写--------------------------
void I2C_write(void)
{
  b_error_sum = 4;                            //允许错误4次
//..............................................................
write_pro5:
        start_i2i();                               //启动起始信号
        b_i2i_buf=0xa0;
        write_8bit();                              //发出写24C02的寻址字节55 000 0,即0A0H
        check_ack();                               //读应答信号
        if(f_ACK==0)       {goto write_pro80;}      //是否有应答信号
//..............................................................
        b_i2i_buf=0;                              //发数据写入24C02的地址,本例中为00h
        write_8bit();
        check_ack();
        if(f_ACK==0)       {goto write_pro80;}        
//*******************************************************************
        b_i2i_buf=RF_value1;                       //往24C02中写入数据
        write_8bit();
        check_ack();
        if(f_ACK==0)        {goto write_pro80;}        
//.....................................................................
       // b_i2i_buf=RF_value2;                    //往24C02中写入数据
       // write_8bit();
       // check_ack();
       // if(f_ACK==0)        {goto write_pro80;}        
//......................................................................
        stop_i2i();                               //停止发送
        f_I2C_write_on=0;                         //采集成功
//********************************************************************
write_pro80:
        b_error_sum--;
        if(b_error_sum!=0){goto write_pro5;}
}
//--------------------------------------------------------------------
//---------------------------------读操作-----------------------------
//--------------------------------------------------------------------
void I2C_read(void)
{
  b_error_sum=4;                                         
//...............................................................
read_pro5:
//..............................................................
        start_i2i();                               //启动起始信号
        b_i2i_buf=0xa0;                            //发写24C02的寻址字节55 000 0
        write_8bit();
        check_ack();
        if(f_ACK==0)        {goto read_pro80;}     //看 f_ACK 是否为 1,为1则有应答信号
        b_i2i_buf=0;                              //发要读取的数据在24C02中的地址,即00h
        write_8bit();
        check_ack();
        if(f_ACK==0)        {goto read_pro80;}        
//........................................................
        start_i2i();
        b_i2i_buf=0xa1;                      //发读24C02的寻址字节55 000 (1--读)
        write_8bit();
        check_ack();
        if(f_ACK==0)        {goto read_pro80;}        
//***********************************************************      
        read_8bit();                              //读数据
        ask_i2c();
   b_i2i_value1=b_i2i_buf;                  //读数据  
//...........................................................
       // read_8bit();                                         
      //  nask_i2c();                             //最后是无应答信号
  // b_i2i_value2=b_i2i_buf;            //读数据
//............................................................
        stop_i2i();                              //停止信号
        f_I2C_rede_on=1;                         //读I2C成功
//************************************************************
read_pro80:
        b_error_sum--;
        if(b_error_sum!=0){goto read_pro5;}
//..............................................................
}
void main(void)
{
      while(1)
{
        
  delay_us(1);
  init();
  I2C_write();
  delay_us(250);
  I2C_read();
  while(1);
}
}
//**********END****************************************************/
b_i2i_value1的值怎么来是0X00,不知道那里有错误? 晶震用8M.
沙发
neyo.zhong| | 2011-8-24 15:34 | 只看该作者
这个程序太长了,要帮忙找错误实在太痛苦了,我发个实例给你参考一下,下载地址:http://www.sinowealth.com/fae_file/softip/zh/8bit/DEMO7_I2C.rar

提一点,你的Main主程序写得很奇怪,还有就是看门狗是否开启,如果开启了要记得清看门狗,不然会复位

使用特权

评论回复
板凳
gongche| | 2011-8-25 10:21 | 只看该作者
真是为难版主了,呵呵

使用特权

评论回复
地板
老鱼探戈| | 2011-8-25 23:44 | 只看该作者
怎么国产板块老是出现这种问题啊  :L

使用特权

评论回复
5
neyo.zhong| | 2011-8-26 08:56 | 只看该作者
呵呵,看到一大段程序我就头好痛啊,不好意思啦

使用特权

评论回复
6
gongche| | 2011-8-28 16:49 | 只看该作者
呵呵,也不知道楼主解决没有

使用特权

评论回复
7
jwwhy|  楼主 | 2011-8-28 19:14 | 只看该作者
搞了一个礼拜  还是搞不定 晕了

使用特权

评论回复
8
szshawn2010| | 2011-9-18 22:37 | 只看该作者
本帖最后由 szshawn2010 于 2011-9-18 22:44 编辑

首先:1. 该芯片用于IIC的I/O是否采用的是 漏极开路 模式?
         如果没有 漏极开路 模式,那么实际工作中,要注意I/O的输入/输出的切换
      2.按IIC协议,相关的信号保持时间是否大于规定中应该操持时间的最小值
          从程序中看,好像起始信号就不对,信号保持/间隔 的时间小于 4.7US

          SCL==1;
          NOP ;1US
          NOP;1US
          NOP;1US
          NOP;1US
          NOP;1US  <一上NOP 1US,则共5US,大于4,7US>
          SDA==1;(要保证 SDA的高电平比SCL的高电平延迟时间大于4.7US)

        《  要仔细阅读IIC协议》
        
      3.中断发生时,是否产生了对IIC读写程序有影响的运行。
      4.其他未尽事宜,友人补充

使用特权

评论回复
9
neyo.zhong| | 2011-9-21 16:28 | 只看该作者
8# szshawn2010


感谢szshawn2010兄弟的帮忙,我简单补偿一下:

1.79F082没有开漏极IO,用于模拟I2C时一定要确认好IO口有没有设置正确;
2.建议屏蔽其他无关程序的影响。
3.请确认写入是否正确,如果写入都错误了,那么读取肯定也是错的。

使用特权

评论回复
10
huanghuac| | 2011-9-21 17:32 | 只看该作者
8楼兄弟解释的好详细啊

使用特权

评论回复
11
lost1421| | 2011-11-3 11:56 | 只看该作者
加油!

使用特权

评论回复
12
zhuhuis| | 2011-11-8 10:51 | 只看该作者
8楼给力

使用特权

评论回复
13
liguohong327| | 2015-9-10 23:37 | 只看该作者
几年了,今天我又碰到楼主的问题了,不过我的是没有应答信号。官网上的都没有模拟IIC的例 程

使用特权

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

本版积分规则

83

主题

281

帖子

0

粉丝