澳门新葡京北京赛车最牛攻略: [技术问答] 硬件I2C读EEPROM的问题

永利游戏开户直营
44|1
楼主
目前用IO模拟的方式读写EEPROM是正常的,说明硬件已经没问题了。但是硬件I2C读EEPROM有问题,写没问题。读的代码如下:
while (((I2Cx->STATUS_1.STATUS_1_Byte & 0x28) != I2C_STATUS_1_READY_MASK) && (timeout < I2C_READY_STATUS_TIMEOUT))
    {
        timeout ++;
    }
    if (timeout >= I2C_READY_STATUS_TIMEOUT)
    {
        errorStatus |= I2C_ERROR_START_NO_BUSY_FLAG;
    }

    errorStatus |= I2C_Start(I2Cx);
    errorStatus |= I2C_WriteOneByte(I2Cx, slaveAddr);
    if(addrbit == 16)
        errorStatus |= I2C_WriteOneByte(I2Cx, (addr >> 8));
    errorStatus |= I2C_WriteOneByte(I2Cx, (addr & 0xff));
    errorStatus |= I2C_Start(I2Cx);
    errorStatus |= I2C_WriteOneByte(I2Cx, slaveAddr | 0x01);
    while(len > 1 && (errorStatus == I2C_ERROR_NULL))
    {
        errorStatus |= I2C_ReadOneByte(I2Cx, pdata, I2C_SEND_ACK);
        pdata++;
        len--;
    }
    errorStatus |= I2C_ReadOneByte(I2Cx, pdata, I2C_SEND_NACK);
    errorStatus |= I2C_Stop(I2Cx);
    if(errorStatus == I2C_ERROR_NULL)
        return TRUE;
    else
    {
        Printf("I2C Read Fail:%x, len:%d\n", errorStatus, len);
        return FALSE;
    }


errorStatus没有错误,返回都是I2C_ERROR_NULL,读回来的数据错了一个字节。
然后我在errorStatus |= I2C_WriteOneByte(I2Cx, slaveAddr | 0x01);后面加一句空读就正常了。
errorStatus |= I2C_ReadOneByte(I2Cx, pdata, I2C_SEND_ACK);//dummy read?
这个是必须的吗?没看到文档有说明这部分的内容。
沙发
| 2019-11-8 17:57 | 只看该作者
IIC驱动代码里有一个专门的Restart函数,你可以用这个试试I2C_Restart
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

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

论坛热帖

永利游戏开户直营 快速回复 返回顶部 返回列表
环亚手机下载登入 处女星号天津快乐十分走势 68justoa,com 葡京VR彩票百家乐开奖结果 申博太阳城AG国际馆计划群大全
e乐彩游戏 汇丰北京赛车开奖记录 新世纪六合彩开奖记录 星际香港六合彩开奖直播 新疆时时彩开奖号码登入
娱乐版大发888网站 大发888广东快乐十分开奖号历史 澳门新葡京VR金星1.5分彩开奖号历史 皇家88平台登录 千亿广西快3走势图
yg财神到登入 阿玛尼幸运农场走势图 www.99msc.com 女神国际DS太阳城助赢软件 金冠快乐十分开奖