打印

24c16连续读写不正确求助

[复制链接]
1199|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
andiwxz|  楼主 | 2014-9-2 16:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的程序单字节读写都没问题,连续的就不行,代码如下,求帮忙看看
void start_iic(void)
{
TWI_SCL_HIGH();
delay_us(DELAYTIME);
TWI_SDA_HIGH();       
delay_us(DELAYTIME);
TWI_SDA_LOW();
delay_us(DELAYTIME);
TWI_SCL_LOW();
delay_us(DELAYTIME);
}

void stop_iic(void)
{
TWI_SDA_LOW();       
delay_us(DELAYTIME);
TWI_SCL_HIGH();
delay_us(DELAYTIME);
TWI_SDA_HIGH();       
delay_us(DELAYTIME);
TWI_SCL_LOW();
delay_us(DELAYTIME);
}

uint8_t readchar(void)
{
        uint8_t  i,val=0;
        TWI_SDA_INPUT();
        TWI_DELAY();
        for(i=0;i<8;i++)
        {
                val <<= 1;
                TWI_SCL_HIGH();
                delay_us(DELAYTIME);
                if (TWI_SDA_READ() == 1)
                        val |=1;
                TWI_SCL_LOW();
                delay_us(DELAYTIME);
        }
        TWI_SDA_OUTPUT();
        delay_us(DELAYTIME);
        TWI_SDA_HIGH();       
        delay_us(DELAYTIME);
        TWI_SCL_HIGH();
        delay_us(DELAYTIME);
        TWI_SCL_LOW();
        delay_us(DELAYTIME);
        return val;
}

void writedata(uint8_t  data)
{
uint8_t  i;
for(i=0;i<8;i++)
{
if(data & 0x80)  TWI_SDA_HIGH();       
else             TWI_SDA_LOW();
data=(data<<1);
TWI_SCL_HIGH();
delay_us(DELAYTIME);
TWI_SCL_LOW();
delay_us(DELAYTIME);
}
TWI_SDA_INPUT();
TWI_DELAY();
TWI_SDA_HIGH();       
delay_us(DELAYTIME);
TWI_SCL_HIGH();
delay_us(DELAYTIME);
TWI_SCL_LOW();
delay_us(DELAYTIME);
TWI_SDA_OUTPUT();
delay_us(DELAYTIME);
}

uint8_t readiic (uint8_t addrr)
{
uint8_t  val;
start_iic();
writedata(0xa0);
writedata(addrr);
start_iic();
writedata(0xa1);
val = readchar();
stop_iic();
return val;

}
void writeiic(uint8_t addrr,uint8_t data)
{
start_iic();
writedata(0xa0);
writedata(addrr);
writedata(data);
stop_iic();
}

相关帖子

沙发
ningling_21| | 2014-9-2 16:14 | 只看该作者
应答处理明显有问题...

使用特权

评论回复
板凳
gx_huang| | 2014-9-2 16:46 | 只看该作者
ACK处理错误了吧!
只见单字节的读写函数,没见主程序。

使用特权

评论回复
地板
andiwxz|  楼主 | 2014-9-3 09:36 | 只看该作者
主程序就是写个for循环,连续的读或者写。我的是两个字节有一个错误的,很有规律,后来两次读写之间加点间隔就没事,可能还是时序的事,哪位知道是哪里的时序出了问题?

使用特权

评论回复
5
gx_huang| | 2014-9-3 10:24 | 只看该作者
真是的,要判断ACK是否有应答,否则延时后继续尝试。
如果不判断ACK,写函数后面必须加延时的。
一般要延时几个毫秒的。读的话不加延时肯定没有问题的。

使用特权

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

本版积分规则

166

主题

258

帖子

3

粉丝