打印

AT24C08读写问题

[复制链接]
3064|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wanyix|  楼主 | 2008-3-14 01:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
相同硬件(只晶振由12MHz改为24MHz),读写程序程序相同(读写程序的延时有作相应加倍),低频时读写正常,高频时读出的数据是不对的,但都错成某一固定的数。实时仿真也一切正常。这是什么原因呢?

相关帖子

沙发
Supermantm| | 2008-3-14 02:20 | 只看该作者

IIC 总线有频率限制的

其次,写入时内部的刷写时间也是固定的,你改变了速度就要相应调整那段延时了。

使用特权

评论回复
板凳
mohanwei| | 2008-3-14 08:58 | 只看该作者

写延时好像是5ms……

使用特权

评论回复
地板
diannaoza| | 2008-3-14 10:21 | 只看该作者

延时好像是5ms

24C02C我试过可以只延时600us

使用特权

评论回复
5
ayb_ice| | 2008-3-14 10:55 | 只看该作者

最好的方法就是去查询是否忙,再操作

使用特权

评论回复
6
wanyix|  楼主 | 2008-3-14 12:40 | 只看该作者

谢谢各位!

使用特权

评论回复
7
wanyix|  楼主 | 2008-3-14 14:04 | 只看该作者

AT24C08读写问题还是搞不定,程序附后

#include "intrins.h"
#include "comm.h"

#define uchar unsigned char 
#define uint unsigned int

#define OP_READ 0xa1
#define OP_WRITER 0xa0
extern void Delay(unsigned int n);
sbit SDA_24CXX =P2^5; 
sbit SCL_24CXX =P2^6; 


void start_i2c(void)
{
  SDA_24CXX = 1;  
  SCL_24CXX = 1;
  _nop_();     
  _nop_();
  SDA_24CXX = 0;   
  _nop_();     
  _nop_();
  SCL_24CXX = 0;    
}
void stop_i2c(void)
{
  SDA_24CXX = 0;
  SCL_24CXX = 1;  
  _nop_();
  _nop_();
  SDA_24CXX = 1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();

}

bit send_byte_24cxx(uchar str)
{
   uchar BitCnt;
   uchar ack;

   for(BitCnt=0;BitCnt<8;BitCnt++)  
    {
     if((str<<BitCnt)&0x80)
     SDA_24CXX = 1;           
     else 
       SDA_24CXX = 0; 
  
        SCL_24CXX = 1;              
        _nop_();             
        _nop_();
        _nop_();             
        _nop_();
        SCL_24CXX = 0; 
    }
    SDA_24CXX = 1;                

    SCL_24CXX = 1;
     _nop_();
     _nop_();
     _nop_();             
     _nop_();
    ack = SDA_24CXX;        
    SCL_24CXX = 0;
    return ack;


uchar rcv_byte_24cxx(void)
{
  uchar retc;
  uchar BitCnt;
  
  retc=0; 
  SDA_24CXX = 1;            
  for(BitCnt=0;BitCnt<8;BitCnt++)
      {        
        SCL_24CXX = 0;      
        _nop_();
        _nop_();        
        _nop_();
        _nop_();
        SCL_24CXX = 1;      
        retc=retc<<1;
        if(SDA_24CXX == 1)retc=retc+1; 
      }
  SCL_24CXX = 0;    
  return(retc);
}

void ack_i2c(bit a)
{
  
  if(a==0)SDA_24CXX = 0;         
     else SDA_24CXX = 1;
  SCL_24CXX = 1;
  _nop_(); 
  _nop_();                    
  _nop_();
  _nop_();
  SCL_24CXX = 0;                    
}

unsigned char read_byte(unsigned char add)
{uchar temp;
  start_i2c();
  if(send_byte_24cxx(OP_WRITER) != 0)
      return 0;
  if(send_byte_24cxx(add) != 0)
      return 0;
  start_i2c();
  if(send_byte_24cxx(OP_READ) != 0)
      return 0;
  temp = rcv_byte_24cxx();

  ack_i2c(1);
  stop_i2c();

  return temp;
}

unsigned char write_byte(unsigned char add,unsigned char str)
{
  start_i2c();
  if(send_byte_24cxx(OP_WRITER) != 0)
      return 1;
  if(send_byte_24cxx(add) != 0)
      return 1;
  if(send_byte_24cxx(str) != 0)
      return 1;
  stop_i2c();
  return 0;
}

使用特权

评论回复
8
xwj| | 2008-3-14 14:08 | 只看该作者

唉,谁让你“把晶振由12MHz改为24MHz”的?

改了会有什么影响不知道吗???


自己去想!!!

使用特权

评论回复
9
hotpower| | 2008-3-15 08:41 | 只看该作者

估计send_byte_24cxx()没收到应答信号

使用特权

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

本版积分规则

24

主题

27

帖子

0

粉丝