stm32f103模拟i2c例程
以下是一个基于STM32F103的模拟I2C(软件I2C)例程,使用GPIO引脚模拟I2C协议,代码基于标准外设库(Standard Peripheral Library)实现:
1. 硬件连接
- SCL:PB6(可自定义其他GPIO)
- SDA:PB7(可自定义其他GPIO)
- 需外接 4.7kΩ上拉电阻 到3.3V
2. GPIO初始化
#include "stm32f10x.h"
#define I2C_SCL_PIN GPIO_Pin_6
#define I2C_SDA_PIN GPIO_Pin_7
#define I2C_GPIO_PORT GPIOB
void I2C_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// SCL和SDA配置为开漏输出模式
GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN | I2C_SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; // 开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(I2C_GPIO_PORT, &GPIO_InitStructure);
// 初始化为高电平
GPIO_SetBits(I2C_GPIO_PORT, I2C_SCL_PIN | I2C_SDA_PIN);
}
3. 基本时序函数
// 微秒级延时(需根据主频调整)
void I2C_Delay_us(uint32_t us) {
us *= 72; // 假设系统时钟72MHz
while(us--) {
__NOP();
}
}
// 产生起始信号
void I2C_Start(void) {
SDA_HIGH();
SCL_HIGH();
I2C_Delay_us(5);
SDA_LOW(); // SCL高电平期间SDA下降沿
I2C_Delay_us(5);
SCL_LOW(); // 拉低SCL准备传输数据
}
// 产生停止信号
void I2C_Stop(void) {
SDA_LOW();
SCL_LOW();
I2C_Delay_us(5);
SCL_HIGH(); // SCL高电平期间SDA上升沿
I2C_Delay_us(5);
SDA_HIGH();
}
// 等待ACK应答
uint8_t I2C_Wait_Ack(void) {
uint8_t ack = 0;
SDA_INPUT(); // 切换SDA为输入模式
SCL_HIGH();
I2C_Delay_us(5);
if (GPIO_ReadInputDataBit(I2C_GPIO_PORT, I2C_SDA_PIN) == 0) {
ack = 1; // 收到ACK
}
SCL_LOW();
SDA_OUTPUT(); // 切换回输出模式
return ack;
}
// 发送ACK信号
void I2C_Ack(void) {
SDA_LOW();
I2C_Delay_us(2);
SCL_HIGH();
I2C_Delay_us(5);
SCL_LOW();
}
// 发送NACK信号
void I2C_NAck(void) {
SDA_HIGH();
I2C_Delay_us(2);
SCL_HIGH();
I2C_Delay_us(5);
SCL_LOW();
}
4. 数据读写函数
// 发送一个字节
void I2C_SendByte(uint8_t data) {
for (uint8_t i = 0; i < 8; i++) {
SCL_LOW();
if (data & 0x80) SDA_HIGH();
else SDA_LOW();
data <<= 1;
I2C_Delay_us(2);
SCL_HIGH(); // 上升沿发送数据
I2C_Delay_us(5);
}
SCL_LOW();
}
// 接收一个字节
uint8_t I2C_ReadByte(void) {
uint8_t data = 0;
SDA_INPUT(); // SDA设为输入
for (uint8_t i = 0; i < 8; i++) {
SCL_LOW();
I2C_Delay_us(2);
SCL_HIGH(); // 上升沿读取数据
data <<= 1;
if (GPIO_ReadInputDataBit(I2C_GPIO_PORT, I2C_SDA_PIN)) {
data |= 0x01;
}
I2C_Delay_us(5);
}
SCL_LOW();
SDA_OUTPUT(); // 切回输出模式
return data;
}
5. 使用示例(以AT24C02 EEPROM为例)
// 向EEPROM写入一个字节
void EEPROM_WriteByte(uint8_t addr, uint8_t data) {
I2C_Start();
I2C_SendByte(0xA0); // 器件地址 + 写操作
I2C_Wait_Ack();
I2C_SendByte(addr); // 写入地址
I2C_Wait_Ack();
I2C_SendByte(data); // 发送数据
I2C_Wait_Ack();
I2C_Stop();
Delay_ms(10); // 等待EEPROM写入完成
}
// 从EEPROM读取一个字节
uint8_t EEPROM_ReadByte(uint8_t addr) {
uint8_t data;
I2C_Start();
I2C_SendByte(0xA0); // 器件地址 + 写操作
I2C_Wait_Ack();
I2C_SendByte(addr); // 发送要读取的地址
I2C_Wait_Ack();
I2C_Start(); // 重复起始条件
I2C_SendByte(0xA1); // 器件地址 + 读操作
I2C_Wait_Ack();
data = I2C_ReadByte(); // 读取数据
I2C_NAck(); // 发送NACK结束读取
I2C_Stop();
return data;
}
注意事项:
- 时序调整:延时函数
I2C_Delay_us()需根据实际主频调整,可用示波器校准。 - 错误处理:建议在实际应用中增加超时判断,避免死循环。
- 多设备支持:通过修改器件地址(0xA0/0xA1)适配不同从机。
- 中断处理:若在中断中使用,需考虑延时函数的准确性。
可根据具体需求调整GPIO引脚和时序参数,适用于大多数I2C从设备通信场景。
用STM32F103普通IO模拟通信协议如I2C,SPI,串口,怎么精准的控制通讯的速率?
用STM32F103普通IO模拟通信协议如I2C,SPI,串口等。 怎么精准的控制通讯的速率,我看到STLINK也是用的
STM32F103硬件I2C Slave
MCU:STM32F103IDE:STM32CubeIDEHAL库硬件I2C当作Slave,
资料下载
goodmbby
2021-12-20 19:38:54
STM32作为I2C从机中断接收和从模式中断应答数据总结
主设备发送读信号时中断发送回应的功能。在网上找了很多资料,都说STM32F103的i2c硬件有瑕疵,具体有啥瑕疵我也不太清楚,只是大部分例程都是
资料下载
远不及你
2021-12-02 19:21:32
stm32f103 flash模拟eeprom
,STM32F103的Flash存储器可以模拟EEPROM的功能,在本文中我们将详细介绍如何使用STM32F103的Flash存储器来实现EEP
2024-01-09 11:21:36
STM32使用教程 基于STM32F103RBT6的例程 STM32控制OLED例程
,请按实际引脚连接 OLED STM32 VCC 3.3V GND GND DIN SPI:PA7 / I2C:PB9 / I2C_SOFT:P
2022-05-05 19:44:07
STM32F103 硬件I2C主从机通信 精选资料分享
肝了这么多天,查了很多资料,逛了不少论坛终于把stm32f103的硬件I2C写出来了,就先做个记录。开发板是自己画的兼容原子精英两块板子,型号是f103
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 如何进行编码器的正确接线?接线方法介绍
- 什么是场效应管?它的作用是什么?
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- amoled屏幕和oled区别
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 苹果笔记本macbookpro18款与19款区别
- 通讯隔离作用
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机