调试I2C遇到的一些问题

[复制链接]
768|8
 楼主| 尽快回复过 发表于 2023-4-30 23:14 | 显示全部楼层 |阅读模式
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(hi2c->Instance==I2C2)
  {
  /* USER CODE BEGIN I2C2_MspInit 0 */

  /* USER CODE END I2C2_MspInit 0 */

    /**I2C2 GPIO Configuration   
    PB10     ------> I2C2_SCL
    PB3     ------> I2C2_SDA
    */
    GPIO_InitStruct.Pin = GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;    //这个选项只能为低,为其他的模式会出现错误。
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF9_I2C2;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* Peripheral clock enable */
    __HAL_RCC_I2C2_CLK_ENABLE();
  /* USER CODE BEGIN I2C2_MspInit 1 */

  /* USER CODE END I2C2_MspInit 1 */
  }

}





评论

———————————————— 版权声明:本文为CSDN博主「宁静以致墨」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/baiyibin0530/article/details/54892815  发表于 2023-4-30 23:14
 楼主| 尽快回复过 发表于 2023-4-30 23:15 | 显示全部楼层
  1. if(hi2c->Instance==I2C1)
  2.   {
  3.   /* USER CODE BEGIN I2C1_MspInit 0 */

  4.   /* USER CODE END I2C1_MspInit 0 */

  5.     /**I2C1 GPIO Configuration   
  6.     PB6     ------> I2C1_SCL
  7.     PB7     ------> I2C1_SDA
  8.     */
  9.     GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
  10.     GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  11.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  12.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  13.     GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
  14.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  15.     /* Peripheral clock enable */
  16.     __HAL_RCC_I2C1_CLK_ENABLE();
  17.     /* Peripheral interrupt init */
  18.     HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
  19.     HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
  20.     HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
  21.     HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
  22.   /* USER CODE BEGIN I2C1_MspInit 1 */

  23.   /* USER CODE END I2C1_MspInit 1 */
  24.   }
  25.   else if(hi2c->Instance==I2C2)
  26.   {
  27.   /* USER CODE BEGIN I2C2_MspInit 0 */

  28.   /* USER CODE END I2C2_MspInit 0 */

  29.     /**I2C2 GPIO Configuration   
  30.     PB10     ------> I2C2_SCL
  31.     PB3     ------> I2C2_SDA
  32.     */
  33.     GPIO_InitStruct.Pin = GPIO_PIN_10;
  34.     GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  35.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  36.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  37.     GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;
  38.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  39.     GPIO_InitStruct.Pin = GPIO_PIN_3;
  40.     GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  41.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  42.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  43.     GPIO_InitStruct.Alternate = GPIO_AF9_I2C2;  //注意模式的设置不是简单的模仿GPIO_AF4_I2C2,而是现在的这个模式
  44.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  45.     /* Peripheral clock enable */
  46.     __HAL_RCC_I2C2_CLK_ENABLE();
  47.   /* USER CODE BEGIN I2C2_MspInit 1 */

  48.   /* USER CODE END I2C2_MspInit 1 */
  49.   }
  50.   else if(hi2c->Instance==I2C3)
  51.   {
  52.   /* USER CODE BEGIN I2C3_MspInit 0 */

  53.   /* USER CODE END I2C3_MspInit 0 */

  54.     /**I2C3 GPIO Configuration   
  55.     PC9     ------> I2C3_SDA
  56.     PA8     ------> I2C3_SCL
  57.     */
  58.     GPIO_InitStruct.Pin = GPIO_PIN_9;
  59.     GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  60.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  61.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  62.     GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;
  63.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  64.     GPIO_InitStruct.Pin = GPIO_PIN_8;
  65.     GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  66.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  67.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  68.     GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;
  69.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  70.     /* Peripheral clock enable */
  71.     __HAL_RCC_I2C3_CLK_ENABLE();
  72.   /* USER CODE BEGIN I2C3_MspInit 1 */

  73.   /* USER CODE END I2C3_MspInit 1 */
  74.   }
 楼主| 尽快回复过 发表于 2023-4-30 23:15 | 显示全部楼层
  1. 第二个问题怎么修改库,让第一个I2C的写只有start,没有stop,第二条I2C的读有start也有stop。

  2. status = HAL_I2C_Master_Transmit_touch(&hi2c2, TOUCH_ADDR, &WriteBuff[0], 1, 30 );
  3.    
  4.         status = HAL_I2C_Master_Receive_touch(&hi2c2, TOUCH_ADDR, &ReadBuff[0], 8, 30);

  5. 修改库函数标红的为屏蔽代码。



  6. HAL_StatusTypeDef HAL_I2C_Master_Transmit_touch(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
  7. {
  8.   uint32_t tickstart = 0x00U;

  9.   /* Init tickstart for timeout management*/
  10.   tickstart = HAL_GetTick();

  11.   if(hi2c->State == HAL_I2C_STATE_READY)
  12.   {
  13.     /* Wait until BUSY flag is reset */
  14.     if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
  15.     {
  16.       return HAL_BUSY;
  17.     }

  18.     /* Process Locked */
  19.     __HAL_LOCK(hi2c);

  20.     /* Check if the I2C is already enabled */
  21.     if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
  22.     {
  23.       /* Enable I2C peripheral */
  24.       __HAL_I2C_ENABLE(hi2c);
  25.     }

  26.     /* Disable Pos */
  27.     hi2c->Instance->CR1 &= ~I2C_CR1_POS;

  28.     hi2c->State     = HAL_I2C_STATE_BUSY_TX;
  29.     hi2c->Mode      = HAL_I2C_MODE_MASTER;
  30.     hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

  31.     /* Prepare transfer parameters */
  32.     hi2c->pBuffPtr    = pData;
  33.     hi2c->XferCount   = Size;
  34.     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
  35.     hi2c->XferSize    = hi2c->XferCount;

  36.     /* Send Slave Address */
  37.     if(I2C_MasterRequestWrite(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)
  38.     {
  39.       if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
  40.       {
  41.         /* Process Unlocked */
  42.         __HAL_UNLOCK(hi2c);
  43.         return HAL_ERROR;
  44.       }
  45.       else
  46.       {
  47.         /* Process Unlocked */
  48.         __HAL_UNLOCK(hi2c);
  49.         return HAL_TIMEOUT;
  50.       }
  51.     }

  52.     /* Clear ADDR flag */
  53.     __HAL_I2C_CLEAR_ADDRFLAG(hi2c);

  54.     while(hi2c->XferSize > 0U)
  55.     {
  56.       /* Wait until TXE flag is set */
  57.       if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
  58.       {
  59.         if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
  60.         {
  61.           /* Generate Stop */
  62.           hi2c->Instance->CR1 |= I2C_CR1_STOP;
  63.           return HAL_ERROR;
  64.         }
  65.         else
  66.         {
  67.           return HAL_TIMEOUT;
  68.         }
  69.       }
 楼主| 尽快回复过 发表于 2023-4-30 23:15 | 显示全部楼层
  1.   /* Write data to DR */
  2.       hi2c->Instance->DR = (*hi2c->pBuffPtr++);
  3.       hi2c->XferCount--;
  4.       hi2c->XferSize--;

  5.       if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0U))
  6.       {
  7.         /* Write data to DR */
  8.         hi2c->Instance->DR = (*hi2c->pBuffPtr++);
  9.         hi2c->XferCount--;
  10.         hi2c->XferSize--;
  11.       }
  12.      
  13.       /* Wait until BTF flag is set */
  14.       if(I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
  15.       {
  16.         if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
  17.         {
  18.           /* Generate Stop */
  19.           hi2c->Instance->CR1 |= I2C_CR1_STOP;
  20.           return HAL_ERROR;
  21.         }
  22.         else
  23.         {
  24.           return HAL_TIMEOUT;
  25.         }
  26.       }
  27.     }
 楼主| 尽快回复过 发表于 2023-4-30 23:15 | 显示全部楼层
  /* Generate Stop */
//    hi2c->Instance->CR1 |= I2C_CR1_STOP;

    hi2c->State = HAL_I2C_STATE_READY;
    hi2c->Mode = HAL_I2C_MODE_NONE;
   
    /* Process Unlocked */
    __HAL_UNLOCK(hi2c);

    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}
 楼主| 尽快回复过 发表于 2023-4-30 23:16 | 显示全部楼层
  1. HAL_StatusTypeDef HAL_I2C_Master_Receive_touch(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
  2. {
  3.   uint32_t tickstart = 0x00U;

  4.   /* Init tickstart for timeout management*/
  5.   tickstart = HAL_GetTick();

  6.   if(hi2c->State == HAL_I2C_STATE_READY)
  7.   {
  8.     /* Wait until BUSY flag is reset */
  9. //    if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
  10. //    {
  11. //      return HAL_BUSY;
  12. //    }

  13.     /* Process Locked */
  14.     __HAL_LOCK(hi2c);

  15.     /* Check if the I2C is already enabled */
  16.     if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
  17.     {
  18.       /* Enable I2C peripheral */
  19.       __HAL_I2C_ENABLE(hi2c);
  20.     }

  21.     /* Disable Pos */
  22.     hi2c->Instance->CR1 &= ~I2C_CR1_POS;

  23.     hi2c->State       = HAL_I2C_STATE_BUSY_RX;
  24.     hi2c->Mode        = HAL_I2C_MODE_MASTER;
  25.     hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;

  26.     /* Prepare transfer parameters */
  27.     hi2c->pBuffPtr    = pData;
  28.     hi2c->XferCount   = Size;
  29.     hi2c->XferOptions = I2C_NO_OPTION_FRAME;
  30.     hi2c->XferSize    = hi2c->XferCount;

  31.     /* Send Slave Address */
  32.     if(I2C_MasterRequestRead(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)
  33.     {
  34.       if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
  35.       {
  36.         /* Process Unlocked */
  37.         __HAL_UNLOCK(hi2c);
  38.         return HAL_ERROR;
  39.       }
  40.       else
  41.       {
  42.         /* Process Unlocked */
  43.         __HAL_UNLOCK(hi2c);
  44.         return HAL_TIMEOUT;
  45.       }
  46.     }

  47.     if(hi2c->XferSize == 0U)
  48.     {
  49.       /* Clear ADDR flag */
  50.       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);

  51.       /* Generate Stop */
  52.       hi2c->Instance->CR1 |= I2C_CR1_STOP;
  53.     }
  54.     else if(hi2c->XferSize == 1U)
  55.     {
  56.       /* Disable Acknowledge */
  57.       hi2c->Instance->CR1 &= ~I2C_CR1_ACK;

  58.       /* Clear ADDR flag */
  59.       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);

  60.       /* Generate Stop */
  61.       hi2c->Instance->CR1 |= I2C_CR1_STOP;
  62.     }
  63.     else if(hi2c->XferSize == 2U)
  64.     {
  65.       /* Disable Acknowledge */
  66.       hi2c->Instance->CR1 &= ~I2C_CR1_ACK;

  67.       /* Enable Pos */
  68.       hi2c->Instance->CR1 |= I2C_CR1_POS;

  69.       /* Clear ADDR flag */
  70.       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
  71.     }
  72.     else
  73.     {
  74.       /* Enable Acknowledge */
  75.       hi2c->Instance->CR1 |= I2C_CR1_ACK;

  76.       /* Clear ADDR flag */
  77.       __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
  78.     }

  79.     while(hi2c->XferSize > 0U)
  80.     {
  81.       if(hi2c->XferSize <= 3U)
  82.       {
  83.         /* One byte */
  84.         if(hi2c->XferSize == 1U)
  85.         {
  86.           /* Wait until RXNE flag is set */
  87.           if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)     
  88.           {
  89.             if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)
  90.             {
  91.               return HAL_TIMEOUT;
  92.             }
  93.             else
  94.             {
  95.               return HAL_ERROR;
  96.             }
  97.           }

  98.           /* Read data from DR */
  99.           (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
  100.           hi2c->XferSize--;
  101.           hi2c->XferCount--;
  102.         }
  103.         /* Two bytes */
  104.         else if(hi2c->XferSize == 2U)
  105.         {
  106.           /* Wait until BTF flag is set */
  107.           if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
  108.           {
  109.             return HAL_TIMEOUT;
  110.           }

  111.           /* Generate Stop */
  112.           hi2c->Instance->CR1 |= I2C_CR1_STOP;

  113.           /* Read data from DR */
  114.           (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
  115.           hi2c->XferSize--;
  116.           hi2c->XferCount--;

  117.           /* Read data from DR */
  118.           (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
  119.           hi2c->XferSize--;
  120.           hi2c->XferCount--;
  121.         }
  122.         /* 3 Last bytes */
  123.         else
  124.         {
  125.           /* Wait until BTF flag is set */
  126.           if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
  127.           {
  128.             return HAL_TIMEOUT;
  129.           }

  130.           /* Disable Acknowledge */
  131.           hi2c->Instance->CR1 &= ~I2C_CR1_ACK;

  132.           /* Read data from DR */
  133.           (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
  134.           hi2c->XferSize--;
  135.           hi2c->XferCount--;

  136.           /* Wait until BTF flag is set */
  137.           if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
  138.           {
  139.             return HAL_TIMEOUT;
  140.           }
 楼主| 尽快回复过 发表于 2023-4-30 23:16 | 显示全部楼层
  1. /* Generate Stop */
  2.           hi2c->Instance->CR1 |= I2C_CR1_STOP;

  3.           /* Read data from DR */
  4.           (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
  5.           hi2c->XferSize--;
  6.           hi2c->XferCount--;

  7.           /* Read data from DR */
  8.           (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
  9.           hi2c->XferSize--;
  10.           hi2c->XferCount--;
  11.         }
  12.       }
  13.       else
  14.       {
  15.         /* Wait until RXNE flag is set */
  16.         if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)     
  17.         {
  18.           if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)
  19.           {
  20.             return HAL_TIMEOUT;
  21.           }
  22.           else
  23.           {
  24.             return HAL_ERROR;
  25.           }
  26.         }

  27.         /* Read data from DR */
  28.         (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
  29.         hi2c->XferSize--;
  30.         hi2c->XferCount--;

  31.         if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
  32.         {
  33.           /* Read data from DR */
  34.           (*hi2c->pBuffPtr++) = hi2c->Instance->DR;
  35.           hi2c->XferSize--;
  36.           hi2c->XferCount--;
  37.         }
  38.       }
  39.     }

  40.     hi2c->State = HAL_I2C_STATE_READY;
  41.     hi2c->Mode = HAL_I2C_MODE_NONE;

  42.     /* Process Unlocked */
  43.     __HAL_UNLOCK(hi2c);

  44.     return HAL_OK;
  45.   }
  46.   else
  47.   {
  48.     return HAL_BUSY;
  49.   }
  50. }

chenqianqian 发表于 2023-5-2 08:34 来自手机 | 显示全部楼层
咋个都在学ST命令方式啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

599

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部