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写时序代码同理。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。