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条回答
biglu
1楼-- · 2019-07-23 15:55
硕果磊磊 发表于 2018-12-5 20:15
这么问吧:
IIC_Send_Byte(0XA0+((ReadAddr/256)

不对啊,前面发了啊,AT24C16及以下,和AT24C16以上的读写时序有些不同的,具体搜具体型号芯片的PDF就可以了
硕果磊磊
2楼-- · 2019-07-23 19:29
 精彩回答 2  元偷偷看……
biglu
3楼-- · 2019-07-23 23:26
硕果磊磊 发表于 2018-12-7 15:57
我知道他们时序不同,我这不只是拿出else里边的(也就是AT24C16及以下)代码,理解并替换一下,帮我指正 ...

IIC_Send_Byte(0xA0);
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr/256);
IIC_Send_Byte(ReadAddr%256);
IIC_Wait_Ack();

你这个写法只适合AT24C16及以下的啊,并且每个send_byte后面要加wait_ack
硕果磊磊
4楼-- · 2019-07-24 04:22
biglu 发表于 2018-12-7 16:20
IIC_Send_Byte(0xA0);
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr/256);

每个send_byte后都加ACK应答,不见得吧
我写的
IIC_Send_Byte(ReadAddr/256);
IIC_Send_Byte(ReadAddr%256);
代码就代表Word Address地址,一个高八位,一个低八位
组合成Word Address地址,中间就不能插入Ack
biglu
5楼-- · 2019-07-24 10:03
硕果磊磊 发表于 2018-12-7 16:31
每个send_byte后都加ACK应答,不见得吧
我写的
IIC_Send_Byte(ReadAddr/256);

你用的哪个型号的AT24C啊?

一周热门 更多>