stm32 i2c eeprom 24C02

来源:互联网 发布:破解路由器限速软件 编辑:程序博客网 时间:2024/04/29 11:51

电路图
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]);    }}
原创粉丝点击