• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

HAL库函数的HAL_I2C_Mem_Write /HAL_I2C_Mem_Read的DevAddress

武飞扬头像
Melvin_Jovi
帮助1

HAL库函数中的HAL_I2C_Mem_Write /HAL_I2C_Mem_Read两个函数的作用就是玩IIC设备中写入/读取多个直接的数据,

函数原型:

  1.  
    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);
  2.  
     
  3.  
    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为例,

  1.  
    /*
  2.  
     * AT24C02 2kb = 2048bit = 2048/8 B = 256 B
  3.  
     * 32 pages of 8 bytes each
  4.  
     *
  5.  
     * Device Address
  6.  
     * 1 0 1 0 A2 A1 A0 R/W
  7.  
     * 1 0 1 0 0  0  0  0 = 0XA0
  8.  
     * 1 0 1 0 0  0  0  1 = 0XA1
  9.  
     */
  10.  
    #define ADDR_24LCxx_Write 0xA0
  11.  
    #define ADDR_24LCxx_Read 0xA1

上面的这个是EEPROM设备的写地址和读地址,,一般是这种定义的,但是在野火的HAL案例中

#define EEPROM_ADDRESS       0xA0

这个是写地址,为什么不定义直接定义写地址和读地址呢?

我们来看看函数的实现,以HAL_I2C_Mem_Write 函数为例: DevAddress传递到该函数中:

  1.  
    /* Send Slave Address and Memory Address */
  2.  
       if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
  3.  
     
  4.  
       {
  5.  
         return HAL_ERROR;
  6.  
       }

再进一步 DevAddress 传递到一个宏定义中:

  1.  
    /* Send slave address */
  2.  
     
  3.  
      hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);

继续解析: 在stm32f1xx_hal_i2c.h中实现宏定义

  1.  
    #define I2C_7BIT_ADD_WRITE(__ADDRESS__)                   ((uint8_t)((__ADDRESS__) & (uint8_t)(~I2C_OAR1_ADD0)))
  2.  
     
  3.  
    #define I2C_7BIT_ADD_READ(__ADDRESS__)                     ((uint8_t)((__ADDRESS__) | I2C_OAR1_ADD0))

现在可以看到,通过位操作,如果是读操作,就将传入的DevAddress处理成1010 0000;如果是写操作,即使传入的地址是0xA0,也不影响写操作,还是被处理成1010 0001;

因此我们在定义EEPROM的设备地址时,可以仅定义设备的读地址,也就是 七位IIC地址 1/0;

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgabkki
系列文章
更多 icon
同类精品
更多 icon
继续加载