野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8875|回复: 1

霸天虎通过硬件IIC读写AT24C02

[复制链接]
发表于 2018-5-4 18:18:15 | 显示全部楼层 |阅读模式
附录:读取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-4 18:41:33 | 显示全部楼层
帮顶。。。。。。
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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