STM32的IIC

这篇博客记录了作者从零开始学习STM32的IIC总线协议,专注于MMA7455L加速度传感器的通信。文章详细阐述了如何初始化I2C接口,发送从设备地址,等待ACK应答,以及实现读取数据的函数。在过程中,作者遇到了理解难题和挑战,通过不断尝试和查阅资料,逐步掌握了IIC通信的要领。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过一天的奋斗,从零基础学习IIC,感觉到这个总线真的很强大,有点驾驭不了,比着各种资料和stm32官方库的头文件写着自己摸不着头脑的程序,很苦闷的一天啊。

MMA7455L加速度传感器IIC总线器件地址0x1d,在stm32固件库(V3.5)中应这样描述

I2C_Send7bitAddress(I2C1,0x1d<<1,Direction_Transmitter);

使用I2C1接口,方向为发送器;

在每次发送数据或地址后务必等待ACK应答,

while(I2C_CheckEvent(I2C1,I2C_EVENT……)==ERROR);

/*IIC读函数*/
uint8_t i2c_read(uint8_t Daddr,uint8_t addr){
    I2C_GenerateSTART(I2C1,ENABLE);
    /*等待I2C开启和总线为空*/
    while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)==ERROR);

    I2C_Send7bitAddress(I2C1,Daddr<<1,I2C_Direction_Transmitter);
    /*等待从器件应答*/
    while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR);
    
    I2C_SendData(I2C1,addr);
    while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR);
    

### STM32 IIC (I²C) 接口使用教程 #### 初始化配置 为了使STM32能够通过IIC协议与外部设备通信,初始化过程至关重要。首先需定义并准备用于传输的数据缓冲区: ```c // 要写入到24c02的字符串数组 const uint8_t TEXT_Buffer[] = "Elite STM32 IIC TEST"; #define SIZE sizeof(TEXT_Buffer) ``` 这段代码展示了如何声明一个常量字符数组`TEXT_Buffer`以及计算其大小以便后续操作[^1]。 #### 设备地址解析 当涉及到具体硬件连接时,了解目标从设备的具体地址非常重要。对于大多数基于IIC标准设计的产品而言,7位地址由两部分组成:前四位表示器件类型,后三位则作为用户可编程的选择位(A0, A1, A2),允许在同一总线上挂载多达八个相同型号的组件[^2]。 #### 编程实例 下面给出一段简单的程序片段来展示如何利用HAL库实现向指定EERPOM位置写入数据的功能: ```c #include "stm32f1xx_hal.h" void EEPROM_WriteByte(uint16_t DevAddress,uint16_t MemAddress,uint8_t Data){ HAL_I2C_Mem_Write(&hi2c1,DevAddress,MEMADDRESS,MemAddSize,Data,SIZE,10); } ``` 上述函数接收三个参数——设备地址(`DevAddress`)、内存地址(`MemAddress`)和待写入的数据字节(`Data`),并通过调用`HAL_I2C_Mem_Write()`完成实际的操作。这里假设已经完成了必要的外设初始化工作,并且指定了正确的IIC端口号(如`&hi2c1`)。 #### 数据读取流程 同样地,在需要获取存储器中的信息时,则应采用相应的读方法: ```c uint8_t EEPROM_ReadByte(uint16_t DevAddress,uint16_t MemAddress){ uint8_t temp; HAL_I2C_Mem_Read(&hi2c1,DevAddress,MEMADDRESS,MemAddSize,&temp,SIZE,10); return temp; } ``` 此段代码实现了单个字节级别的读取功能,返回值即为所请求地址处的内容。注意这里的API签名几乎完全一致于之前提到过的写入版本,只是内部处理逻辑有所区别而已。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值