打印

24C02按页读不出来,求助,读函数好像没问题

[复制链接]
2769|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lshf0|  楼主 | 2011-4-12 16:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void read_page(uchar address,uchar num,uchar *shuju)
{
    start();
write_byte(0xae);
respons();
write_byte(address);
respons();
    start();
    write_byte(0xaf);
    respons();
    for(;(num-1)>0;num--)    //读出N-1个数据
    {      
     *shuju=read_byte();
     respons();
        shuju++;
    }
    *shuju=read_byte();      //读最后一个数据
    unrespons();             //无应答
     stop();   
}
void main()
{   uchar i,tab1[16],*shuju=tab1;
init();
write_page(23,16,tab);    //连续写8个数据
    read_page(23,16,shuju);  //连续读8个数据
    for(i=0;i<8;i++)       //把8个数据给P1LED显示
    {
P1=*shuju;
     shuju++;
    delay1(500);
}
    while(1);
}
//连续写没有问题,读也看不出有什么问题,但MAIN函数调用数据时就总也显不对。

相关帖子

沙发
ayb_ice| | 2011-4-12 17:20 | 只看该作者
问题可能在respons函数

使用特权

评论回复
板凳
lshf0|  楼主 | 2011-4-12 17:24 | 只看该作者
void unrespons()
{
    scl=1;
    sda=1;
    delay();
    scl=0;
}
这个函数有问题吗?

使用特权

评论回复
地板
ayb_ice| | 2011-4-12 19:04 | 只看该作者
void unrespons()
{
    scl=1;
    sda=1;
    delay();
    scl=0;
}
这个函数有问题吗?
lshf0 发表于 2011-4-12 17:24

这个函数有问题,
SCL=高时,SDA不能变化的,否则不是停止就是启动信号
基本程序应该是
SDA = 1;
SCL = 1;
delay();
SCL = 0;

使用特权

评论回复
5
lshf0|  楼主 | 2011-4-12 19:31 | 只看该作者
这个在前面,后面都试过的,不行。

使用特权

评论回复
6
ayb_ice| | 2011-4-12 19:43 | 只看该作者
这个在前面,后面都试过的,不行。
lshf0 发表于 2011-4-12 19:31

在此之前应该保证SCL=0,
那就是还有其它错误

使用特权

评论回复
7
johnwjl| | 2011-4-12 21:32 | 只看该作者
不一定是读函数的问题,也有可能是写函数有问题,LZ可以把写函数也贴出来让大家看看。

使用特权

评论回复
8
EWB5| | 2012-2-1 16:50 | 只看该作者
我也是这个问题,只能显示前4个数据,第一个0在数码管上还不显示~~

使用特权

评论回复
9
dengm| | 2012-2-3 00:51 | 只看该作者
respons(); 是读的!!!! 是接受方发来的 ACK
read_byte(); 可能有问题:

/* Read a bit from I2C bus */
bool i2c_read_bit(void)
{
        bool bit;
        /* Let the slave drive data */
        READSDA();
        I2CDELAY();
        /* Clock stretching */
        while (READSCL() == 0)
                ;  /*  拉低scl 表示请求等待!!!! You should add timeout to this loop */
        /* SCL is high, now data is valid */
        bit = READSDA();
        I2CDELAY();
        CLRSCL();
        return bit;
}

使用特权

评论回复
10
lifeinjoy| | 2012-2-5 17:21 | 只看该作者
void read_page(uchar address,uchar num,uchar *shuju)
{
    start();
write_byte(0xae);
respons();
write_byte(address);
respons();
    start();
    write_byte(0xaf);
    respons();   //这个时候应该是等待从机发送ACK
    for(;(num-1)>0;num--)    //读出N-1个数据
    {      
     *shuju=read_byte();
     respons();   //这个时候是需要主机发送ACK信号...
        shuju++;
    }
    *shuju=read_byte();      //读最后一个数据
    unrespons();             //无应答
     stop();   
}
.................
ACK不对,请参阅I2C总线手册

使用特权

评论回复
11
szshawn2010| | 2012-2-6 00:11 | 只看该作者
按页读,注意起始地址。譬如从 00H--07H,08H-0FH这样读是可以的。如果从01H--08H,这样读是读不到正确数据的。即首地址应该是X0H或X8H开头的。

使用特权

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

本版积分规则

4

主题

15

帖子

0

粉丝