原创 STM32 IIC读取AT24C02

2019-10-18 14:32 257 0 1 分类: 物联网 文集: 测试测量

1、数量:I2C1与I2C2

2、时钟: RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1 |RCC_APB1Periph_I2C2,ENABLE);

3、IO配置为开漏输出,在输入时亦可读取,此处使用功能复用。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE );

RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;

GPIO_Init(GPIOB, &GPIO_InitStructure);

4、IIC本身配置

I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ; //配置为普通IIC模式

I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;

I2C_InitStructure.I2C_OwnAddress1 = 0x0a; //自身设备地址

I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; //使能自动应答

I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

I2C_InitStructure.I2C_ClockSpeed = 5000; //40K的速度?

I2C_Init(I2C1, &I2C_InitStructure);

I2C_Cmd(I2C1,ENABLE);

I2C_AcknowledgeConfig(I2C1, ENABLE);

5、IIC读取一个字节:生成一个起始信号-》发送命令码-》等待信号-》发送地址-》发送起始信号-》发送读取命令-》接收数据-》发送发送终止信号-》读取寄存器接收值 么一步都有应答信号,是从设备发送的一个低信号。

vu8 IIC_Read(vu8 addr)

{

vu8 dataValue;

while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));

I2C_GenerateSTART(I2C1,ENABLE);//起始信号

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(I2C1,ATMADDR,I2C_Direction_Transmitter);//发送设备地址+写信号

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//

I2C_Cmd(I2C1,ENABLE);

I2C_SendData(I2C1,addr);//发送存储单元地址,从0开始

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_GenerateSTART(I2C1,ENABLE);//起始信号

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(I2C1,ATMADDR,I2C_Direction_Receiver);//发送设备地址+读信号

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

I2C_AcknowledgeConfig(I2C1,DISABLE);

I2C_GenerateSTOP(I2C1,ENABLE);

while(!(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)));

dataValue=I2C_ReceiveData(I2C1);//读出寄存器数据

return dataValue;

}

6、写一个字节:产生起始信号-》发送设备号+指令-》发送地址-》产生起始信号-》读取数据-》产生结束信号

void IIC_Write(vu8 addr,vu8 dataValue)

{

I2C_GenerateSTART(I2C1,ENABLE);

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(I2C1,ATMADDR,I2C_Direction_Transmitter);

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

I2C_SendData(I2C1,addr);

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData(I2C1,dataValue);

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_GenerateSTOP(I2C1,ENABLE);

}

7、AT24C02相关

2K大小:256*8bits 也就是256页,每页8个bits

地址从0x00开始到0xff个字节

广告

文章评论 1条评论)

登录后参与讨论

curton 2019-10-18 21:26

学习
相关推荐阅读
minicaihong 2019-10-28 10:27
麦克斯韦方程组来源
美国著名物理学家理查德·费曼(Richard Feynman)曾预言:“人类历史从长远看,好比说到一万年以后看回来,19世纪最举足轻重的毫无疑问就是麦克斯韦发现了电动力学定律。”这个预言或许对吧。可是...
minicaihong 2019-10-25 16:10
十九个5V转3.3V的小技巧 第三部分
十九个5V转3.3V的小技巧时间:2019-10-22本文对稳压电路5V转3.3V的经典方案进行了总结,并进行了详尽的阐述。技巧十六:5V→3.3V有源模拟衰减器此技巧使用运算放大器衰减从 5V 至...
minicaihong 2019-10-25 16:09
十九个5V转3.3V的小技巧 第二部分
十九个5V转3.3V的小技巧时间:2019-10-22本文对稳压电路5V转3.3V的经典方案进行了总结,并进行了详尽的阐述。技巧九:5V→3.3V直接连接通常 5V 输出的 VOH 为 4.7 伏,...
minicaihong 2019-10-25 16:08
十九个5V转3.3V的小技巧 第一部分
十九个5V转3.3V的小技巧 第一部分本文对稳压电路5V转3.3V的经典方案进行了总结,并进行了详尽的阐述。技巧一:使用LDO稳压器,从5V电源向3.3V系统供电标准三端线性稳压器的压差通常是 2....
minicaihong 2019-10-19 13:26
认清陀螺仪“误入歧途”的本质,教你几招轻松“带回”
测量角速率的MEMS陀螺仪有多个误差贡献因素,偏置不稳定性是其中之一。然而,与提供增强性能的分立器件相比,惯性测量单元(IMU)具有多方面优势。六自由度IMU由多个惯性MEMS传感器组成,这些传感器经...
minicaihong 2019-10-19 10:03
单片机编程软件有哪些?Keil、IAR单片机编程软件简介
一、keil c51编程软件可以这么说,凡是搞单片机的,几乎没有人不知道51单片机,而51单片机使用最广泛的编程软件是keil c51。既然用的人多,那么关于keil c51的使用教程、使用方法、技巧...
广告
我要评论
1
0
广告
关闭 热点推荐上一条 /2 下一条