登录/注册

stm32i2c从发模式

更多

STM32 的 I2C 从机模式配置步骤如下,以 HAL 库为例:


1. 硬件配置


2. I2C 参数初始化

I2C_HandleTypeDef hi2c1;

hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 0;          // 从机无需设置时钟,由主机控制
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;   // 仅主模式有效
hi2c1.Init.OwnAddress1 = 0x0A;      // 从机地址(7 位或 10 位)
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; // 地址模式
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; // 禁用双地址
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; // 禁用广播呼叫
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;     // 禁用时钟延展

HAL_I2C_Init(&hi2c1);

3. 使能中断(可选)


4. 数据收发处理

从机接收数据(主机写操作)

// 启动从机接收(中断方式)
HAL_I2C_Slave_Receive_IT(&hi2c1, rx_buffer, buffer_size);

// 中断回调函数(数据接收完成)
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) {
    // 处理接收到的数据(rx_buffer)
}

从机发送数据(主机读操作)

// 启动从机发送(中断方式)
HAL_I2C_Slave_Transmit_IT(&hi2c1, tx_buffer, buffer_size);

// 中断回调函数(数据发送完成)
void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) {
    // 准备下一组待发送数据
}

5. 错误处理

// 错误中断回调函数
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) {
    uint32_t error = HAL_I2C_GetError(hi2c);
    if (error & HAL_I2C_ERROR_AF) {
        // 应答失败(NACK)
    }
    // 其他错误处理...
}

关键注意事项

  1. 地址匹配:确保从机地址与主机发送的地址一致(7 位或 10 位)。
  2. 时钟延展:若主机时钟过快,可启用 I2C_NOSTRETCH_ENABLE 避免超时。
  3. 中断优先级:合理配置中断优先级,避免数据丢失。
  4. 数据缓冲管理:及时处理接收数据或填充待发送数据,防止溢出。

示例代码(精简版)

#include "stm32f4xx_hal.h"

I2C_HandleTypeDef hi2c1;
uint8_t rx_data[10];

int main() {
    HAL_Init();
    // ... 初始化时钟和GPIO

    // I2C 初始化
    HAL_I2C_Init(&hi2c1);
    HAL_I2C_EnableListen_IT(&hi2c1); // 进入监听模式

    while (1) {
        // 主循环处理其他任务
    }
}

// 地址匹配回调函数
void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode) {
    if (TransferDirection == I2C_DIRECTION_TRANSMIT) {
        // 主机写操作:启动接收
        HAL_I2C_Slave_Receive_IT(hi2c, rx_data, 10);
    } else {
        // 主机读操作:启动发送
        uint8_t tx_data[] = "Hello";
        HAL_I2C_Slave_Transmit_IT(hi2c, tx_data, 5);
    }
}

通过以上步骤,STM32 可作为 I2C 从机与主机通信。具体实现需根据型号和库版本调整,建议参考对应型号的 参考手册(Reference Manual)HAL 库文档

STM32F1的I2C模块协议简介

I2C是一种多主从的串行通讯协议。STM32F1的I2C模块支持标速(最高100kHz)和高速(最高400kHz)两种工作

2023-07-25 14:49:38

I2CI3C的区别有哪些

I2C 和 I3C 主要区别如下: I2C 虽然也是两条线,但是很多时候传感器需要一条额外的中断线,来告诉主控数据已经准备好。

2023-07-22 16:20:20

MK26 MCU I2C模式的1Mhz配置步骤

在 MK26 MCU中,使用 I2C作为从机,设置 CLK时钟速率为 1MHz。I2C的SCL停止保持时间由主机控制。

2023-04-07 15:44:02

MA82G5D系列I2C模式示例代码

MA82G5D系列I2C从模式示例代码文件免费下载。

资料下载 孙成红 2022-06-28 17:20:38

STM32 I2C存取实验资料

STM32 I2C存取实验资料

资料下载 郑兵 2021-12-30 10:36:41

STM32F0 HAL库 I2C 机配置

参考链接:http://blog.sina.com.cn/s/blog_95cc46f40102yika.htmlSTM32 I2C从机中断

资料下载 佚名 2021-12-28 19:29:18

STM32作为I2C机中断接收和模式中断应答数据总结

之前在项目中用到了STM32F103的i2c功能,大致功能是两个单片机进行i2c通信,而且通信

资料下载 远不及你 2021-12-02 19:21:32

如何将I2C地址左移1位

  I2C总线读写中,新人会比较困惑,为什么I2C从地址要左移1位?这是i2c

资料下载 李霞 2019-08-05 17:34:00

I2C机如何使用中断模式

I2C从机如何使用中断模式?  官方库里好像没有清除中断标志的设计,例如清除STOPF标志位?  另外,

2022-05-27 07:44:16

STM32 I2C机中断模式测试

STM32 I2C从机中断模式测试可用;可在此基础上修改代码使用;一、

2022-02-22 07:43:01

I2C总线支持几种传输模式

I2C 总线提供了一种串行通信方式,用在 MCU 与 EEPROM,LCD模块,温度传感器等等之间控制。I2C 用两条线 (数据线SDA 和时钟线 SCL) 在设备间传输数据。

2022-02-11 07:05:07

【原创分享】STM32学习笔记|I2C详解

地址查找从机I2C通常用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。很多外围器件采用I2C通讯接口访问。

2021-06-18 09:27:37

STM32 I2C硬件的结构

我们可以看见STM32的硬件I2C有两个和数据有关的寄存器“数据寄存器(Data register)”(DR)和“数据移位寄存器(Data shift register)”(DSR),我们的软件写入的是DR, DSR

2020-04-30 15:00:29

STM32 HAL库 I2C 学习

1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; \\ 设置为7位地址模式 hi2c1.Init

2020-04-26 15:09:23

请问I2C组件应该设置为主模式还是模式

我正在设置pSOC4BLE芯片来读取来自光传感器的数据。I2C组件应该设置为主模式还是从

2019-10-16 09:42:09
7天热门专题 换一换
相关标签