历史上的今天
今天是:2025年01月04日(星期六)
2019年01月04日 | stm32 i2c eeprom 24C02
2019-01-04 来源:eefocus
电路图



举例
#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]);
}
}
下一篇:stm32 rtc 实时时钟
史海拾趣
|
1 步进电机 步进电动机是纯粹的数字控制电动机,它将电脉冲信号转变成角位移,即给一个脉冲,步进电机就转一个角度,因此非常适合单片机控制。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响, ...… 查看全部问答> |
|
1 引言 现今,随着整机尺寸的减小和元器件的高度集成,促进了元器件的小型化、薄型化。由于SAW(Surface Acoustic Wave)器件小型化并且有着出众的滤波功能,它们存许多领域的应用中扮演着非常重要的角包。小型化和多功能化是SAW器件发展的主要动力 ...… 查看全部问答> |
|
在wince6.0下有没有像平常手机的那种数字小键盘的英文输入法? 就是平常的2是abc,3是def那种输入法,这是要自己实现还是有现成的输入法还是系统定制的时候有哪个选项? 请各位帮下忙,平常比较来论坛少分也不多,麻烦知道的说下.… 查看全部问答> |
|
推荐一本用PowerPC开发通信设备的书,我还是第一次见同类型的书 嵌入式设计及通信设备开发详解——基于MPC82XX处理器 卓越的链接 http://www.amazon.cn/mn/detailApp?qid=1238487283&ref=SR&sr=13-1&uid=168-0888845-7367438&prodid=bkbk941360 当当的链接 http://product.dangdang.com/product.aspx?pro ...… 查看全部问答> |
|
本人是重点本科2008届的即将毕业生,由于大学没好好学,就过了四二级,找工作一定很难,想找两个单片机项目去面试,这样有点优势,但是不知道找些什么项目,我自己熟悉下,然后变成自己的去面试,大家给个建议吧!另外我想到深圳去找单片机的工 ...… 查看全部问答> |
|
当今许多应用都要求高速采样模数转换器(ADC)具有12位或以上的分辨率,以便用户能够进行更精确的系统测量。然而,更高分辨率也意味着系统对噪声更加敏感。系统分辨率每提高一位,例如从12位提高到13位,系统对噪声的敏感度就会提高一倍。因此,对于A ...… 查看全部问答> |




