HAL_I2C_Mem_Write函数详解
时间: 2023-11-20 15:34:29 浏览: 2870
HAL_I2C_Mem_Write函数是STM32 HAL库中的一个函数,用于向I2C设备的指定寄存器地址中写入数据。该函数的原型为:
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
参数说明:
1. hi2c:指向I2C_HandleTypeDef结构体的指针,表示I2C外设的句柄。
2. DevAddress:I2C设备的地址。
3. MemAddress:I2C设备的寄存器地址。
4. MemAddSize:I2C设备寄存器地址的大小,可取值为I2C_MEMADD_SIZE_8BIT或I2C_MEMADD_SIZE_16BIT。
5. pData:指向要写入的数据缓冲区的指针。
6. Size:要写入的数据的字节数。
7. Timeout:操作超时时间。
函数返回值为HAL_StatusTypeDef类型,表示函数执行状态。如果函数执行成功,则返回HAL_OK,否则返回其他错误代码。
函数的详细作用是:向I2C设备的指定寄存器地址中写入指定数量的数据。在执行该函数之前,需要先调用HAL_I2C_Master_Transmit函数向I2C设备发送寄存器地址,以告诉设备写入数据的位置。然后再调用HAL_I2C_Mem_Write函数将数据写入设备。
相关问题
HAL_I2C_Mem_Write
### HAL_I2C_Mem_Write STM32 I2C内存写入函数使用方法
#### 函数描述
`HAL_I2C_Mem_Write` 是一个用于在阻塞模式下将大量数据写入特定的内存地址的功能[^1]。此函数特别适用于具有内部地址空间的I2C设备,允许指定数据应被写入的具体位置。
#### 参数解释
- `hi2c`: 指向 `I2C_HandleTypeDef` 结构体的指针,包含了I2C外设的状态信息。
- `DevAddress`: 目标设备的物理地址。
- `MemAddress`: 设备内的起始存储地址。
- `MemAddSize`: 存储地址长度(字节数),一般为1或2字节。
- `pData`: 数据缓冲区首地址,即待传输的数据所在的位置。
- `Size`: 需要发送的数据量大小,单位为字节。
- `Timeout`: 超时周期设定值,防止无限等待操作完成的情况发生。
#### 示例代码
下面是一个简单的例子来展示如何调用 `HAL_I2C_Mem_Write` 来执行一次完整的写入过程:
```c
#include "stm32f4xx_hal.h"
// 假定已经初始化了一个名为 hi2c1 的句柄实例
extern I2C_HandleTypeDef hi2c1;
void WriteToMemory(uint16_t deviceAddr, uint16_t memAddr, uint8_t* dataBuffer, uint16_t dataSize){
// 尝试将dataBuffer中的dataSize个字节写入到deviceAddr所代表的器件memAddr处
if(HAL_I2C_Mem_Write(&hi2c1, deviceAddr, memAddr, I2C_MEMADD_SIZE_8BIT, dataBuffer, dataSize, 1000) != HAL_OK){
// 如果遇到错误,则处理它...
Error_Handler();
}
}
```
上述代码片段展示了如何定义并实现一个辅助函数 `WriteToMemory`, 它接收四个参数:目标设备地址 (`deviceAddr`)、内存地址(`memAddr`)、指向数据缓存区的指针 (`dataBuffer`) 和打算传送的数据数量 (`dataSize`). 当尝试通过 `HAL_I2C_Mem_Write` 发送数据失败时会触发自定义错误处理器 `Error_Handler()`.
#### 可能的问题及其解决方案
当使用 `HAL_I2C_Mem_Write` 进行通信时可能会碰到一些常见问题,比如因缺少上拉电阻而导致硬件I2C无法正常工作的问题[^5]. 对于这种情况的一个有效解决策略是在IIC总线上增加外部上拉电阻;对于某些应用场景而言也可以考虑调整从机端口设置以启用内置弱上拉功能。
HAL_I2C_Mem_Write HAL_I2C_Mem_Read
### 使用STM32 HAL I2C Mem Write 和 Read 函数
#### 初始化I2C接口
为了使用`HAL_I2C_Mem_Write`和`HAL_I2C_Mem_Read`函数,首先需要通过调用`HAL_I2C_Init`完成I2C接口的初始化[^2]。
```c
// 假定已经在STM32CubeMX中配置好并生成了相应的初始化代码
HAL_StatusTypeDef status;
status = HAL_I2C_Init(&hi2c1);
if (status != HAL_OK) {
// 错误处理...
}
```
#### 写入数据到外部设备内存地址
当向具有内部存储器映射结构(如EEPROM)的器件发送数据时,可以利用`HAL_I2C_Mem_Write`函数。此函数允许指定目标设备地址、要访问的内存地址以及待传输的数据缓冲区长度。
```c
uint8_t DevAddress = 0xA0; // 设备地址, 对于AT24C02来说通常是0xA0或0xA2等
uint16_t MemAddress = 0x00AA; // 起始写入位置(内存地址)
uint8_t *pData = "Hello"; // 待写入的数据指针
uint16_t Size = strlen((char*)pData); // 数据大小
uint16_t MemAddSize = I2C_MEMADD_SIZE_8BIT;
status = HAL_I2C_Mem_Write(&hi2c1, DevAddress, MemAddress, MemAddSize, pData, Size, 1000);
if(status != HAL_OK){
// 处理错误情况
}
```
上述代码片段展示了如何将字符串"Hello"写入至从地址`MemAddress`开始的位置上,其中`DevAddress`代表的是连接在外围总线上具体芯片的选择地址;而`MemAddSize`参数则用于指示所使用的内存寻址宽度——这里选择了8位宽[^1]。
#### 从外部设备内存地址读取数据
对于从拥有内部RAM/Flash架构的外围模块获取信息而言,则会涉及到`HAL_I2C_Mem_Read`方法的应用。它同样接收一系列类似的参数来定位源端口及其偏移量,并最终把接收到的信息存放到预先分配好的数组里去。
```c
uint8_t readData[5]; // 存储读回的数据
size_t sizeToRead = sizeof(readData)/sizeof(uint8_t);
status = HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress, MemAddSize, readData, sizeToRead, 1000);
if(status != HAL_OK){
// 处理错误情况
}
for(int i=0;i<sizeToRead;i++){
printf("%c",readData[i]); // 输出读取的内容
}
```
这段示例说明了怎样从之前设定过的相同起始点处提取五个字节的数据出来,并逐个打印字符形式的结果给用户查看。
阅读全文
相关推荐















