你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 HAL/LL寄存器读写I2C(硬件I2C)

[复制链接]
攻城狮Melo 发布时间:2022-11-4 15:49
HAL库底层中有超时返回函数,在这里精简掉,此函数验证与STM32L0,其他板子未验证,ulTimeout 参数无用,可直接写0

写寄存器

  1. uint8_t BSP_IIC_WriteReg(uint8_t ucChannel, uint16_t DevAddress, uint16_t Reg, uint8_t *pData, uint16_t usLen, uint32_t ulTimeout)
  2. {
  3.     uint8_t Ret = TRUE;
  4.     uint16_t XferCount = usLen;
  5.     uint8_t *TxBuffer = pData;
  6.     uint16_t XferSize = 0;

  7.         /*等待I2C总线空闲*/
  8.     while(((I2C1->ISR) & I2C_ISR_BUSY) == I2C_ISR_BUSY);

  9.     /* Send Slave Address and Memory Address */
  10.     LL_I2C_HandleTransfer(I2C1, DevAddress, LL_I2C_ADDRSLAVE_7BIT, I2C_MEMADD_SIZE_8BIT, I2C_CR2_RELOAD , LL_I2C_GENERATE_START_WRITE);
  11.     while(((I2C1->ISR) & I2C_ISR_TXIS) != I2C_ISR_TXIS);
  12.          /* Send Memory Address */
  13.         I2C1->TXDR  = I2C_MEM_ADD_LSB(Reg);
  14.     while(((I2C1->ISR) & I2C_ISR_TCR) != I2C_ISR_TCR);

  15.     /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */
  16.     if (XferCount > MAX_NBYTE_SIZE)
  17.     {
  18.         XferSize = MAX_NBYTE_SIZE;
  19.         LL_I2C_HandleTransfer(I2C1, DevAddress, LL_I2C_ADDRSLAVE_7BIT, (uint8_t)XferSize, I2C_CR2_RELOAD , I2C_NO_STARTSTOP);
  20.     }
  21.     else
  22.     {
  23.         XferSize = XferCount;
  24.         LL_I2C_HandleTransfer(I2C1, DevAddress, LL_I2C_ADDRSLAVE_7BIT, (uint8_t)XferSize, I2C_CR2_AUTOEND , I2C_NO_STARTSTOP);
  25.     }

  26.     do
  27.     {
  28.         /* Wait until TXIS flag is set */
  29.         while(((I2C1->ISR) & I2C_ISR_TXIS) != I2C_ISR_TXIS);
  30.         /* Write data to TXDR */
  31.         I2C1->TXDR = *TxBuffer;
  32.         /* Increment Buffer pointer */
  33.         TxBuffer++;

  34.         XferCount--;
  35.         XferSize--;

  36.         if ((XferCount != 0U) && (XferSize == 0U))
  37.         {
  38.             /* Wait until TCR flag is set */
  39.             while(((I2C1->ISR) & I2C_ISR_TCR) != I2C_ISR_TCR);
  40.                         
  41.             if (XferCount > MAX_NBYTE_SIZE)
  42.             {
  43.                 XferSize = MAX_NBYTE_SIZE;
  44.                 LL_I2C_HandleTransfer(I2C1, DevAddress, LL_I2C_ADDRSLAVE_7BIT, (uint8_t)XferSize, I2C_CR2_RELOAD , I2C_NO_STARTSTOP);
  45.             }
  46.             else
  47.             {
  48.                 XferSize = XferCount;
  49.                 LL_I2C_HandleTransfer(I2C1, DevAddress, LL_I2C_ADDRSLAVE_7BIT, (uint8_t)XferSize, I2C_CR2_AUTOEND , I2C_NO_STARTSTOP);
  50.             }
  51.         }
  52.     }
  53.     while(XferCount > 0U);

  54.     /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
  55.     /* Wait until STOPF flag is reset */
  56.     while(((I2C1->ISR) & I2C_ISR_STOPF) != I2C_ISR_STOPF);

  57.     /* Clear NACKF Flag */
  58.     __HAL_I2C_CLEAR_FLAG(I2C1, I2C_ISR_NACKF);
  59.         
  60.     /* Clear STOP Flag */
  61.     LL_I2C_ClearFlag_STOP(I2C1);

  62.     /* Clear Configuration Register 2 */
  63.     I2C1->CR2 &= (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_HEAD10R | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_RD_WRN));

  64.     return Ret;
  65. }
复制代码

读寄存器:

  1. uint8_t BSP_IIC_ReadReg(uint8_t ucChannel, uint16_t DevAddress, uint16_t Reg, uint8_t *pData, uint16_t usLen, uint32_t ulTimeout)
  2. {
  3.     uint8_t Ret = TRUE;  
  4.     uint16_t XferCount = usLen;
  5.     uint8_t *TxBuffer = pData;
  6.     uint16_t XferSize = 0;
  7.         
  8.         /*等待I2C总线空闲*/
  9.     while(((I2C1->ISR) & I2C_ISR_BUSY) == I2C_ISR_BUSY);

  10.     /* Send Slave Address and Memory Address */
  11.     LL_I2C_HandleTransfer(I2C1, DevAddress, LL_I2C_ADDRSLAVE_7BIT, I2C_MEMADD_SIZE_8BIT, LL_I2C_MODE_SOFTEND, I2C_GENERATE_START_WRITE);
  12.     while(((I2C1->ISR) & I2C_ISR_TXIS) != I2C_ISR_TXIS);
  13.         
  14.          /* Send Memory Address */
  15.     I2C1->TXDR = I2C_MEM_ADD_LSB(Reg);
  16.     while(((I2C1->ISR) & I2C_ISR_TC) != I2C_ISR_TC);

  17.     /* Send Slave Address */
  18.     /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */
  19.     if (XferCount > MAX_NBYTE_SIZE)
  20.     {
  21.         XferSize = MAX_NBYTE_SIZE;
  22.         LL_I2C_HandleTransfer(I2C1, DevAddress, LL_I2C_ADDRSLAVE_7BIT, (uint8_t)XferSize, I2C_CR2_RELOAD , I2C_GENERATE_START_READ);
  23.     }
  24.     else
  25.     {
  26.         XferSize = XferCount;
  27.         LL_I2C_HandleTransfer(I2C1, DevAddress, LL_I2C_ADDRSLAVE_7BIT, (uint8_t)XferSize, I2C_CR2_AUTOEND ,I2C_GENERATE_START_READ);
  28.     }

  29.     do
  30.     {
  31.         /* Wait until RXNE flag is set */
  32.         while(((I2C1->ISR) & I2C_ISR_RXNE) != I2C_ISR_RXNE);

  33.         /* Read data from RXDR */
  34.         *TxBuffer = (U8)((I2C1->RXDR  >> 0) & 0xFF);

  35.         /* Increment Buffer pointer */
  36.         TxBuffer++;

  37.         XferCount--;
  38.         XferSize--;

  39.         if ((XferCount != 0U) && (XferSize == 0U))
  40.         {
  41.             /* Wait until TCR flag is set */
  42.             while(((I2C1->ISR) & I2C_ISR_TCR) != I2C_ISR_TCR);
  43.                         
  44.             if (XferCount > MAX_NBYTE_SIZE)
  45.             {
  46.                 XferSize = MAX_NBYTE_SIZE;
  47.                 LL_I2C_HandleTransfer(I2C1, DevAddress, LL_I2C_ADDRSLAVE_7BIT, (uint8_t)XferSize, I2C_CR2_RELOAD , I2C_NO_STARTSTOP);
  48.             }
  49.             else
  50.             {
  51.                 XferSize = XferCount;
  52.                 LL_I2C_HandleTransfer(I2C1, DevAddress, LL_I2C_ADDRSLAVE_7BIT, (uint8_t)XferSize, I2C_CR2_AUTOEND , I2C_NO_STARTSTOP);
  53.             }
  54.         }
  55.     }
  56.     while(XferCount > 0U);

  57.     /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
  58.     /* Wait until STOPF flag is reset */
  59.     while(((I2C1->ISR) & I2C_ISR_STOPF) != I2C_ISR_STOPF)
  60.         {

  61.         }
  62.         /* Clear NACKF Flag */
  63.     __HAL_I2C_CLEAR_FLAG(I2C1, I2C_ISR_NACKF);

  64.     /* Clear STOP Flag */
  65.     LL_I2C_ClearFlag_STOP(I2C1);

  66.     /* Clear Configuration Register 2 */
  67.     I2C1->CR2 &= (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_HEAD10R | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_RD_WRN));

  68.     return Ret;
  69. }
复制代码

————————————————
版权声明:Logan Li


收藏 评论0 发布时间:2022-11-4 15:49

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版