基本信息
文件名称:Microchip 系列:PIC18 系列_(10).I2C和SPI通信.docx
文件大小:21.87 KB
总页数:14 页
更新时间:2025-06-23
总字数:约7.16千字
文档摘要

PAGE1

PAGE1

I2C和SPI通信

I2C通信

I2C(Inter-IntegratedCircuit)是一种简单、双向、两线制的串行通信协议,常用于连接单片机和各种低速外设。I2C总线由两根信号线组成:SCL(串行时钟线)和SDA(串行数据线)。这些信号线通常连接到内部上拉电阻,以确保在没有设备驱动时总线处于高电平状态。

I2C总线特性

多主控器架构:I2C总线允许多个主控器同时存在,但同一时间只能有一个主控器进行通信。

地址识别:每个连接到I2C总线的设备都有一个唯一的7位或10位地址。

数据传输速率:标准模式下为100kbps,快速模式下为400kbps,高速模式下为3.4Mbps。

双向数据传输:数据可以在主控器和从设备之间双向传输。

多从设备:一个主控器可以连接多个从设备,通过地址进行选择。

I2C操作模式

主控模式:主控器负责启动通信,生成时钟信号并控制数据传输。

从设备模式:从设备响应主控器的请求,接收或发送数据。

I2C通信时序

起始条件:SCL线为高电平时,SDA线从高电平变为低电平。

停止条件:SCL线为高电平时,SDA线从低电平变为高电平。

数据传输:数据在SCL时钟的低电平期间改变,在高电平期间保持稳定。

应答:每个字节传输后,从设备需要发送一个应答信号(ACK)。

I2C编程实例

以下是使用PIC18系列单片机进行I2C通信的示例代码。假设我们使用的是PIC18F4550单片机,连接一个I2C从设备(例如温度传感器)。

#includepic18f4550.h

#includedelays.h

#includei2c.h

//定义I2C时钟频率

#defineI2C_CLOCK100000

//定义从设备地址

#defineTEMP_SENSOR_ADDRESS0x48

//初始化I2C

voidI2C_Init(){

TRISC3=1;//SCL作为输入

TRISC4=1;//SDA作为输入

SSPCON1=0//I2C主控模式,时钟控制

SSPCON2=0//初始化SSPCON2

SSPSTAT=0//数据传输在SCL低电平期间进行

SSPADD=(unsignedchar)(_XTAL_FREQ/(4*I2C_CLOCK)-1);//设置I2C时钟频率

SSPCON1bits.SSPEN=1;//启用I2C

}

//I2C起始条件

voidI2C_Start(){

SEN=1;//发送起始条件

while(SEN);//等待起始条件完成

}

//I2C停止条件

voidI2C_Stop(){

PEN=1;//发送停止条件

while(PEN);//等待停止条件完成

}

//I2C写数据

voidI2C_Write(unsignedchardata){

I2C_Start();//发送起始条件

I2C_WriteByte(TEMP_SENSOR_ADDRESS1);//发送从设备地址和写操作标志

I2C_WriteByte(data);//发送数据

I2C_Stop();//发送停止条件

}

//I2C读数据

unsignedcharI2C_Read(){

unsignedchardata;

I2C_Start();//发送起始条件

I2C_WriteByte((TEMP_SENSOR_ADDRESS1)|1);//发送从设备地址和读操作标志

data=I2C_ReadByte(1);//读取数据,最后一个字节发送NACK

I2C_Stop();//发送停止条件

returndata;

}

//主函数

voidmain(){

OSCCON=0//设置内部振荡器为48MHz

ADCON1=0//设置所有I/O为数字模式

I2C_Init();//初始化I2C

while(1){

unsignedchartemp=I2C_Read();//