• stm32 i2c eeprom 24C02


    电路图
    1

    2

    相关文章:http://blog.csdn.net/zhangxuechao_/article/details/74936798

    2

    举例

    #define i2c_scl PBout(10)
    #define i2c_sda PBout(11)
    #define i2c_ack PBin(11)
    
    void I2C_init()
    {
        GPIO_InitTypeDef gpio10 = 
        {
            GPIO_Pin_10,
            GPIO_Speed_50MHz,
            GPIO_Mode_Out_PP
        };
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //时钟使能
    
        GPIO_Init(GPIOB, &gpio10);
    }
    
    void I2C_in()
    {
        GPIO_InitTypeDef gpio11 = 
        {
            GPIO_Pin_11,
            GPIO_Speed_50MHz,
            GPIO_Mode_IPD
        };
    
        GPIO_Init(GPIOB, &gpio11);
    }
    
    void I2C_out()
    {
        GPIO_InitTypeDef gpio11 = 
        {
            GPIO_Pin_11,
            GPIO_Speed_50MHz,
            GPIO_Mode_Out_PP
        };
    
        GPIO_Init(GPIOB, &gpio11);
    }
    
    void I2C_start()
    {
        I2C_out();
    
        i2c_sda = 1;
        i2c_scl = 1;
        delay_us(5);
        i2c_sda = 0;
        delay_us(5);
    
        i2c_scl = 0;
    }
    
    void I2C_stop()
    {
        I2C_out();
    
        i2c_sda = 0;
        i2c_scl = 1;
        delay_us(5);
        i2c_sda = 1;
        delay_us(5);
    
        i2c_scl = 0;
    }
    
    void I2C_ack(u8 ack)
    {
        i2c_scl = 0; //必须的
    
        I2C_out();
    
        i2c_sda = ack;  
        delay_us(2);    
        i2c_scl = 1;
        delay_us(5);
    
        i2c_scl = 0;
    }
    
    u8 I2C_wait_ack()
    {
        u8 flag = 0;
    
        I2C_in();
    
        i2c_scl = 1;
        delay_us(2);
    
        while(i2c_ack == 1)
        {
            flag++;
            if(flag > 250)
            {
                return 1;
            }
        }
        i2c_scl = 0;
    
        return 0;
    }
    
    void I2C_send_byte(u8 data)
    {
        u8 i = 0;
    
        I2C_out();
    
        i2c_scl = 0;
    
        for(i = 0; i < 8; i++)
        {
            if((data & 0x80) > 0)
                i2c_sda = 1;
            else
                i2c_sda = 0;            
            data <<= 1;
            delay_us(2);
    
            i2c_scl = 1;
            delay_us(2);
            i2c_scl = 0;
            delay_us(2);
        }
    }
    
    u8 I2C_recv_byte()
    {
        u8 i = 0;
        u8 data;
    
        I2C_in();
    
        for(i = 0; i < 8; i++)
        {
            i2c_scl = 0;
            delay_us(2);
            i2c_scl = 1;
            delay_us(2);
            data <<= 1;
            data |= i2c_ack;
            delay_us(2);
        }
    
        I2C_ack(0);
    
        return data;
    }
    
    void at24c02Write(u8 addr, u8 d)
    {
        I2C_start();
        I2C_send_byte(0xa0);
        I2C_wait_ack();
        I2C_send_byte(addr);
        I2C_wait_ack();
        I2C_send_byte(d);
        I2C_wait_ack();
        I2C_stop();  
    
        delay_ms(10);
    }
    
    u8 at24c02Read(u8 addr)
    {
        u8 d = 0;
    
        I2C_start();    
        I2C_send_byte(0xa0);
        I2C_wait_ack();
        I2C_send_byte(addr);
        I2C_wait_ack();
        I2C_start();    
        I2C_send_byte(0xa1);
        I2C_wait_ack();
        d = I2C_recv_byte();
        I2C_stop();
    
        return d;   
    }
    
    void at24c02Read_buf(u8 *buf, u8 addr, u16 num)
    {
        u8 i = 0;
    
        for(i = 0; i < num; i++)
        {
            buf[i] = at24c02Read(addr + i);
        }
    }
    
    void at24c02Write_buf(u8 *buf, u8 addr, u16 num)
    {
        u8 i = 0;
    
        for(i = 0; i < num; i++)
        {
            at24c02Write(addr + i, buf[i]);
        }
    }
  • 相关阅读:
    复杂模拟 | 1017 模拟N个顾客M个柜台进行排队
    徒手实现lower_bound和upper_bound
    树状数组 | 1057
    动态规划 | 最长回文子串 1040
    动态规划 | 背包问题 1068
    动态规划 | 对输入进行hash处理的LIS 1045
    总结那些有默认margin,padding值的html标签
    javascript 的七种基本数据类型
    牛客网笔试题整理
    JavaScript 的数据结构与算法
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709554.html
Copyright © 2020-2023  润新知