野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9040|回复: 1

霸天虎通过硬件IIC读写AT24C02,发送7位地址,ADDR位在没有读取SR1和SR2之前自动清零

[复制链接]
发表于 2018-5-4 19:24:39 | 显示全部楼层 |阅读模式
用霸天虎硬件读写取AT24C02,写入字节是没有问题的。在读取字节,第一次发送器件地址
        I2C_Send7bitAddress(EEPROM_I2C,EEPROM_ADRESS,I2C_Direction_Transmitter);
之后检测事件
        I2CTimeout = I2CT_FLAG_TIMEOUT;
        while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR)
        {
                if((I2CTimeout--) == 0)                                                                       
                        return I2C_TIMEOUT_UserCallback(11);
        }
程序总是会死在这里。单步调试,读取I2C1->SR1寄存器是0x82,与预期值是相同的,最后读取的值和写入的值一样。但是连起来跑,在I2C_CheckEvent函数之前用串口输出I2C1->SR1寄存器的值,是0x400,也就是AF为1,应答失败。在前面加入延时也没有效果。
        I2C_Send7bitAddress(EEPROM_I2C,EEPROM_ADRESS,I2C_Direction_Transmitter);
        //延时5ms
        Delay_ms(5);
       
        printf("I2C1->SR1 == %X\n",I2C1->SR1);//调试输出值为400,理论为0x82
       
        //等待 ADDR,TXE,MSL,BUSY,TRA 置1
        I2CTimeout = I2CT_FLAG_TIMEOUT;
        while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR)
        {
                if((I2CTimeout--) == 0)                                                                       
                        return I2C_TIMEOUT_UserCallback(11);
        }
总是会输出等待超时,errorcode=11,请问这个怎么解决

附录:读取AT24C02代码
/*
* 从EEPROM中读取一块数据
* pBuffer 存放读出数据的缓存区指针
* WriteAddr 存放数据的内部地址
* NumberByteToRead 从EEPROM中读取的字节数
*/
uint32_t I2C_EEPROM_BufferRead(uint8_t *pBuffer,uint8_t ReadAddr,uint16_t NumberByteToRead)
{       
        //检测总线是否空闲,如若不是,则等待
        I2CTimeout = I2CT_FLAG_TIMEOUT;
        while(I2C_CheckEvent(EEPROM_I2C,I2C_FLAG_BUSY)!=ERROR)
        {
                if((I2CTimeout--) == 0)                                                                       
                        return I2C_TIMEOUT_UserCallback(9);
        }
       
        //发送起始信号
        I2C_GenerateSTART(EEPROM_I2C,ENABLE);
        //等待SB,MSL,BUSY置1
        I2CTimeout = I2CT_FLAG_TIMEOUT;
        while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT)==ERROR)
        {
                if((I2CTimeout--) == 0)                                                                       
                        return I2C_TIMEOUT_UserCallback(10);
        }
       
        //发送EERPOM器件地址,写方向
        I2C_Send7bitAddress(EEPROM_I2C,EEPROM_ADRESS,I2C_Direction_Transmitter);
        //延时5ms
        Delay_ms(5);
       
        printf("I2C1->SR1 == %X\n",I2C1->SR1);
       
        //等待 ADDR,TXE,MSL,BUSY,TRA 置1
        I2CTimeout = I2CT_FLAG_TIMEOUT;
        while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR)
        {
                if((I2CTimeout--) == 0)                                                                       
                        return I2C_TIMEOUT_UserCallback(11);
        }
       
//        if(((EEPROM_I2C->SR1)&0x0002)==0)
//        {
//                return I2C_TIMEOUT_UserCallback(11);
//        }
//        EEPROM_I2C->SR2;
       
        //通过重新写入PE,清除ADDR位
        I2C_Cmd(EEPROM_I2C,ENABLE);
       
        //写入要读取的内部地址
        I2C_SendData(EEPROM_I2C,ReadAddr);
        //等待 BTF,TXE,MSL,BUSY,TRA        置1
        I2CTimeout = I2CT_FLAG_TIMEOUT;
        while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR)
        {
                if((I2CTimeout--) == 0)                                                                       
                        return I2C_TIMEOUT_UserCallback(12);
        }
       
        //发送起始信号
        I2C_GenerateSTART(EEPROM_I2C,ENABLE);
        //等待SB,MSL,BUSY置1/        I2CTimeout = I2C_FLAG_TIMEOUT;
        while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT)==ERROR)
        {
                if((I2CTimeout--) == 0)                                                                       
                        return I2C_TIMEOUT_UserCallback(13);
        }

        //发送EERPOM器件地址,写方向
        I2C_Send7bitAddress(EEPROM_I2C,EEPROM_ADRESS,I2C_Direction_Receiver);
        //
        I2CTimeout = I2C_FLAG_TIMEOUT;
        while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)==ERROR)
        {
                if((I2CTimeout--) == 0)                                                                       
                        return I2C_TIMEOUT_UserCallback(14);
        }
       
        while(NumberByteToRead)
        {
                if(NumberByteToRead == 1)
                {
                        I2C_AcknowledgeConfig(EEPROM_I2C,DISABLE);
                        I2C_GenerateSTOP(EEPROM_I2C,ENABLE);
                }
               
                *pBuffer = EEPROM_I2C->DR;
                pBuffer++;
                NumberByteToRead--;
        }
        //方便下次I2C传输,使能应答
        I2C_AcknowledgeConfig(EEPROM_I2C,ENABLE);
       
        return 1;
}

回复

使用道具 举报

发表于 2018-5-5 08:39:46 | 显示全部楼层
可以的,好好学习下。。。。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-20 21:21 , Processed in 0.043038 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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