PIC单片机程序设计:I2C总线应用实战,轻松连接各种设备
发布时间: 2024-07-09 13:48:14 阅读量: 35 订阅数: 40
![PIC单片机程序设计:I2C总线应用实战,轻松连接各种设备](https://img-blog.csdnimg.cn/c3437fdc0e3e4032a7d40fcf04887831.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiN55-l5ZCN55qE5aW95Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
# 1. PIC单片机I2C总线简介
I2C总线(Inter-Integrated Circuit Bus)是一种串行通信总线,广泛应用于连接微控制器和各种外围设备。它具有以下特点:
* **简单易用:**仅需要两条信号线(时钟线SCL和数据线SDA),无需复杂的硬件电路。
* **低成本:**由于其简单的设计,I2C总线接口电路的成本相对较低。
* **高可靠性:**I2C总线采用半双工通信方式,并具有完善的错误检测和纠正机制,确保数据传输的可靠性。
# 2. I2C 总线通信原理
### 2.1 I2C 总线特性和协议
I2C 总线是一种串行通信协议,具有以下特性:
* **半双工通信:**总线上的数据只能在同一时间点由一个设备发送或接收。
* **多主设备:**总线上可以有多个主设备,但一次只能有一个主设备控制总线。
* **从设备寻址:**每个从设备都有一个唯一的 7 位地址,用于在总线上进行寻址。
* **数据位:**每个数据位由 8 位组成,包括一个起始位、一个停止位和 6 个数据位。
* **传输速率:**I2C 总线的传输速率通常在 100 kbps 到 400 kbps 之间。
I2C 总线协议规定了数据传输的格式和过程:
1. **起始条件:**主设备发送一个起始条件,由一个起始位 (0) 组成。
2. **从设备地址:**主设备发送从设备的 7 位地址,后面跟一个读/写位 (0 为写,1 为读)。
3. **应答:**从设备通过发送一个应答位 (0) 来确认接收。
4. **数据传输:**主设备发送或接收数据,每次传输 8 位。
5. **停止条件:**主设备发送一个停止条件,由一个停止位 (1) 组成。
### 2.2 主从设备通信流程
I2C 总线上的通信过程涉及主设备和从设备之间的交互:
**主设备发送数据:**
1. 主设备发送起始条件。
2. 主设备发送从设备地址和写位。
3. 从设备发送应答位。
4. 主设备发送数据。
5. 主设备发送停止条件。
**主设备接收数据:**
1. 主设备发送起始条件。
2. 主设备发送从设备地址和读位。
3. 从设备发送应答位。
4. 从设备发送数据。
5. 主设备发送应答位。
6. 主设备发送停止条件。
**从设备发送数据:**
1. 从设备检测到其地址被寻址。
2. 从设备发送应答位。
3. 主设备发送数据。
4. 从设备接收数据。
5. 主设备发送应答位。
6. 从设备发送停止条件。
**从设备接收数据:**
1. 从设备检测到其地址被寻址。
2. 从设备发送应答位。
3. 主设备发送数据。
4. 从设备接收数据。
5. 从设备发送应答位。
6. 主设备发送停止条件。
# 3. PIC单片机I2C总线编程
### 3.1 I2C总线初始化和配置
在使用PIC单片机进行I2C总线通信之前,需要对I2C总线进行初始化和配置。初始化主要包括设置时钟频率、SCL和SDA引脚配置、中断使能等。
#### 1. 时钟频率设置
I2C总线通信的时钟频率通常在100kHz至400kHz之间。PIC单片机中,时钟频率通过寄存器`SSPCON1`的`SSPM<3:0>`位进行设置。不同时钟频率的设置如下:
| SSPM<3:0> | 时钟频率 |
|---|---|
| 0000 | FOSC / 4 |
| 0001 | FOSC / 16 |
| 0010 | FOSC / 64 |
| 0011 | FOSC / 128 |
| 0100 | FOSC / 256 |
| 0101 | FOSC / 512 |
| 0110 | FOSC / 1024 |
| 0111 | FOSC / 2048 |
| 1000 | FOSC / 4096 |
| 1001 | FOSC / 8192 |
| 1010 | FOSC / 16384 |
| 1011 | FOSC / 32768 |
| 1100 | FOSC / 65536 |
| 1101 | FOSC / 131072 |
| 1110 | FOSC / 262144 |
| 1111 | FOSC / 524288 |
#### 2. SCL和SDA引脚配置
SCL和SDA引脚是I2C总线通信的时钟线和数据线。在PIC单片机中,SCL和SDA引脚通常配置为开放漏极输出模式。
```c
TRISC3 = 0; // SCL引脚设置为输出
TRISC4 = 0; // SDA引脚设置为输出
```
#### 3. 中断使能
I2C总线通信可以通过中断方式进行处理。在PIC单片机中,I2C总线中断通过寄存器`SSPCON1`的`SSPIE`位使能。
```c
SSPCON1bits.SSPIE = 1; // 使能I2C总线中断
```
### 3.2 主设备读写操作
作为主设备,PIC单片机可以向从设备发送数据或从从设备接收数据。
#### 1. 发送数据
主设备发送数据时,需要先发送从设备的地址和读/写标志位。
```c
// 发送从设备地址和读/写标志位
SSPBUF = (slave_address << 1) | 0; // 0表示写操作
```
然后,主设备可以发送数据。
```c
// 发送数据
SSPBUF = data;
```
#### 2. 接收数据
主设备接收数据时,需要先发送从设备的地址和读/写标志位。
```c
// 发送从设备地址和读/写标志位
SSPBUF = (slave_address << 1) | 1; // 1表示读操作
```
然后,主设备可以接收数据。
```c
// 接收数据
data = SSPBUF;
```
### 3.3 从设备读写操作
作为从设备,PIC单片机可以接收主设备发送的数据或向主设备发送数据。
#### 1. 接收数据
从设备接收数据时,需要先检测从设备地址是否与自己匹配。
```c
if (SSPBUF == (slave_address << 1)) {
// 接收数据
data = SSPBUF;
}
```
#### 2. 发送数据
从设备发送数据时,需要等待主设备发送读/写标志位。
```c
if (SSPSTATbits.R_W == 0) {
// 发送数据
SSPBUF = data;
}
```
# 4. I2C总线实战应用
### 4.1 I2C总线连接外部EEPROM
**应用场景:**
当PIC单片机需要存储大量数据时,其内部存储空间往往不够用,此时可以利用外部EEPROM来扩展存储容量。EEPROM是一种非易失性存储器,即使断电后也能保存数据。
**连接方式:**
I2C总线连接外部EEPROM的原理图如下:
```mermaid
graph LR
subgraph PIC
```
0
0