野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16357|回复: 3

模拟i2c写eeprom-24c02

[复制链接]
发表于 2020-12-23 21:37:22 | 显示全部楼层 |阅读模式
用模拟i2c写eeprom-24c02,可以实现单个数读、写,读多个数,但不能实现写多个数,测试了如下三个程序,都只能写入单个数,不知问题出在哪里。
void eeprom_write_bytes(uint8_t *_pWriteBuf, uint8_t _usAddress, uint8_t _usSize)
{
       while(_usSize--){       eeprom_write_one_byte(_usAddress,*_pWriteBuf);
       _usAddress++;
       _pWriteBuf++;}
}
void eeprom_write_bytes(uint8_t *_pWriteBuf, uint8_t _usAddress, uint8_t _usSize)
{      
         uint8_t i;         for (i = 0; i < _usSize-1; i++){
         eeprom_write_one_byte(_usAddress,_pWriteBuf[i]);
         _usAddress++;}
}

void eeprom_write_bytes(uint8_t *_pWriteBuf, uint8_t _usAddress, uint8_t _usSize)
{      
                uint8_t i;
                i2c_start();                                                                         #define   EEPROM_DEV_ADDR                0xA0                /* 24xx02的设备地址 */                i2c_send_byte(EEPROM_DEV_ADDR | EEPROM_I2C_WR);        #define    EEPROM_I2C_WR                   0             /* 写控制bit */
                i2c_wait_ack();                                                                  
                i2c_send_byte(_usAddress);
                i2c_wait_ack();
                for (i = 0; i < _usSize-1; i++){
                i2c_send_byte(_pWriteBuf[i]);
                i2c_wait_ack();}
                i2c_stop();
}



回复

使用道具 举报

 楼主| 发表于 2020-12-23 21:47:38 | 显示全部楼层
void eeprom_write_one_byte(u8 WriteAddr,u8 DataToWrite)
{               
        i2c_start();  
        i2c_send_byte(EEPROM_DEV_ADDR | EEPROM_I2C_WR);
        i2c_wait_ack();
        i2c_send_byte(WriteAddr);                                      
        i2c_wait_ack();  
        i2c_send_byte(DataToWrite);                              
        i2c_wait_ack();                                
        i2c_stop();
}
void i2c_send_byte(u8 txd)
{                        
        u8 t;               
        sda_out();
        IIC_SCL_SET(0);//拉低时钟开始数据传输
        for(t=0;t<8;t++){              
        IIC_SDA_SET((txd&0x80)>>7);
        txd<<=1;           
        delay_us(20);     
        IIC_SCL_SET(1);
        delay_us(20);   
        IIC_SCL_SET(0);
        delay_us(20);  }      
}            
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-25 09:12:43 | 显示全部楼层
char i2c_wait_ack(void)
{
        char re=0;
        sda_in();
        delay_us(10);
        IIC_SCL_SET(0);       
        IIC_SDA_SET(1);delay_us(10);   
        IIC_SCL_SET(1);delay_us(10);  
if (READ_SDA)
        {
                re = 0;              /* CPU读取SDA口线状态 */
   i2c_stop();       
  }                        
else          {re = 1;}
        IIC_SCL_SET(0);
        delay_us(10);
        return re;  
}
u8 i2c_read_byte(u8 ack)
{
        unsigned char i,receive=0;
        sda_in();
        for(i=0;i<8;i++ )
        {
                IIC_SCL_SET(0);
          delay_us(10);  
                IIC_SCL_SET(1);
                delay_us(10);  
    receive<<=1;
                if(READ_SDA)receive++;   
    delay_us(10);  
        }                                         
        if (ack)                          
       i2c_ack();
        else
        i2c_nack();
        return receive;
}
#define ACK    1
#define NACK   0
问题已解决
回复 支持 反对

使用道具 举报

发表于 2022-3-2 16:38:42 | 显示全部楼层
天启之瞳 发表于 2020-12-25 09:12
char i2c_wait_ack(void)
{
        char re=0;

l楼主,这个代码可以吗
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-26 12:40 , Processed in 0.032717 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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