原创 STM32 IIC读取AT24C02

2019-10-18 14:32 589 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 2020-05-27 09:50
sprintf 格式化字符串
sprintf 格式化字符串好久没写博客了,又遇到自己觉得很傻的问题,格式化字符串还要找下定义和用法sprintf() 函数把格式化的字符串写入变量中。arg1、arg2、++ 参数将被插入...
minicaihong 2020-05-25 15:07
12T和1T的单片机
标准51是12T的,就是说12个时钟周期(晶振周期,例如12M的,周期是1/12M,单位秒),机器做一个指令度周期,刚好就是1/12M*12=1uS,常见指令例如nop就是一个周期,刚好1uS,其他的...
minicaihong 2020-05-23 16:22
4HC595驱动8*8点阵屏
74HC595驱动8*8点阵屏置顶 菜袅1号 2020-05-19 10:00:03   52   收藏展开该项目使用国产M0核单片机,驱动方式类似于stm32平台;点阵驱动芯片:...
minicaihong 2020-05-23 10:13
stm32 一上电串口发送错误的数据
)STATUS寄存器的上电初始值有问题造成的,Usart的发送数据寄存器有一个缓冲移位寄存器。并且发送有两个状态,一个是发送数据寄存器为空,一个是移位寄存器发送完成。上电后Usart的状态寄存器的发送...
minicaihong 2020-05-23 09:14
应用用 memcpy()做串口数据接收
void CopeSerial_1_Data(unsigned char ucData){ static unsigned char ucRxBuffer[250]; static unsigned ...
minicaihong 2020-05-23 08:30
LED显示屏的接口
LED显示屏的接口形式有04接口、08接口、12接口几种,这里只介绍08接口。  08接口的管脚定义如图1所示。图1 08接口管脚定义  其中,管脚LA、LB、LC、LD表示行信号;管脚R1...
广告
我要评论
1
0
广告
关闭 热点推荐上一条 /3 下一条