历史上的今天
返回首页

历史上的今天

今天是:2025年08月14日(星期四)

正在发生

2019年08月14日 | STM32 IIC通信往24C02写数据、读数据

2019-08-14 来源:eefocus

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();

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

                 I2C_Wait_ACK();


                  //先读高字节

                 data=rev_Byte(1)<<8;  //"1"表示主机需要给从机应答                

                 I2C_Wait_ACK();

                  //读低字节

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

                 I2C_Stop();


                 return data;

             }


     (4)、写两个字节:

        

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

           {

               I2C_Start();

               

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

                 {

                       send_Byte(0xA0);

                       I2C_Wait_ACK();    

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

推荐阅读

史海拾趣

EPIC公司的发展小趣事

随着公司的发展,Epic Games开始通过收购和投资来扩展其业务范围。2007年8月20日,Epic Games收购了一家位于波兰的游戏开发商People Can Fly,并成为其第一大股东。这次收购不仅为Epic Games带来了更多的开发资源,也使其在游戏开发领域的实力得到了进一步提升。此外,Epic Games还积极投资其他有潜力的游戏开发商和团队,以推动整个游戏行业的创新和发展。

Circuit Technology Inc公司的发展小趣事

面对电子行业的快速变化和技术更新,CTI始终保持敏锐的洞察力。公司不断加大研发投入,引进高端人才,建立研发团队,致力于开发具有自主知识产权的新技术、新产品。通过不断创新,CTI成功推出了一系列具有竞争力的新产品,不仅满足了市场需求,也提升了公司的核心竞争力。

Caliber公司的发展小趣事

在环保意识日益增强的今天,Caliber公司积极响应国家号召,推动绿色环保生产。公司投入大量资金引进环保设备和技术,减少生产过程中的污染排放。同时,Caliber还研发了一系列节能型电子产品,为用户提供更加环保的选择。这些举措不仅提升了公司的社会形象,也为公司的可持续发展注入了新的动力。

国产公司的发展小趣事
使用示波器等工具观察输入和输出信号的波形,检查是否存在失真、噪声等问题。
CYANLITE公司的发展小趣事

在XXXX年,CYANLITE公司迎来了一次重要的技术突破。他们成功研发出了一种新型的LED芯片,这种芯片具有更高的发光效率和更长的使用寿命。这一技术的突破使得CYANLITE公司的产品在市场上更具竞争力,公司也借此机会进一步扩大了市场份额。随着品牌知名度的提升,CYANLITE公司开始拓展国际市场,其产品逐渐出口到欧洲、北美等地区,公司的业绩也实现了快速增长。

CR Magnetics公司的发展小趣事

CR Magnetics公司成立于1986年,自创立之初,公司便致力于提供高质量的传感器、传感器组件等系列产品。凭借创始人的远见卓识和团队的共同努力,CR Magnetics很快在电子行业中崭露头角。公司总部位于美国密苏里州圣路易斯市,拥有先进的生产设施和仓库,为产品的研发和生产提供了坚实的基础。

问答坊 | AI 解惑

请问大家用C开发AVR时使用的是哪个开发环境,哪个更好用.

请问大家用C开发AVR时使用的是哪个开发环境,哪个更好用. 刚刚从C51转到AVR我这里有三个开发环境,AVR Studio | ICCAVR | cvavr | 其中,AVR Studio是买仿真器自带的,现在准备用Mega64做个。产品不知哪个开发环境好用更适合开发呢? 请大家指点 ...…

查看全部问答>

arm

ARM入门笔记…

查看全部问答>

FPGA可综合性对初学着的一些建议

FPGA可综合性对初学着的一些建议一、HDL不是硬件设计语言 过去笔者曾碰到过不少VHDL或Verilog HDL的初学者问一些相似的问题,诸如如何实现除法、开根号,如何写循环语句等等。在这个论坛上,也时常能看到一些网友提出这一类的问题。 对于这些问 ...…

查看全部问答>

IC (es56031)时序问题

有哪位弄过ES56031混响吗? 我按照datasheet的时序,采用UCOM模式,依次发送D4,D3,D2,D1,SHEEP = 10110,但是就是得不到正确的延时啊,总是得到最小的那个延时12MS,我怀疑是一个初始值,也就是说我没有设置成功。…

查看全部问答>

多线程实质是什么?

多线程实质是什么? …

查看全部问答>

如何使用Windows CE开发Web server。最好又实例,谢谢了。

问题如题提供实例者奖1000分。请求帮忙。 可发邮件给我ld.wuxi@yahoo.com.cn…

查看全部问答>

首家外包网络服务平台问世

  “外包在线”网络技术有限公司CEO喻烜为大家讲述了她鲜为人知的创业经历,从初识“外包”到立志创业,从寻求投资到初有成就,借由这朵铿锵玫瑰坚韧不拔的毅力和非凡的智慧,国内首家外包服务网络平台终于问世,自此“外包”服务更加平民化,从 ...…

查看全部问答>

一道非常简单的问题!就当送分!

地址总线A15—A0(低),存储器地址空间为3000H-67FFH,按字节编址。其中3000H-4FFH为ROM区,选用EPROM芯片(4K*2b/片);5000H-67FFH为RAM区,选用DRAM芯片(2K*4位/片) 解释3000H是如何推出(A15A14为00),而 4FFFH又是如何推出(A15A14为01) ...…

查看全部问答>

嵌入式开发经典网站集锦

国内站点: 华恒公司的主页,里面有很多的相关资料,有待大家去发现 http://www.hhcn.com/chinese/embedlinux-res.html SkyEye嵌入式硬件仿真项目 www.skyeye.org http://gro.clinux.org/projects/skyeye/ 公社的SkyEye项目专栏 http://www.linuxfa ...…

查看全部问答>

士大夫

                                 士大夫…

查看全部问答>