stc32g12k128 iic
时间: 2025-05-24 12:52:55 浏览: 25
### STC32G12K128 单片机 IIC 通信教程及代码示例
#### IIC 总线简介
IIC(Inter-Integrated Circuit)是一种两线制同步串行总线,用于短距离通信。它由 SDA 数据线和 SCL 时钟线组成[^1]。与 SPI 不同的是,IIC 只能在一个时刻执行发送或接收操作,而无法同时完成两者。
#### 主要功能描述
IIC 的基本通信过程包括起始信号、停止信号、数据传输以及 ACK/NACK 应答机制。这些构成了完整的 IIC 通信流程。
#### 硬件配置
对于 STC32G12K128 芯片,在使用硬件 IIC 功能前需设置 `P_SW2` 寄存器来选择引脚分配[^1]。具体实现方式可参考芯片的数据手册。
#### 初始化函数
初始化 IIC 接口通常通过调用特定的库函数完成。以下是基于 STC32G12K128 平台的一个典型初始化函数:
```c
void I2C_Init(I2C_InitTypeDef *I2Cx) {
// 配置 I2C 参数
I2Cx->ClockSpeed = 100000; // 设置波特率为 100kHz
I2Cx->DutyCycle = I2C_DUTYCYCLE_2; // 定义占空比为 2:1
I2Cx->Ack = I2C_ACK_ENABLE; // 启用应答位
I2Cx->AckAddrHeader = I2C_ACKADDRHEADER_7BIT;
I2Cx->OwnAddress1 = 0x00; // 设备地址设为空
}
```
此部分定义了 IIC 工作参数并启用了必要的特性,如应答功能等[^2]。
#### 发送/接收数据
为了简化应用开发工作量,开发者可以直接利用封装好的 API 来处理复杂细节。下面展示如何向目标设备写入多个字节数据:
```c
void I2C_WriteNbyte(u8 addr, u8 *p, u8 number) {
while (number--) {
I2C_Start(); // 发送启动条件
I2C_SendByte(addr << 1); // 发送从机地址加写命令
I2C_WaitAck(); // 等待确认信号
I2C_SendByte(*p++); // 发送当前指针指向的内容
I2C_WaitAck();
}
I2C_Stop(); // 结束通讯会话
}
u8 I2C_ReadNbyte(u8 addr, u8 *p, u8 number) {
I2C_Start(); // 开始读取序列
I2C_SendByte((addr << 1) | 1);
I2C_WaitAck();
while (--number > 0) { // 循环读取除最后一项外的所有项目
*p++ = I2C_ReceiveByte();
I2C_Acknowledge(); // 返回 ACK 表明还有后续请求
}
*p = I2C_ReceiveByte(); // 获取最后一个字节
I2C_NoAcknowledge(); // 告知对方不再继续获取新数据包
I2C_Stop(); // 终止事务链路
return SUCCESS;
}
```
以上片段展示了标准模式下连续写入和批量读回的操作方法[^2]。
#### EEPROM 示例扩展
如果计划访问内置 EEPROM,则可以借助如下辅助工具类接口:
```c
unsigned char eepromRead(unsigned int address){
unsigned char data;
I2C_Start();
I2C_SendByte(STC_EEPROM_START_ADDR >> 1); // 将高位作为控制码发出
I2C_WaitAck();
I2C_SendByte(address & 0xFF); // 提供低位索引位置
I2C_WaitAck();
I2C_RepeatedStart(); // 进入重复开始状态以便切换方向至输入端
I2C_SendByte((STC_EEPROM_START_ADDR>>1)|1);
I2C_WaitAck();
data=I2C_ReceiveByte();
I2C_NoAcknowledge(); // 明确告知存储单元无需再提供额外信息
I2C_Stop();
return data;
}
void eepromWrite(unsigned int address,unsigned char writeData ){
I2C_Start();
I2C_SendByte(STC_EEPROM_START_ADDR>>1);
I2C_WaitAck();
I2C_SendByte(address&0xFF);
I2C_WaitAck();
I2C_SendByte(writeData );
I2C_WaitAck();
I2C_Stop();
}
```
上述逻辑实现了针对指定偏移处单个字节级别的存取动作[^3]。
---
阅读全文
相关推荐














