datasheet

STM32 IIC通信往24C02写数据、读数据

2019-08-14来源: eefocus关键字:STM32  IIC通信  24C02  写数据  读数据

1、24C02模块的原理图:从图中可以看出,A0、A1、A2三个引脚全部接地,说明表示器件地址7位数据后三位全部是0

注:当上一个数据写完之后,若发送停止信号,则至少停下10ms时间后,才能再发送起始信号,这个时间就叫做写周期。


3、器件寻址:

         

4、字节写:

       

5、写页:

     (1)、用页写,CAT24WC01可一次写入8个字节的数据,CAT24C02/04/08/16可以一次写入16个字节的数据。

     (2)、页写操作的启动和字节写一样,不同在于传送了一字节数据后并不产生停止信号,主器件还可以被允许额外再发送7或者15个字节。

     (3)、每发送一个字节数据后CAT24WCxx产生一个应答位,并将字节地址低位加1,高位保持不变。

     (4)、若在发送停止信号之前主器件发送超过8个或16个字节,地址计数器将自动翻转,先前写入的数据被覆盖。

     (5)、接收到P+1字节数据和主器件发送的停止信号后,CAT24Cxx启动内部写周期(10ms)将数据写到数据区,所有接收的数据在一个写周期内写入CAT24Cxx.

 

6、字节读:

     读操作允许主器件对寄存器的任意字节进行读操作。主器件首先通过发送起始信号、从器件地址和它想读取的字节数据的地址执行一个写操作。在从器件应答之后,主器件重新发送起始信号和从器件地址,此时R/W位置1,从器件响应并随机发送应答信号,然后输出所要求的一个8个字节数据,主器件不发送应答信号但产生一个停止信号。

     

7、连续读:

     在从机给主机发送完一个8位字节数据后,主器件产生一个应答信号来响应,告诉从机主器件要求更多的数据,对应每个主机产生的应答信号,从机将发送一个8位数据字节。当主器件不发送应答信号而发送停止位时结束操作。

8、首先定义:

     #define AT24C01     127   

     #define AT24C02     255     // AT24C02有255个字节    

     #define AT24C04     511   

     #define AT24C08     1023  

     #define AT24C016   2047  

     #define AT24C032   4095  

     #define AT24C064   8191   

     #define AT24C028   16383

     #define AT24C0256 32767 


     #define EE_TYPE AT24C02      //从器件的类型


     #define Device_Address   //0xA0


9、读写字节:

     

     (1)、读一个字节:

  

            u8 read_OneByte(u16 addr)  //addr表示主器件想读取的字节数据的地址,是16位的

            {

                 u8 data;

                 I2C_Start();               

                 if( EE_TYPE>AT24C016 )    //读数据时是双字节寻址

                 {

                       send_Byte(0xA0);

                       I2C_Wait_ACK();    

                       send_Byte(addr>>8);   //先发送数据地址高位                                           

                 }


                 else                         //读数据时是单字节寻址

                     send_Byte(0xA0+((addr/256)<<1));  //器件地址+数据地址高字节(数据地址一个字节表示不完,会挤到器件地址里面)

          

                 I2C_Wait_ACK(); 

                 send_Byte(addr%256); //数据地址低字节

                 I2C_Wait_ACK();


                //开始读数据

                 I2C_Start();

                 send_Byte(0xA1);   //最后一位为“1”,表示接下来是要读数据

                 I2C_Wait_ACK();

                 data=rev_Byte(0);  //"0"表示主机不需要给从机应答

                 I2C_Stop();


                 return data;

             }


     (2)、写一个字节

           void write_OneByte(u8 data, u16 addr)   //将数据data写到从器件的地址为addr的缓冲区里面

           {

               I2C_Start();

               

               if( EE_TYPE>AT24C016 )    //读数据时是双字节寻址

                 {

                       send_Byte(0xA0);

                       I2C_Wait_ACK();    

                       send_Byte(addr>>8);   //先发送数据地址高位                                           

                 }

                 else                         //读数据时是单字节寻址

                     send_Byte(0xA0+((addr/256)<<1));  //器件地址+数据地址高字节(数据地址一个字节表示不完,会挤到器件地址里面)

          

                 I2C_Wait_ACK(); 

                 send_Byte(addr%256); //数据地址低字节

                 I2C_Wait_ACK();


                 //开始写数据

                 send_Byte(data);

                 I2C_Wait_ACK();

                 I2C_Stop();


                 delay_ms(10ms);   //延时10ms,也叫写周期

           }


     (3)、读两个字节:

    

            u16 read_TwoByte(u16 addr)  //addr表示主器件想读取的字节数据的地址,是16位的

            {

                 u16 data;

                 I2C_Start();               

                 if( EE_TYPE>AT24C016 )    //读数据时是双字节寻址

                 {

                       send_Byte(0xA0);

                       I2C_Wait_ACK();    

                       send_Byte(addr>>8);   //先发送数据地址高位                                           

                 }


                 else                         //读数据时是单字节寻址

                     send_Byte(0xA0+((addr/256)<<1));  //器件地址+数据地址高字节(数据地址一个字节表示不完,会挤到器件地址里面)

          

                 I2C_Wait_ACK(); 

                 send_Byte(addr%256); //数据地址低字节

                 I2C_Wait_ACK();


                //开始读数据

                 I2C_Start();

[1] [2]

关键字:STM32  IIC通信  24C02  写数据  读数据

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471024.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32 IO口模拟I2C+驱动MPU6050
下一篇:STM32:I2C接口读写EEPROM(AT24C02)试验例程

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

基于stm32f103的矩阵键盘

我现在的任务是做一个8*8的矩阵键盘,制PCB版之前,我用电路板搭了一个3*3的矩阵键盘来模拟一下,设置PA0、PA1、PA2为PP输出,设置P3、P4、P5下拉输入。大多数的芯片内部上拉或下拉电阻都是弱上拉或弱下拉,stm32f103的内部也一样,内部上拉或下拉的电阻阻值约为40K,这样可以方便外部调整,但是,在作为一些通讯引脚时,可能会出现上电时数据不稳定的问题,如I2C通讯,解决的办法是在外部在加上一个较强的上拉或下拉即可。具体程序如下:#include <stm32f10x.h>#include "usart.h"void KeyBoard_Init(void)//按键初始化
发表于 2019-08-16

基于 STM32F407 使用 4*4 矩阵键盘

写在前面:这是我第一次开始写博客,可能写的不是很好,也请大家谅解。本人现在大三,以前在学习过程中遇到过各种各样的问题,关于51单片机,STM32单片机,最近在学习ARM11的Tiny6410以后还会更新一些C/C++/Qt等等方面的东西关于写博客这件事,其实 一直想写博客记录下来,但是因为某些原因(懒),so , 没有写。现在开始,以后遇到单片机上或者编程上遇到的问题,并且自己很好地解决了,我就会在这里记录下来。希望通过博客记录我的学习历程并希望我所解决问题的过程能够帮到需要的人,一起加油吧!!!我是在STM32F407开发板上使用的4*4 矩阵键盘下面是我所使用的开发板1、首先介绍一下4*4矩阵键盘扫描原理 
发表于 2019-08-16
基于 STM32F407 使用 4*4 矩阵键盘

基于STM32F407最小系统板三种矩阵键盘实现方法

0xe0:return 0xe7; case 0xd0:return 0xd7; case 0xb0:return 0xb7; case 0x70:return 0x77; } } if(mode) key =1; if((GPIO_ReadInputData(GPIOA)&0xF0)==0xF0) key =1; return 0;}比较:三种方案其实,第二种方案比较通用,第一种比较简单易懂,前两种都比较好,因为按键按下不松开,并不会影响CPU一直停留在while()循环里啥都不干。最后的实验效果:之前用的板子是STM32F107,数据手册中的GPIO口一些输出输入方式的配置与STM32
发表于 2019-08-16
基于STM32F407最小系统板三种矩阵键盘实现方法

STM32笔记(二)(寄存器)——矩阵键盘

      矩阵键盘是我第一个需要动手焊接东西的实验,是3*3的键盘,焊了一个下午。因为是第一次焊东西,有多处不足,但最后也勉强能用。键盘的电路是组长设计的,希望下一次我能自己独立设计电路。键盘外观正面背面  外观略显粗糙。。。。主要代码       矩阵键盘最主要的一部分代码就是按键扫描部分,通过一个扫描函数对高低电平进行判断,从而确定按键的位置。用过串口输出案件编号1~9。key.c代码void KEY_Init1(void){ RCC->APB2ENR|=1<<3;      JTAG_S
发表于 2019-08-16
STM32笔记(二)(寄存器)——矩阵键盘

STM32 学习笔记 一.矩阵键盘

刚刚接触STM32,感觉和arduino完全是两个难度,如果说arduino是乐高积木,那我感觉STM32就跟盖楼一样,哈哈,是真的难,真的极具挑战性,可能是我刚开始学觉得难,到后面熟练了应该会好一些,言归正传,就讲一讲我们学长给我们下的任务矩阵键盘。学长学姐们做的是九键的矩阵键盘,我们做的是四键的,难度其实相差不大,换汤不换药的类型,原理就是一二号线通高电平,三四号线低电平,然后交换,让一二号低电平,三四号高电平这样就可以确定是哪个按键被按下。OK上代码key.c函数#include "key.h"#include "delay.h"#include "usart.h"
发表于 2019-08-16
STM32 学习笔记 一.矩阵键盘

STM32 矩阵键盘通过串口输出

STM32F103C8T6 4*4矩阵键盘 通过串口输出,可以用来写密码锁程序的思路如下:1、首先需要配置的是矩阵键盘:配置两个函数:  KEY44_Init(矩阵键盘初始化)和key44_Scan(扫描并获取值)   。2、其次,设置串口(本文设置为STM32F103C8T6的串口三): 我们需要对USART进行初始化设置,详细请见下文。3、然后就开始写我们的主函数:主函数比较简单。因为程序已经分装了。4、最后我们要实现按下一个键,串口打出一个字符(按下1键,打出1)——————————————————————————————————————————————————-下边为程序:所用芯片
发表于 2019-08-16

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved