- 什么是I2C通信协议?
- I2C通信如何工作?
- 在哪里使用I2C通信?
- Nuvoton N76E003上的I2C-硬件要求
- AT24LC64与Nuvoton N76E003的接口–电路图
- Nuvoton N76E003上的I2C引脚
- N76E003中的I2C通信
- 为I2C通讯编程N76E003
- 刷新代码和输出
在庞大的嵌入式应用系统中,没有微控制器可以独自执行所有活动。在某个时间阶段,它必须与其他设备进行通信以共享信息,有许多 不同类型的通信协议 可以共享这些信息,但最常用的是 USART,IIC,SPI和CAN。每个通信协议都有其自身的优点和缺点。现在让我们专注于 IIC部分 ,因为这是我们将在本教程中学习的内容。如果您是新手,请查看Nuvoton教程,其中从最基础的入门教程中讨论了N76E003微控制器的每个外围设备。如果您想学习如何将I2C与其他微控制器一起使用,可以查看以下链接。
- 如何在Arduino中使用I2C:两个Arduino板之间的通信
- 与PIC单片机PIC16F877的I2C通信
- 使用I2C将16X2 LCD与ESP32接口
- 与MSP430启动板的I2C通信
- 在不使用I2C的情况下将LCD与NodeMCU接口
- 如何在Arduino的单个程序中处理多重通信(I2C SPI UART)
I2C是飞利浦(现在为NXP)开发的重要通信协议。使用此I2C协议,MCU可以与多个设备连接并开始通信。I2C仅使用两条线工作,即SDA和SCL。其中SDA代表串行数据,SCL代表串行时钟。但是,这两个引脚需要上拉电阻至VCC电压电平,并且具有足够的上拉电阻,总线可以支持127个具有唯一地址的设备。
什么是I2C通信协议?
IIC一词代表“内部集成电路”。在某些地方,它通常表示为I2C或I平方C或什至表示为2线接口协议(TWI),但它们的含义相同。I2C是同步通信协议,这意味着共享信息的两个设备必须共享一个公共时钟信号。它只有两条线可以共享信息,其中一条用于时钟信号,另一条用于发送和接收数据。
I2C通信如何工作?
I2C通信最初是由Phillips引入的。如前所述,它有两条线,这两条线将跨两个设备连接。在这里,一个设备称为 主机 ,另一设备称为 从机。通讯应该并且将始终在两个主机之间进行通信 。I2C通信的优势在于,一个主设备可以连接多个从设备。
完整的通信通过这两条线进行,即串行时钟(SCL)和串行数据(SDA)。
串行时钟(SCL): 与从机共享主机产生的时钟信号
串行数据(SDA): 在主机和从机之间发送数据。
在任何给定时间,只有主站才可以启动通信。由于总线中有多个从站,因此主站必须使用不同的地址引用每个从站。当被寻址时,只有具有该特定地址的从属才会回复该信息,而其他人则保持安静。这样,我们可以使用同一条总线与多个设备进行通信。
在哪里使用I2C通信?
I2C通信仅用于 短距离通信。它一定程度上是可靠的,因为它具有同步时钟脉冲以使其更智能。该协议主要用于与必须向主机发送信息的传感器或其他设备进行通信。当微控制器必须使用最少的电线与许多其他从模块通信时,这非常方便。如果您正在寻找远程通讯,则应尝试RS232;如果您正在寻找更可靠的通讯,则应尝试SPI协议。
Nuvoton N76E003上的I2C-硬件要求
由于该项目的要求是使用N76E003学习I2C通信,因此我们将使用与I2C数据线连接的EEPROM。我们将一些数据存储到EEPROM中,并读取它们并使用UART屏幕显示。
由于存储的值将打印在UART中,因此需要任何类型的USB到UART转换器。如果您不熟悉N76E003上的UART通信,还可以通过Nuvoton查看有关UART的教程。对于我们的应用,我们将使用CP2102 UART转USB转换器。除上述内容外,我们还需要以下组件:
- EEPROM 24C02
- 2个4.7k电阻
更不用说,除了上述组件之外,我们需要基于N76E003微控制器的开发板以及Nu-Link编程器。此外,还需要面包板和连接线来连接所有组件。
AT24LC64与Nuvoton N76E003的接口–电路图
如下图所示,EEPROM与两个上拉电阻一起连接在I2C线路中。最左侧显示了编程接口连接。
我为AT24LC64 IC使用了一块面包板,并使用跳线将该IC连接到了我的nuvoton编程器板上。我的硬件设置以及nu-ink编程器如下所示。
Nuvoton N76E003上的I2C引脚
N76E003的引脚图如下图所示:
如我们所见,每个引脚具有不同的规格,每个引脚可用于多种用途。但是,引脚1.4用作I2C SDA引脚,它将失去PWM和其他功能。但这不是问题,因为该项目不需要其他功能。对于P1.3,同样的事情也会发生,即I2C的SCL引脚。
由于I2C引脚充当GPIO,因此需要对其进行配置。可以在以下模式下配置所有GPIO引脚。
根据数据表PxM1.n和PxM2。n是两个寄存器,用于确定I / O端口的控制操作。在数据手册中,声明了要使用I2C功能,需要将I / O模式用作I2C相关通信的漏极开路。
N76E003中的I2C通信
对于支持I2C功能的任何微控制器单元而言,I2C外设都是一件重要的事情。内置的I2C外设附带了许多不同类型的微控制器。但是,在某些情况下,可以在无法提供与I2C相关的硬件支持的情况下,使用软件控制来手动配置I2C(例如,许多8051微控制器)。但是,nuvoton N76E003带有I2C外设支持。
M76E003在I2C模式下支持四种类型的操作-主发送器,主接收器,从发送器和从接收器。它还支持I2C线路的标准(100kbps)和快速(最高400kbps)速度。I2C在SCL和SDA信号线中使用的通用规则很少。
启动和停止条件:
在I2C通讯中,这很重要。当数据传输到I2C线时,它以开始条件开始,以停止条件结束。
当SCL线为高电平时,开始条件是SDA上的高到低过渡,而当SCL线为高电平时,终止条件是SDA上的从低到高过渡。这两个条件是由主机(MCU或控制其他从机的任何设备)生成的。起始条件启动时,总线在该状态下保持繁忙,而终止条件启动时,总线再次保持空闲。
N76E003数据表的信号透视图中很好地显示了启动和停止条件,
具有数据格式的7位地址:
N76E003支持7位地址和数据格式。启动条件启动后,主设备需要将数据发送到I2C线路。第一个数据很重要。如果未正确创建或传输该数据,将无法识别所连接的设备,并且无法进行进一步的通信。
数据由一个7位长的从机地址组成,表示为SLA。如果总线上连接了多个设备,则该7位长地址对于每个设备都必须是唯一的。在7位地址之后,第8位是数据方向位。这意味着,根据第8位,主机将有关是将数据写入从设备还是要从从设备读取数据的信息发送到从设备。第8位是R / W位,称为读或写通知器。众所周知,8位信息可以是128种类型,因此支持128种设备,但是I2C在同一总线上支持127种类型的设备,但不支持128种。因为0x00地址是保留地址,称为通用调用地址。如果主机要向所有设备发送信息,它将寻址为0x00,并且每个设备将按照与各个软件配置相同的方式进行重放。
因此,数据传输如下所示-
确认:
在上面的数据地址图中,第9位紧随R / W位被称为确认位。这一点很重要,因为使用该位,主机或从机通过将SDA线拉低来响应数据发送器。为了获得确认位,发送器需要释放SDA线。
为I2C通讯编程N76E003
本教程中使用的完整程序可以在页面底部找到。代码中重要部分的解释如下:
将引脚设置为漏极开路并将其配置为I2C:
让我们先从I2C引脚部分开始。如前所述,需要配置I2C SCL和SDA端口并将其设置为漏极开路配置。为此,我们使用 I2C.h头文件 以及 I2C.c源文件 。该代码段如下所示:
做{P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} while(0)
上面的代码将P13和P14设置为漏极开路引脚,而 clr_I2CPX 用于选择P13和P14作为P1.3上的SCL引脚和P1.4上的SDA引脚。
该I2CPX是I2C控制寄存器I2CON的第0位。如果将此 I2C_PX 设置为1,则将引脚更改为SCL的P0.2和SDA的P1.6。但是,我们将使用P13和P14。此处不使用其他引脚。
I2C控制寄存器I2CON:
I2C控制寄存器I2CON用于控制I2C操作。第一位是I2C引脚选择位。设置为0会将I2C引脚配置为P13和P14。
AA位是应答确认标志,如果设置了AA标志,则在SCL线的应答时钟脉冲期间将返回ACK。如果清除该位,则在SCL线的确认时钟脉冲期间将返回NACK(SDA上的高电平)。
下一位是SI,它是I2C状态中断。如果使能了I2C状态中断,则用户应检查I2STAT寄存器以确定已通过哪一步,并应采取措施。
STO是在主模式下设置的STOP标志。一旦检测到 STOP 条件,硬件就会自动清除STO 。
下一位是STA位。如果设置了该标志,则在总线空闲时I2C会产生一个START条件。如果总线繁忙,则I2C等待STOP条件并随后产生START条件。如果在I2C已经处于主模式下并且已发送或接收一个或多个字节时设置了STA,则I2C会产生重复的START条件。STA需要通过软件手动清除。
最后一个I2CEN是I2C总线使能或禁用位。
EEPROM 24C02:
现在,来到24C02。N76E003的板级支持程序包具有用于24LC64的I2C代码,可以轻松修改。但是,我们将使用一种简单的方法来理解I2C功能。
如果有人想使用与EEPROM 24C02的详细接口,则可以使用BSP中的EEPROM程序。
我们只会在I2C中连接24C02,其中N76E003将为主设备,而EEPROM将为从设备。因此,我们将任何数据写入EEPROM地址并读取。
24C02 EEPROM引脚排列如下所示-
A0,A1和A2是三个地址选择引脚。WP引脚是写保护引脚,需要与VSS连接以使能写入EEPROM。
字节写入功能如下图所示:
完整的写周期从起始位开始。之后,需要提交控制字节。在控制字节中,需要执行以下操作:
在起始位之后,由从机地址组成。1010是静态地址,A0,A1和A2是基于硬件连接的地址。如果三个引脚连接到GND或VSS电源,则读为0。否则,如果连接VCC,则读为1。因此,所有这些将为0。
花费在读取或写入条件上。带有读或写位的地址值将为-0xA0(写)和0xA1(读)。接下来是应答位,此后,将发送一个8位地址,该地址需要存储数据,最后将数据存储在相应的位置。这些功能在主功能中按逐步格式进行。
主要功能和While循环:
void main(void){char c = 0x00; InitialUART0_Timer3(115200); TI = 1;//重要的是,使用prinft函数必须设置TI = 1;I2C_init(); while(1){EEPROM_write(1,0x55); c = EEPROM_read(1); printf(“ \ n读取的值为%x”,c和0xff);}; }
主要功能很简单,它是将值连续写入地址1中的EEPROM并读取数据。然后使用printf函数打印数据。printf以十六进制打印值。
EEPROM写入功能由EEPROM部分中所述的以下内容组成-
void EEPROM_write(无符号字符地址,无符号字符值){I2C_start(); I2C_write(0xA0); I2C_write(地址); I2C_write(value); I2C_stop(); }
I2C启动功能包括以下内容:
I2C_start(void){signed int time = timeout; set_STA; clr_SI; while(((SI == 0)&&(time> 0)){时间-; }; }
在此功能中,将检查SI状态以及预定义的超时时间(在I2C.h中定义,其中预定义时间设置为1000)。启动功能从设置STA和清除SI开始。
I2C_stop(void){signed int time = timeout; clr_SI; set_STO; while(((STO == 1)&&(time> 0)){时间-; }; }
与开始,停止功能相同。该 停止 功能是通过设置STO,然后清除SI启动。以下功能是I2C读取功能-
无符号字符I2C_read(unsigned char ack_mode){signed int time = timeout; 无符号字符值= 0x00; set_AA; clr_SI; while((SI == 0)&&(t> 0)){时间-; }; 值= I2DAT; if(ack_mode == I2C_NACK){t =超时计数;clr_AA; clr_SI; while((SI == 0)&&(t> 0)){时间-; }; }返回值;}
的 ack_mode 和 I2C_NACK ,两者都在I2C头文件中定义为分别为0和1。
同样,写函数是创建的-
I2C_write(unsigned char value){signed int time = timeout; I2DAT =值;clr_STA; clr_SI; while(((SI == 0)&&(time> 0)){时间-; }; }
刷新代码和输出
该代码返回了0警告和0错误,并由Keil使用默认的闪烁方法进行了闪烁。如果您是新手,请查看nuvoton入门教程,以了解如何上传代码。代码的编译信息可以在下面找到。
编译目标'I2C_EEPROM'编译I2C_EEPROM.c…编译I2C.c…链接…程序大小:data = 59.2 xdata = 0 code = 2409从“。\ Output \ I2C_EEPROM”…创建十六进制文件。\ Output \ I2C_EEPROM“-0错误,0警告。构建时间已过:00:00:04批处理构建摘要:1成功,0失败,0跳过-时间已过:00:00:04
该硬件正在面包板上设置,并且可以按预期工作。如下图所示,我们能够在EEPROM上写入一个值,然后从存储器中读取该值,并将其显示在串行监视器上。
观看下面提供的视频,以完整展示该代码板如何工作。希望您喜欢本教程,并从中学到了一些有用的东西,如果您有任何疑问,请将其留在下面的评论部分。您还可以使用我们的论坛来发布其他技术问题。