基本信息
文件名称:Microchip 系列:AVR 系列 (基于 ATmega328P)_12.I2C通信.docx
文件大小:26.86 KB
总页数:25 页
更新时间:2025-06-17
总字数:约1.24万字
文档摘要

PAGE1

PAGE1

12.I2C通信

12.1I2C通信基础

I2C(Inter-IntegratedCircuit)是一种串行通信协议,最初由Philips(现NXP)公司开发,用于在集成电路之间进行短距离、低速率的通信。I2C协议使用两条线进行通信:一条数据线(SDA)和一条时钟线(SCL)。这种简单的两线通信方式使得I2C在多种嵌入式系统中广泛应用,包括传感器、存储器、显示屏等外设。

I2C协议支持多主控设备和多从设备,每个设备都有一个唯一的7位或10位地址。主设备通过发起通信并控制时钟线来与其他从设备进行数据交换。I2C通信的最大优点是其简洁性和可靠性,适用于多种低速通信场景。

12.2ATmega328P的I2C模块

ATmega328P内置了TWI(Two-WireInterface)模块,可以实现I2C通信。TWI模块包括以下主要寄存器:

TWBR:TWI比特率寄存器,用于设置通信速度。

TWSR:TWI状态寄存器,用于存储当前的通信状态。

TWAR:TWI地址寄存器,用于设置从设备的地址。

TWDR:TWI数据寄存器,用于读取和写入数据。

TWCR:TWI控制寄存器,用于控制TWI的操作。

12.3I2C通信的配置

要使用ATmega328P的TWI模块进行I2C通信,需要进行以下配置:

使能TWI模块:通过设置TWCR寄存器的TWEN位来使能TWI模块。

设置通信速度:通过TWBR寄存器设置通信速度。I2C的通信速度通常为100kHz或400kHz。

设置从设备地址:对于从设备,需要通过TWAR寄存器设置其地址。

以下是一个示例代码,展示了如何配置TWI模块:

#includeavr/io.h

#includeutil/delay.h

#defineI2C_BIT_RATE100000//100kHz

#defineF_CPUL//16MHz

voidi2c_init(){

//设置TWI的波特率

TWBR=(F_CPU/I2C_BIT_RATE-16)/2;

//使能TWI模块

TWCR=(1TWEN);

}

voidi2c_start(){

//发送启动信号

TWCR=(1TWSTA)|(1TWEN)|(1TWINT);

//等待启动信号完成

while(!(TWCR(1TWINT)));

}

voidi2c_stop(){

//发送停止信号

TWCR=(1TWSTO)|(1TWEN)|(1TWINT);

//等待停止信号完成

while(TWCR(1TWSTO));

}

voidi2c_write(uint8_tdata){

//将数据写入TWDR寄存器

TWDR=data;

//发送数据并清除TWINT标志

TWCR=(1TWEN)|(1TWINT);

//等待传输完成

while(!(TWCR(1TWINT)));

}

uint8_ti2c_read_ack(){

//读取数据并发送ACK

TWCR=(1TWEN)|(1TWEA)|(1TWINT);

//等待读取完成

while(!(TWCR(1TWINT)));

//返回读取的数据

returnTWDR;

}

uint8_ti2c_read_nack(){

//读取数据并发送NACK

TWCR=(1TWEN)|(1TWINT);

//等待读取完成

while(!(TWCR(1TWINT)));

//返回读取的数据

returnTWDR;

}

uint8_ti2c_get_status(){

//获取TWI状态寄存器的值

returnTWSR0xF8;

}

voidi2c_wait(){

//等待TWI操作完成

while(TWCR(1TWSTO));

}

voidi2c_set_slave_address(uint8_taddress){

//设置从设备地址

TWAR=