打印
[其它应用]

不知道那里有错误?

[复制链接]
834|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhuhuis|  楼主 | 2022-6-11 17:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
软件读写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.

使用特权

评论回复
沙发
tian111| | 2022-6-11 17:30 | 只看该作者
你的Main主程序写得很奇怪,还有就是看门狗是否开启

使用特权

评论回复
板凳
supernan| | 2022-6-11 17:32 | 只看该作者

如果开启了要记得清看门狗,不然会复位

使用特权

评论回复
地板
jlyuan| | 2022-6-11 17:34 | 只看该作者
该芯片用于IIC的I/O是否采用的是 漏极开路 模式?如果没有 漏极开路 模式,那么实际工作中,要注意I/O的输入/输出的切换

使用特权

评论回复
5
pengf| | 2022-6-11 17:36 | 只看该作者
按IIC协议,相关的信号保持时间是否大于规定中应该操持时间的最小值

使用特权

评论回复
6
chuxh| | 2022-6-12 12:00 | 只看该作者

从程序中看,好像起始信号就不对,信号保持/间隔 的时间小于 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)

使用特权

评论回复
7
supernan| | 2022-6-12 12:03 | 只看该作者
79F082没有开漏极IO,用于模拟I2C时一定要确认好IO口有没有设置正确

使用特权

评论回复
8
zhenykun| | 2022-6-12 12:05 | 只看该作者
建议屏蔽其他无关程序的影响。

使用特权

评论回复
9
llljh| | 2022-6-12 12:07 | 只看该作者
确认写入是否正确,如果写入都错误了,那么读取肯定也是错的。

使用特权

评论回复
10
dengdc| | 2022-6-12 12:08 | 只看该作者
定义变量 常量  延时函数都没有什么问题呀

使用特权

评论回复
11
zhuhuis|  楼主 | 2022-6-12 12:11 | 只看该作者
嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

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

本版积分规则

728

主题

8464

帖子

6

粉丝