打印

求教51写AT24C512B的问题

[复制链接]
1961|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
写好的程序在仿真的时候只能写到地址0X00FF,就又跳到地址0X0000开始写了。求帮看看哪出问题了
#include <reg52.h>
#include<intrins.h>
#define  uchar    unsigned char
#define  uint     unsigned int

sbit SDA  = P3^5;                  
sbit SCL  = P3^6;                 

uchar n_data[]={22,3,5,7,9,11,23,45,69};

/************************************************************************/
void delay(int i)
{
        int j;
        while(i--)
        for(j=255;j>0;j--);
}

/************************************************************************/
void iic_delay()
{  
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}
/************************************************************************/
void iic_start()
{
  SDA = 1;
  SCL = 1;
  iic_delay();
  SDA = 0;
  iic_delay();
  SCL = 0;
}
/************************************************************************/
void iic_stop()
{
  SDA=0;
  SCL=0;
  iic_delay();
  SCL=1;
  iic_delay();
  SDA=1;
}
/************************************************************************/
/* 发送ACK信号   */
/************************************************************************/
void ack()
{
  SDA=0;
  iic_delay();
  SCL=1;
  iic_delay();
  SCL=0;
}
/************************************************************************/
/* 发送NOACK信号 */
/************************************************************************/
void iic_noack()
{
  SDA=1;
  iic_delay();
  SCL=1;
  iic_delay();
  SCL=0;
}
/********************************************************************
等待ACK信号      
***********************************************************************/
void iic_wait_ack()
{
  uchar tt=200;

  SDA=1;
  iic_delay();
  SCL=1;
  iic_delay();
  while(SDA && tt--){}
  SCL=0;
}
/********************************************************************
向iic设备发送一个字节
说明:CY是溢出位
***********************************************************************/
void iic_send_byte(uchar sbyte)
{
  uchar i;

  for(i=0;i<8;i++)
  {       
          sbyte<<=1;
    SCL = 0;
    _nop_();
    SDA = CY;
    iic_delay();
    SCL = 1;
    iic_delay();
  }
        SCL=0;
        iic_delay();
    SCL = 1;
    iic_delay();
}
/********************************************************************
MCU从iic设备接收一个字节      
***********************************************************************/
uchar iic_receive_byte()
{
  uchar i;
  uchar ddata=0;
  SCL=0;
  iic_delay();
  SDA=1;
  for(i=0;i<8;i++)
  {
    ddata <<= 1;
    SCL=0;
    iic_delay();
    SCL=1;
    iic_delay();
    ddata |= SDA;
  }
  SCL=0;
  return ddata;
}
/********************************************************************
向iic设备写入N个字节
说明:write_data,写入字节的数组
      Address,从address处开始写入
      n,写入的字节数      
***********************************************************************/
void AT24C64_W(uchar d[], uint address, uchar num)
{
  uchar i;

  iic_start();
  iic_send_byte(0xa0);                  //器件地址
  iic_wait_ack();
  iic_send_byte(address/256);   //传高8位地址
  iic_wait_ack();
  iic_send_byte(address%256);  //传低8位地址
  iic_wait_ack();
  for(i=0; i<num; i++)
  {
    iic_send_byte(d[i]);
    iic_wait_ack();

  }
  iic_stop();
}
/********************************************************************
从iic设备读取N个字节
说明:read_data ,存放字节的数组 ;
address,指定从address处开始读取
num,读取的字节数      
***********************************************************************/
void AT24C64_R(uchar d[] , uint address, uchar n)
{
  uchar i;

  uchar *pp;

  pp = d;
  iic_start();
  iic_send_byte(0xa0);
  iic_wait_ack();
  iic_send_byte(address>>8);
  iic_wait_ack();
  iic_send_byte(address & 0xff);
  iic_wait_ack();
  iic_start();
  iic_send_byte(0xa1);
  iic_wait_ack();       

  for (i=0; i<n; i++)
  {
     *pp = iic_receive_byte();
     pp++;

   if (i <(n - 1))     
    {
      ack();
    }               
  }
  iic_noack();
  iic_stop();  
}

void main()
{        uint j;
        uchar aa[9]={0};
        j=0x1100;  
          while(1)
        {
        AT24C64_W(n_data,j,9);
        delay(5);
        AT24C64_R(aa,0x0000,9);
        j=j+9;
//        P0=numtab[aa[0]]; //数码管的数据位
        if (j==0xffff)
           { j=0x00;  
           }
       
        }       
}

相关帖子

沙发
ayb_ice| | 2014-5-12 16:21 | 只看该作者
1:写操作一般需要5~20MS完成,你的延时可能不够.

2:连续写不能跨页的,否则地址会自动回转的.

3: 你每次都从0地址开始读的,有代码为证"AT24C64_R(aa,0x0000,9);"

使用特权

评论回复
板凳
lbb_1112|  楼主 | 2014-5-13 08:04 | 只看该作者
本帖最后由 lbb_1112 于 2014-5-13 08:35 编辑
ayb_ice 发表于 2014-5-12 16:21
1:写操作一般需要5~20MS完成,你的延时可能不够.

2:连续写不能跨页的,否则地址会自动回转的.

哦,谢谢,那跨页的时候要怎么写比较好。
程序仿真出来有这样的情况,我写FF进去的,好像每写256个就会有地址出错,····

使用特权

评论回复
地板
ningling_21| | 2014-5-13 08:31 | 只看该作者
lbb_1112 发表于 2014-5-13 08:04
哦,谢谢,那跨页的时候要怎么写比较好

跨页时,需重新写入内部地址...

使用特权

评论回复
5
lbb_1112|  楼主 | 2014-5-13 08:40 | 只看该作者
ningling_21 发表于 2014-5-13 08:31
跨页时,需重新写入内部地址...

我是9个数连续写的,不好进行内部地址的判定啊,难道要写一个地址写一个数据那样?

使用特权

评论回复
6
ayb_ice| | 2014-5-13 08:45 | 只看该作者
如果页大小是64

写数量最好是,1,2,4,8,16,32,64这样的大小,并且地址要对齐

否则就要分成多页写,这些可以表现在函数内部,但需要额外处理

使用特权

评论回复
7
lbb_1112|  楼主 | 2014-5-13 09:26 | 只看该作者
本帖最后由 lbb_1112 于 2014-5-13 09:42 编辑
ayb_ice 发表于 2014-5-13 08:45
如果页大小是64

写数量最好是,1,2,4,8,16,32,64这样的大小,并且地址要对齐

我的写数量有两种,一种是10,一种是3~~~~,只能分多页写了吗?能不能写成2+4+4,1+2这种呢?
要不还是一个一个的写吧···就是慢了些

使用特权

评论回复
8
ayb_ice| | 2014-5-13 09:54 | 只看该作者
lbb_1112 发表于 2014-5-13 09:26
我的写数量有两种,一种是10,一种是3~~~~,只能分多页写了吗?能不能写成2+4+4,1+2这种呢?
要不还是一 ...

先去搞清楚什么叫页

其它的自然就明白了

使用特权

评论回复
9
lbb_1112|  楼主 | 2014-5-13 10:17 | 只看该作者
本帖最后由 lbb_1112 于 2014-5-13 10:23 编辑
ayb_ice 发表于 2014-5-13 09:54
先去搞清楚什么叫页

其它的自然就明白了

恩,刚才看了下512的资料,一页只有128b,连续写也是页写的一种了,到页尾会跳到当页的页首去继续写。以前理解页写就是一次写完一页·····我改成一个个的写,写9次,没出错误了,
for (i=0;i<9;i++)
          {        iic_start();
          iic_send_byte(0xa0);                  //器件地址
          iic_wait_ack();
          iic_send_byte(j/256);   //传高8位地址
          iic_wait_ack();
          iic_send_byte(j%256);  //传低8位地址
          iic_wait_ack();
        iic_send_byte(n_data[i   ]);
    iic_wait_ack();  
        iic_stop();
        j++;  
        delay(5);
        }

使用特权

评论回复
10
ayb_ice| | 2014-5-13 10:25 | 只看该作者
lbb_1112 发表于 2014-5-13 10:17
恩,刚才看了下512的资料,一页只有128b,连续写也是页写的一种了,到页尾会跳到当页的页首去继续写。以前 ...

一个一个的写太花时间

所以就出现了页写

可以写个程序,任意写,函数内部自动分页(跨页)

使用特权

评论回复
11
MOn51| | 2014-5-13 16:24 | 只看该作者
这类器件,采用页写是最快的,但一定要注意跨页。

使用特权

评论回复
12
lbb_1112|  楼主 | 2014-5-13 23:40 | 只看该作者
哦,谢谢各位

使用特权

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

本版积分规则

17

主题

54

帖子

1

粉丝