OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3525|回复: 2

用stm32zet6模拟i2c写eeprom-24c02

[复制链接]

3

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-11-8
在线时间
4 小时
发表于 2020-12-23 21:44:45 | 显示全部楼层 |阅读模式
1金钱
用模拟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);
         _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);
                i2c_wait_ack();}
                i2c_stop();
}

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);  }       
}             




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

2154

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4953
金钱
4953
注册时间
2015-1-10
在线时间
621 小时
发表于 2020-12-24 13:29:41 | 显示全部楼层
你两个 eeprom_write_bytes函数都有语法问题
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-11-8
在线时间
4 小时
 楼主| 发表于 2020-12-25 09:14:23 | 显示全部楼层
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
问题已解决
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 12:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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