历史上的今天
返回首页

历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2021年10月14日 | STM32-IIC通信(基于AT24C02的软件IIC通信)

2021-10-14 来源:eefocus

IIC是什么?

IIC是一种通信是一种由 PHILIPS 公司开发的两线式串行总线。IIC是用来传输数据的,也是一种通信协议。


IIC的特点:

IIC总线简单而有效,占用的PCB(印制电路板)空间很小,芯片引脚数量少,设计成本低。IIC总线支持多主控(Multi-Mastering)模式,任何能够进行发送和接收的设备都可以成为主设备。主控能够控制数据的传输和时钟频率,在任意时刻只能有一个主控。高速 IIC 总线一般可达 400kbps 以上。


IIC的通信时序:

在这里插入图片描述

I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。


开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。

结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

数据传输 :SDA的数据在SCL高电平期间被写入从机。SDA的数据变化发生在SCL低电平期间。


注:IIC通信的数据采集发生在SCL时钟信号高电平的时候。


应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。


这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。

在这里插入图片描述

硬件IIC与软件IIC:

硬件IIC:

硬件IIC也就是说它的通信时序由硬件完成,不需要软件干预。也就是说什么起始信号、结束信号、应答信号我们不用管,它们都是由硬件完成的。

硬件IIC的优缺点:

优点:通信速度快、效率高。

缺点:只能是拥有IIC功能的IO口可以用,移植起来很麻烦。


软件IIC:

软件IIC是指用软件去控制单片机IO口的电平的高低转换以及高低电平的时间去模拟出一个IIC通信的时序。也就说IIC的起始信号、结束信号、应答/非应答信号都是用软件编程写出来的。


软件IIC的优点:可移植性高;是个单片机都能用,任何普通的IO口都可以进行软件IIC通信(像51单片机这一类,就必须用软件IIC了)。


缺点:通信效率慢了点,但是几us完全可以忽略不计。


前面我们就有说IIC的起始信号是必需的,结束信号和应答信号,都可以不要,在这里就看看IIC起始信号的代码。


这里是AT24Cxx芯片IIC通信的时序要求:

在这里插入图片描述

//产生IIC起始信号

void IIC_Start(void)

{

SDA_OUT();     //sda线输出

IIC_SDA=1;     

IIC_SCL=1;

delay_us(4);

  IIC_SDA=0;//START:when CLK is high,DATA change form high to low 

delay_us(4);

IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 

}


在这里 IIC_SDA和IIC_SCL用宏定义定义了单片机的引脚,比如:#define IIC_SCL PBout(8) //SCL

这样的代码移植起来非常方便,假如你想把stm32的例程移植到51单片机的时候,只需要把引脚定义改一改,另外再写一个精确的延时函数即可,非常简单方便。所以我极力推荐大家使用软件IIC通信。


下面通过STM32于AT24C02之间的通信,了解一下软件IIC通信。

在这里插入图片描述

引脚功能:


A0-A2:地址输入**(注意:仅在AT24C01/02中适用)**

SDA:串行数据

SCL:串行时钟输入

WP:写保护

题外:NC代表引脚可悬空(NC代表无用引脚,在设计时不用连接)在使用大于2K的AT24C系列芯片时, A0-A2会有几个引脚为无用,具体可看芯片手册。


硬件电路设计:

在这里插入图片描述

为什么这样设计,引脚为什么这样连?这就要问问芯片手册了。

翻译如下:(加入了个人理解,可能会有错误)

引脚描述:

串行时钟(SCL): SCL输入用于将正边缘时钟数据输入每个EEPROM设备,将负边缘时钟数据输出每个设备。

串行数据(SDA): SDA引脚是双向串行数据传输。这种引脚是开漏驱动的,可以与任意数量的其他开漏或开集电极装置相连。

设备/页面地址(A2, A1, A0): A2, A1和A0引脚是AT24CO1A和AT24C02硬连接的设备地址输入。多达八台1K/2K设备可以在一个总线系统上被寻址(设备寻址在设备寻址部分下被详细讨论)。(A2, A1, A0,3个位代表8个地址,其实就是2^3=8,所以可以AT24C01/2可以接8个设备)


AT24C04使用硬线寻址的A2和A1输入,在一个单一总线系统上可以寻址共四个4K设备,A0引脚是一个无连接。

AT24C08A只使用A2输入为硬线寻址和两个8K设备可以在一个单一总线系统上被寻址,A0和A1引脚没有连接。

AT24C16A不使用设备地址引脚,它限制了单个总线上的设备的数量为一个A0、A1和A2引脚没有连接。

写保护(WP): AT24C01A/02/04/08A/16A有一个写保护pin,提供硬件数据保护。当连接到地(GND)时,写保护pin允许正常的读/写操作。当写保护引脚连接到Vcc时,写保护功能启用。


芯片器件地址:

在这里插入图片描述

设备地址的第8位是读/写操作选择位(R/W位)。


如果这个位高,则启动读操作;

如果这个位低,则启动写操作。

在这里插入图片描述

按照我们原理图的接法,我们可以知道:


1、WP接低电平,允许读/写操作

2、A2, A1和A0引脚都是接地,芯片高四位统一为1010(十六进制为A)所以器件地址就是:1010 000X


读地址操作:0XA1

写地址操作:0XA0

写操作方法:1、字节写 2、页写

在这里插入图片描述

字节写:

字节写操作首先发送设备地址字和写确认(也就是0XA0));在收到这个地址,EEPROM将响应一个“0”。

然后发送8位数据储存地址(在容量大于2K的芯片是word adress,也就是字地址,一个字为两个字节,所以一次是写两个字节地址,分别为要写入地址的高8位和低八位共16位地址);在收到两个8位数据字地址之后,EEPROM将再输出一个“0”响应。最后发送数据,发送结束后产生一个0的应答。

寻址设备,如微控制器,在收到这些操作后必须以停止条件终止写序列。此时EEPROM进入到非易失性存储器的内部定时写周期twp。在这个写周期中,所有输入都被禁用,直到写完成,EEPROM才会响应(参见第10页的图8)。

在这里插入图片描述

//在AT24CXX指定地址写入一个数据

//WriteAddr  :写入数据的目的地址    

//DataToWrite:要写入的数据

void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)

{

IIC_Start();  //产生IIC起始信号

  //发送外设地址0XA0(末位为0表示写数据) +储存地址高8位

IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   

IIC_Wait_Ack();     //等待应答

IIC_Send_Byte(WriteAddr%256);   //发送储存地址低8位

IIC_Wait_Ack();      

IIC_Send_Byte(DataToWrite);     //发送字节    

IIC_Wait_Ack();         

IIC_Stop();            //产生停止信号

delay_ms(10);  

}


程序里面把器件地址(对应word adress)分开为两次发(因为IIC每次是写入8位),第一次是(WriteAddr/256)<<1)把地址左移一位。

**注意:**其实在使用AT24C02时,不需要那么麻烦。只需以下操作:


void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)

{

IIC_Start();  //产生IIC起始信号

IIC_Send_Byte(0XA0);     //发送外设地址0XA0

IIC_Wait_Ack();     //等待应答

IIC_Send_Byte(WriteAddr);   //发送储存地址

IIC_Wait_Ack();      

IIC_Send_Byte(DataToWrite);     //发送字节    

IIC_Wait_Ack();         

IIC_Stop();            //产生停止信号

delay_ms(10);  

}


所以多出来的那几个语句只是为了兼容后面容量大的芯片。

在这里插入图片描述

页写:(没有例程)

页写:1K/2K EEPROM能够进行8字节的页写,而4K、8K和16K设备能够进行16字节的页写。页写的初始化与字节写的初始化是一样的,但是微控制器不会在第一个数据字被写入后发送一个停止条件。相反,在EEPROM确认接收到第一个数据字后,微控制器可以发送最多服务器(1K/2K)或15个(4K、8K、16K)更多的数据字。EEPROM在收到每个数据字后将以一个“O”响应。微控制器必须使用停止条件终止页写序列(参见第10页上的图9)。数据字地址较低的三位(1K/2K)或四位(4K, 8K, 16K)位在收到每个数据字后内部递增。较高的数据字地址位不递增,保持内存页行位置。当内部生成的单词address到达页面边界时,下面的字节被放置在同一页面的开头。如果超过8个(1K/2K)或16个(4K, 8K, 16K)数据字被传输到EEPROM,数据字地址将“滚动”,之前的数据将被覆盖

在这里插入图片描述

读的时序:有3种:1、当前地址读 2、随机读3、顺序读


下面贴出随机读的时序:

在这里插入图片描述

//在AT24CXX指定地址读出一个数据

//ReadAddr:开始读数的地址  

//返回值  :读到的数据

u8 AT24CXX_ReadOneByte(u16 ReadAddr)

{   

u8 temp=0; //用于保存读取到的数据的变量      

  IIC_Start();  //产生一个起始信号

IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,末位为0代表写数据    

IIC_Wait_Ack();                 //产生一个应答信号

  IIC_Send_Byte(ReadAddr%256);   //发送低地址

IIC_Wait_Ack();                 

IIC_Start();              //再次产生一个起始信号

IIC_Send_Byte(0XA1);           //发送器件地址,末位为1代表读数据进入接收模式    

IIC_Wait_Ack();  

  temp=IIC_Read_Byte(0);    

  IIC_Stop();//产生一个停止条件     

return temp;

}


关于ReadAddr%256和ReadAddr/256也是为了兼容容量大的AT24C系列芯片,具体在前面写操作时有写,这里就不再赘述了。

推荐阅读

史海拾趣

Alcatel-Lucent公司的发展小趣事
  1. Alcatel-Lucent 的起源可以追溯到 19 世纪末的法国。1880 年,一家名为 Compagnie Générale d'Électricité (CGE) 的公司在法国成立,主要从事电信和电气设备的制造和销售。这家公司后来成为了 Alcatel-Lucent 的前身之一。

  2. 20 世纪初,CGE 开始涉足电信领域,并开始在法国和国际市场上发展。该公司逐渐成为了一家领先的电信设备制造商,并参与了许多重要的电信基础设施项目。

  3. 2006 年,法国的 Alcatel 和美国的 Lucent Technologies 公司宣布合并,成立了 Alcatel-Lucent 公司。这次合并创造了一个综合性的电信设备制造商,覆盖了通信网络、软件和服务等多个领域。

  4. 合并后,Alcatel-Lucent 成为了全球领先的电信设备供应商之一,为全球各地的电信运营商提供了广泛的产品和解决方案,包括固定和移动网络、光纤通信、宽带接入和数据中心等领域。

  5. 在成立后的几年里,Alcatel-Lucent 继续推出创新的产品和技术,包括下一代移动通信技术 LTE、IP/MPLS 网络和云计算解决方案等,为数字化时代的通信基础设施发展做出了重要贡献。

圣邦微电子(Fangtek)公司的发展小趣事

厦门法拉电子(Faratronic)公司的发展故事

故事一:初创与转型

厦门法拉电子的故事始于1955年,当时它以竹器合作社的形式创立。随着时代的变迁,公司在1967年敏锐地捕捉到了薄膜电容器市场的潜力,开始涉足这一领域,正式步入电子行业。这一转型为公司未来的发展奠定了坚实的基础。1970年,为了更加专业化的发展,公司更名为厦门市电容器厂,进一步明确了发展方向。通过不断的努力,法拉电子逐渐在薄膜电容器领域崭露头角。

故事二:技术引进与自动化生产

1983年是法拉电子发展历程中的一个重要节点。这一年,公司引进了国外先进的技术和设备,实现了生产过程的自动化。这一举措不仅显著提高了生产效率,还使得产品质量得到了大幅提升。自动化生产的实现,让法拉电子在竞争激烈的市场中更具优势,为其后续的发展提供了强有力的支持。

故事三:铝金属化膜的创新

1994年,法拉电子再次迈出了关键一步,成功开发出铝金属化膜。这一创新不仅使得公司的产品线得以向上游延伸,还显著缩短了电容器产品的交货时间。铝金属化膜的推出,进一步巩固了法拉电子在薄膜电容器行业的市场地位,为其后续的市场扩张奠定了坚实的基础。同年,公司更名为厦门市法拉发展总公司,标志着其业务规模和战略的升级。

故事四:股份制改革与上市

1998年,法拉电子进行了股份制改革,正式转变为厦门法拉电子股份有限公司。这一改革标志着公司正式迈入了现代化企业的新阶段。2002年,法拉电子的股票在上海证券交易所成功挂牌上市,实现了资本市场的突破。上市不仅为公司筹集到了更多的发展资金,还提升了公司的知名度和品牌影响力,为其后续的发展注入了新的动力。

故事五:全球化市场布局

进入21世纪后,法拉电子开始积极布局全球化市场。公司凭借优质的产品和服务,赢得了全球客户的认可。特别是在新能源汽车和光伏领域,法拉电子的市场份额不断扩大。2009年,公司搬迁至海沧新区,进一步提升了生产能力和研发实力。目前,法拉电子已成为全球薄膜电容器行业的领先者,产品广泛应用于照明、通讯、家电、工业控制、汽车电子等多个领域,为全球客户提供了一站式的解决方案。

恒连电子(EVERCOM)公司的发展小趣事

恒连电子成立于XX年代初,当时正值电子行业的快速发展期。创始人张先生凭借对电子技术的敏锐洞察力和对市场趋势的精准把握,决定投身于电子行业。然而,初创时期的公司面临着资金短缺、技术团队匮乏以及市场竞争激烈等多重挑战。张先生带领团队日夜兼程,通过自主研发和不断创新,逐渐在市场中站稳脚跟。他们首先推出了几款性能稳定、价格合理的电子产品,赢得了客户的信赖。随着产品的逐步推广,恒连电子逐渐在市场中打开了局面。

旌芯半导体(GN)公司的发展小趣事

在恒连电子的发展历程中,技术突破和产品创新始终是公司发展的核心动力。公司投入大量资金和资源进行技术研发,不断推出具有竞争力的新产品。其中,一款具有自主知识产权的智能芯片成为了公司的明星产品,不仅提升了产品的整体性能,还为公司带来了可观的利润。此外,恒连电子还注重产品的多元化发展,不断拓展产品线,满足市场的多样化需求。

EZchip Technologies Ltd公司的发展小趣事

作为一家领先的电子企业,EZchip深知自己在推动社会进步和可持续发展方面所肩负的责任。因此,公司一直致力于环境保护、社会公益和可持续发展等方面的工作。EZchip通过采用环保材料和节能技术降低生产过程中的能耗和排放;积极参与社会公益活动回馈社会;同时注重企业的可持续发展规划和管理模式的创新。这些举措不仅体现了公司的社会责任感和担当精神也为企业赢得了良好的社会声誉和品牌形象。

歌普(GEPU)公司的发展小趣事

作为一家领先的电子企业,EZchip深知自己在推动社会进步和可持续发展方面所肩负的责任。因此,公司一直致力于环境保护、社会公益和可持续发展等方面的工作。EZchip通过采用环保材料和节能技术降低生产过程中的能耗和排放;积极参与社会公益活动回馈社会;同时注重企业的可持续发展规划和管理模式的创新。这些举措不仅体现了公司的社会责任感和担当精神也为企业赢得了良好的社会声誉和品牌形象。

问答坊 | AI 解惑

关于监控用的摄像头用的LED是什么样的?

遥控器用的红外LED,因为红外LED发出的光不完全是红外光,也包含部分的可见光(红色)成分,所以肉眼能看到少许光。遥控器使用的LED,一般发射角度是30度左右,用户即使没有完全对准目标,也能有效操作。在没有外界红外线干扰的时候,遥控距离可以 ...…

查看全部问答>

AVR 单片机指令指令

最全的AVR 单片机指令指令…

查看全部问答>

几十种AD/DA装换芯片资料

如题[local]1[/local] [ 本帖最后由 美目如初 于 2009-8-31 23:24 编辑 ]…

查看全部问答>

wince安全性问题

在wince 6.0中我有一个客户端程序,先后两次调用InitializeSecurityContext用于和google服务器端进行安全认证,第一次调用返回的是SEC_I_CONTINUE_NEEDED,第二次返回的是SEC_E_WRONG_PRINCIPAL,请问怎么解决啊?是不是和证书有关系?相同程序在wi ...…

查看全部问答>

PB的编译问题

新装的WIN XP SP2, 番茄花园, 然后装PB5.0, 先装.net framework 1.1, 然后装PB5.0(CPU选择了ARMV4I, X86, Emulator). PB5.0 装好之后,就新建工程编译了,这时EVC, VS2005等都还没有装. 用自带的2410BSP新建工程编译的时候出现错误: \"Invalid  ...…

查看全部问答>

出售代购各种电子元件,欢迎各位来捧场

各位有需要电子元件的请和我联系,库存商品优惠啦!:D 小店欢迎您的光临 石家庄傲尔科技有限公司是一家专注于国外中小电子工程分包商,经过多年的发展,我公司与国际大的元件供应商如MOUSER, DIGIKEY建立了稳定的合作。 我们的优势:1. 保证 ...…

查看全部问答>

讲了那么多技术,有没有导购的?

                                 要1K STM32f103c8T6,找谁?…

查看全部问答>

串口初始化影响步进电机工作?

void main(){      init_serialcom();   //步进电机不能有这个函数,这是一个初始化串口的函数,  ATE0();    //步进电机也不能有这个函数,这是个向串口发送AT指令的函数。    为什么去掉这前两个函 ...…

查看全部问答>

u8 sd_raw_get_info(struct sd_raw_info* info)中struct怎么理解

u8 sd_raw_get_info(struct sd_raw_info* info) { …… } 这个子程序怎么用啊,像u8 mmcWrite(u32 sector, u8* buffer)这种,我在主程序中只要定义unsigned char SD_Write1[]={\"0123456789\"}; 就可以用了mmcWrite(SD_Write1); 但是这个定义 ...…

查看全部问答>

MSP430AFE253的SD24使用问题

SD24的SD24CCTLx寄存器 SD24GRP 位  SD24_A group. Groups SD24_A channel with next higher channel. Not used for the last channel. 如何使用该位?…

查看全部问答>