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-21 11:39
写字节的图如下。。
硕果磊磊
2楼-- · 2019-07-21 12:33
biglu 发表于 2018-12-4 00:09
写字节的图如下。。

第一段代码是读时序,而且我有时序图
biglu
3楼-- · 2019-07-21 17:06
你去看AT24C16和AT24C32的pdf:

1. AT24C16写Byte,步骤是 ①发Start ② 写DeviceAddress ③WaitAck ④写WordAddress ⑤WaitAck ⑥写Data ⑦WaitAck ⑧发Stop

2. AT24C32写Byte,步骤是 ①发Start ②写DeviceAddress ③WaitAck ④写FirstWordAddress ⑤WaitAck ⑥写SecondWordAddress ⑦WaitAck ⑧写Data ⑨WaitAck ⑩发Stop

你对照代码再看一下。
硕果磊磊
4楼-- · 2019-07-21 18:55
biglu 发表于 2018-12-4 23:58
你去看AT24C16和AT24C32的pdf:

1. AT24C16写Byte,步骤是 ①发Start ② 写DeviceAddress ③WaitAck ④ ...

不管是AT24CXX,写DeviceAddress后面不都得跟WaitAck嘛,也就是你写的步骤2后跟步骤3.
我问的是 IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); 发送0XA0后为什么没有等待ACK应答
秋天
5楼-- · 2019-07-22 00:53
 精彩回答 2  元偷偷看……
秋天
6楼-- · 2019-07-22 05:24
本帖最后由 秋天 于 2018-12-5 10:17 编辑

看图你就知道了,实验平台原子nano开发板

一周热门 更多>