发 帖  
原厂入驻New
[问答] 模拟I2C读写24c02,可以写,但读出错,大神们帮忙看看
446 单片机
分享
void IIC_write(u8 addr,u8 data)
    IIC_Start();
    IIC_Send_Byte(addr); //发送写命令
    IIC_Stop(); //发送停止信号   

unsigned char IIC_Read(unsigned char addr)
{
        unsigned char data;
    IIC_Start();
        IIC_Send_Byte(0xa0); //发送写器件地址
        IIC_Send_Byte(addr); //发送要读取的地址
    IIC_Start();
        IIC_Send_Byte(0xa1); //发送读器件地址
        data=IIC_Read_Byte(); //读取数据
        IIC_Stop();
        return data;       

}
b0c5ef3eb15b01015dfba0f75e105a6.jpg 9e7ddf2a80f76a44bf532ca0a98482b.jpg 12fe5a99ef523d483e36b267241b155.jpg 2cff0e5f84cc3bc259d1688306e4577.jpg

0
奖励40积分
2020-6-17 17:31:25   评论 分享淘帖 邀请回答
11个回答
unsigned char IIC_Read_Byte(void)
{
        unsigned char a=0,data=0;
        TRISC4=0;    //设置为输出
        RC4=1;       //输出高电平
    delay_us();       
        delay_us();       
        TRISC4=1;    //设置为输入
    delay_us();       
        for(a=0;a<8;a++)//接收8个字节
        {
               
                delay_us();
                IIC_SCL=1;
               delay_us();       
                data<<=1;
                data|=IIC_SDA;
               delay_us();       
                IIC_SCL=0;
               delay_us();       
        }
        return data;
}

已经设置上拉了,但是读取的时候一直是低电平
2020-6-17 17:37:21 评论

举报

你都不管ACK的么,然后读的时候,第一次也也要STOP吧
2020-6-17 18:39:34 15 评论

举报

15 条评论
时序要求太严格,干扰场合读出数据容易出错。
2020-6-18 03:38:16 评论

举报

给几点建议:
1、严格按照时序写。软实现是最好调整时序的,但细心一点。看你的时序就比较乱。
2、你写的时候为什么只有3句,写入的数据呢?
3、写入1次有个5ms的事情,你是否知道?
讲个我的故事:时序写不好,只有最高位读取出错,并且是第二字节,当为01xxxxxx时,会读成11xxxxxx,所以自己一点点看时序,从软件,从示波器,明确知道自己什么时候拉低的,什么时候拉高的,宽度是否符合芯片电气特性。
最后重点就是,不要抄别人的,会坑死你自己。
1 条评论
  • 2020-6-18 11:29

    我加了上拉电阻就好了,但用硬件配置可以不用加,配置为上拉输入就好了,这个有点不舒服,最后一句话非常同意

写操作结束后不需要发Stop脉冲直接进行读操作吗。
2020-7-23 16:55:43 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
我要提问
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表