HAL库函数的HAL_I2C_Mem_Write /HAL_I2C_Mem_Read的DevAddress
在HAL库函数中的HAL_I2C_Mem_Write /HAL_I2C_Mem_Read两个函数的作用就是玩IIC设备中写入/读取多个直接的数据,
函数原型:
-
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
-
-
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);
两个函传入的参数中都需要DevAddress, 以AT24C02为例,
-
/*
-
* AT24C02 2kb = 2048bit = 2048/8 B = 256 B
-
* 32 pages of 8 bytes each
-
*
-
* Device Address
-
* 1 0 1 0 A2 A1 A0 R/W
-
* 1 0 1 0 0 0 0 0 = 0XA0
-
* 1 0 1 0 0 0 0 1 = 0XA1
-
*/
-
-
上面的这个是EEPROM设备的写地址和读地址,,一般是这种定义的,但是在野火的HAL案例中
#define EEPROM_ADDRESS 0xA0
这个是写地址,为什么不定义直接定义写地址和读地址呢?
我们来看看函数的实现,以HAL_I2C_Mem_Write 函数为例: DevAddress传递到该函数中:
-
/* Send Slave Address and Memory Address */
-
if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
-
-
{
-
return HAL_ERROR;
-
}
再进一步 DevAddress 传递到一个宏定义中:
-
/* Send slave address */
-
-
hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
继续解析: 在stm32f1xx_hal_i2c.h中实现宏定义
现在可以看到,通过位操作,如果是读操作,就将传入的DevAddress处理成1010 0000;如果是写操作,即使传入的地址是0xA0,也不影响写操作,还是被处理成1010 0001;
因此我们在定义EEPROM的设备地址时,可以仅定义设备的读地址,也就是 七位IIC地址 1/0;
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgabkki
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24