一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 1186|回复: 1
收起左侧

[其他综合] 模拟I2C如何读取24C02的数据?

[复制链接]
发表于 2015-9-15 16:02 | 显示全部楼层 |阅读模式
网上搜了下,24C02读写数据时的寻址五花八门,看起来跟datasheet里时序图的操作方法完全不同,居然还都可以正常使用。。。


下面这个移植到STM32实测完全可行,但是对着datasheet看了半天也没搞懂,红色的这三行为什么要这么复杂的操作,按照时序图不是应该先发送写硬件地址,然后发送读写地址,最后再发送读器件地址吗?为什么下面这个函数中要用读写的地址 & 0x0700右移位,再| 硬件地址& 0xFFFE?这个0x0700又是从哪来的?又是或又是与的,到最后还不就是个简单的器件地址?求大神指教!~

//读出1串数据 存放读出数据 待读出长度 待读出地址 器件类型(24c16或SD2403)
bool I2C_ReadByte(u8* pBuffer, u8 length, u16 ReadAddress, u8 DeviceAddress)
{
    if(!I2C_Start())return FALSE;
    I2C_SendByte(((ReadAddress & 0x0700) >>7) | DeviceAddress & 0xFFFE);//设置高起始地址+器件地址
    if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
    I2C_SendByte((u8)(ReadAddress & 0x00FF)); //设置低起始地址 I2C_WaitAck();

    I2C_Start();
    I2C_SendByte(((ReadAddress & 0x0700) >>7) | DeviceAddress | 0x0001); I2C_WaitAck();

    while(length)
    {
        *pBuffer = I2C_ReceiveByte();
        if(length == 1)I2C_NoAck();
        else I2C_Ack();
        pBuffer++;
        length--;
    }

    I2C_Stop();
    return TRUE;
}


看datasheet时序图,不是应该像下面这样才对嘛?求解!~
uchar reda_add(uchar address)//读字节
{
        uchar date;
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        start();
        write_byte(0xa1);
        respons();
        date=read_byte();
        stop();
        return date;
}

发表于 2015-9-15 20:05 | 显示全部楼层
也不 太懂   搬凳子来学习

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-23 07:09 , Processed in 0.062364 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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