打印
[STM32F3]

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

[复制链接]
2906|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本人在一个项目中使用了STM32F302C8T6这个芯片,碰到硬件I2C奇怪的问题,过程如下:

1、通过STM32CubeMX生成初始代码;



2、初始代码如下;

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   
    PA9     ------> I2C2_SCL
    PA10     ------> I2C2_SDA
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

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

  /* USER CODE END I2C2_MspInit 1 */
  }

}

/* I2C2 init function */
static void MX_I2C2_Init(void)
{

  hi2c2.Instance = I2C2;
  hi2c2.Init.Timing = 0x0010020A;
  hi2c2.Init.OwnAddress1 = 0;
  hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c2.Init.OwnAddress2 = 0;
  hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c2) != HAL_OK)
  {
    Error_Handler();
  }

    /**Configure Analogue filter
    */
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  {
    Error_Handler();
  }

}


3、循环发送数据;

int main(void)
{

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

  /* MCU Configuration----------------------------------------------------------*/

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

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C2_Init();

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

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
    while(1)
    {
  /* USER CODE END WHILE */

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

  /* USER CODE END 3 */

}



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





目前小弟水深火热中,请各位大神出手搭救
沙发
airwill| | 2016-10-26 21:19 | 只看该作者
SCL 为高的条件下, 除了开始和终止信号, 是不允许 SDA 信号变化的

使用特权

评论回复
板凳
tanganrong|  楼主 | 2016-10-26 22:55 | 只看该作者
这个是硬件I2C,因为SCL没有输出才出现这种情况。

使用特权

评论回复
地板
tanganrong|  楼主 | 2016-10-28 21:14 | 只看该作者
终于找到了问题,因STM32F302芯片部分损坏,更换后正常,结帖。

使用特权

评论回复
5
18268212286| | 2016-11-3 13:01 | 只看该作者
请问你这张截图是什么开发平台可以分享下吗‘

使用特权

评论回复
6
tanganrong|  楼主 | 2016-11-22 10:01 | 只看该作者
18268212286 发表于 2016-11-3 13:01
请问你这张截图是什么开发平台可以分享下吗‘

你是问第一张图吗,是STM32CubeMX,ST官网上可下载,用来生成初始代码。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

68

帖子

3

粉丝