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

STM32F302C8T6硬件I2C出现SDA有波形输出SCL一直为高

[复制链接]
snowfox 提问时间:2016-10-26 16:04 /
本人在一个项目中使用了STM32F302C8T6这个芯片,碰到硬件I2C奇怪的问题,过程如下:
1、通过STM32CubeMX生成初始代码;
1.png

2、初始代码如下;
  1. void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
  2. {

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

  7.   /* USER CODE END I2C2_MspInit 0 */
  8.   
  9.     /**I2C2 GPIO Configuration   
  10.     PA9     ------> I2C2_SCL
  11.     PA10     ------> I2C2_SDA
  12.     */
  13.     GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
  14.     GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  15.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  16.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  17.     GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;
  18.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  19.     /* Peripheral clock enable */
  20.     __HAL_RCC_I2C2_CLK_ENABLE();
  21.   /* USER CODE BEGIN I2C2_MspInit 1 */

  22.   /* USER CODE END I2C2_MspInit 1 */
  23.   }

  24. }


  25. /* I2C2 init function */
  26. static void MX_I2C2_Init(void)
  27. {

  28.   hi2c2.Instance = I2C2;
  29.   hi2c2.Init.Timing = 0x0000020B;
  30.   hi2c2.Init.OwnAddress1 = 0;
  31.   hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  32.   hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  33.   hi2c2.Init.OwnAddress2 = 0;
  34.   hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  35.   hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  36.   hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  37.   if (HAL_I2C_Init(&hi2c2) != HAL_OK)
  38.   {
  39.     Error_Handler();
  40.   }

  41.     /**Configure Analogue filter
  42.     */
  43.   if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  44.   {
  45.     Error_Handler();
  46.   }

  47. }
复制代码


3、循环发送数据;

  1. int main(void)
  2. {

  3.   /* USER CODE BEGIN 1 */
  4.     uint8_t data[2] = {0x75, 0x04};
  5.   /* USER CODE END 1 */

  6.   /* MCU Configuration----------------------------------------------------------*/

  7.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  8.   HAL_Init();

  9.   /* Configure the system clock */
  10.   SystemClock_Config();

  11.   /* Initialize all configured peripherals */
  12.   MX_GPIO_Init();
  13.   MX_I2C2_Init();

  14.   /* USER CODE BEGIN 2 */
  15.     if(HAL_OK != HAL_I2C_IsDeviceReady(&hi2c2, (uint16_t)0xD0, 3, 1000))
  16.     {
  17.         hi2c2.Instance->CR1 |= I2C_CR1_SWRST;
  18.         hi2c2.Instance->CR1 &= ~I2C_CR1_SWRST;
  19.         HAL_Delay(2);
  20.     }

  21.   /* USER CODE END 2 */

  22.   /* Infinite loop */
  23.   /* USER CODE BEGIN WHILE */
  24.     while(1)
  25.     {
  26.   /* USER CODE END WHILE */

  27.   /* USER CODE BEGIN 3 */
  28.         HAL_Delay(20);
  29.         HAL_I2C_Master_Transmit(&hi2c2, (uint16_t)0xD0, data, sizeof(data), 5);
  30.     }

  31.   /* USER CODE END 3 */

  32. }
复制代码


4、用逻辑分析仪测量SCL和SDA,发现只有SDA有波形数据,而SCL一直为高,换I2C1和I2C3情况相同;
5.png

放大后

放大后


目前小弟水深火热中,请各位大神出手搭救
收藏 2 评论3 发布时间:2016-10-26 16:04

举报

3个回答
snowfox 最优答案 回答时间:2016-10-28 21:07:24
问题已解决,是STM32F302芯片IO损坏,更换后正常。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

高二毛 回答时间:2016-10-26 17:36:36
你可以尝试先用模拟I2C的方式调试一下,如果OK,再调试I2C的。这样可以先保证硬件连接没有问题。如果没有问题,剩下就是你配置的问题了。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

snowfox 回答时间:2016-10-26 18:39:58
硬件连接没问题,同一个板子使用STM32F103C8T6使用硬件I2C驱动没问题,替换为STM32F302才出现这个问题,目前应急方案是先用IO模拟I2C方法,但希望有人能解决这个问题,让其他人以后可以少走弯路。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版