stm32F1x,IIC接口操控EEPROM实验代码中,关于24C02读写时序代码的问题

2019-07-21 07:01发布

问:学到IIC接口操控EEPROM一实验,在读写时序代码中,自认为有几行代码不对应24C02读写时序图。看代码:
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{                                  
        u8 temp=0;                                                                                                                                                               
    IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);           //发送写命令
                IIC_Wait_Ack();
                IIC_Send_Byte(ReadAddr>>8);//发送高地址
                IIC_Wait_Ack();                 
        }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据          


        IIC_Wait_Ack();
    IIC_Send_Byte(ReadAddr%256);   //发送低地址
        IIC_Wait_Ack();            
        IIC_Start();                     
        IIC_Send_Byte(0XA1);           //进入接收模式                          
        IIC_Wait_Ack();         
    temp=IIC_Read_Byte(0);                  
    IIC_Stop();//产生一个停止条件            
        return temp;
}
//在AT24CXX指定地址写入一个数据
//WriteAddr  :写入数据的目的地址   
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{                                                                                                                                                                                          
    IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);            //发送写命令
                IIC_Wait_Ack();
                IIC_Send_Byte(WriteAddr>>8);//发送高地址
        }else
        {
                IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据
        }         
        IIC_Wait_Ack();          
    IIC_Send_Byte(WriteAddr%256);   //发送低地址
        IIC_Wait_Ack();                                                                                                              
        IIC_Send_Byte(DataToWrite);     //发送字节                                                          
        IIC_Wait_Ack();                                
    IIC_Stop();//产生一个停止条件
        delay_ms(10);         
}

标红的这三行代码:
IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据          
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr%256);   //发送低地址

对应的读时序:
设备地址(读/写) + ACK应答 + 读的地址的位置
我认为的写法:
IIC_Send_Byte(0xA0);
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr/256);
IIC_Send_Byte(ReadAddr%256);
不理解处:  为什么发送的0XA0后边没有ACK应答,(ReadAddr/256)<<1)左移一位是什么原因,而且要读的地址高8位与低8位之间用ACK应答分隔开?还有我的理解有没有问题?24C02写时序代码同理。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
23条回答
硕果磊磊
1楼-- · 2019-07-22 23:49
biglu 发表于 2018-12-5 11:34
程序里怎么就没有WaitAck了。。。。else{...}后面不就是WaitAck。。。。

看到了,我说的是else里边 发送0XA0发完紧接着应该是Ack应答,
而不是紧接着WriteAddr
秋天
2楼-- · 2019-07-23 00:09
本帖最后由 秋天 于 2018-12-5 15:29 编辑
硕果磊磊 发表于 2018-12-5 15:24
看到了,我说的是else里边 发送0XA0发完紧接着应该是Ack应答,
而不是紧接着WriteAddr

时序图里面很清楚呢  
秋天
3楼-- · 2019-07-23 05:36
 精彩回答 2  元偷偷看……
biglu
4楼-- · 2019-07-23 10:18
硕果磊磊 发表于 2018-12-5 15:24
看到了,我说的是else里边 发送0XA0发完紧接着应该是Ack应答,
而不是紧接着WriteAddr

写在else的括号和写在括号内都一样啊,if里和else里都要用到。。。。。
硕果磊磊
5楼-- · 2019-07-23 11:38
秋天 发表于 2018-12-5 15:29
我就是采集这两个脚的

这么问吧:
IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据         
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr%256);   //发送低地址
IIC_Wait_Ack();
这四行代码改为
IIC_Send_Byte(0xA0);
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr/256);
IIC_Send_Byte(ReadAddr%256);
IIC_Wait_Ack(); 对不对?为什么
秋天
6楼-- · 2019-07-23 15:28
硕果磊磊 发表于 2018-12-5 20:15
这么问吧:
IIC_Send_Byte(0XA0+((ReadAddr/256)

这和容量有关系

一周热门 更多>