STM Nucleo I2C不发送所有数据

时间:2016-10-13 18:24:04

标签: c microcontroller stm32 i2c freertos

编辑:

解决方案是关闭初始化模块中的I2C时钟。尽管STM可以处理它,但LCD的数据表表明它只能处理高达10kHz的频率 对于DMA,必须在CubeMX软件中启用并设置IRQ,以启用DMA TX / RX线路。

我正在使用带有freeRTOS的STM32 - Nucleo-F401RE板。我最近使用过freeRTOS,但我从来没有真正使用过I2C。

尝试使用CubeMX生成的I2C驱动程序设置简单的LCD display

到目前为止,它只发送了我请求发送的大约一半数据。 我用简单的“show firmware”命令对它进行了测试,这很有效。所以我可以验证I2C实例是否正确设置。

/* I2C1 init function */
static void MX_I2C1_Init(void)
{

  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    Error_Handler();
  }

}

它还具有国际上拉电阻。

/* vdebugTask function */
void vdebugTask(void const * argument)
{
  /* USER CODE BEGIN vdebugTask */

  /* Infinite loop */
  for(;;)
  {
        char hi[6];
        hi[0]   = 'h';
        hi[1]   = 'e';
        hi[2]   = 'y';
        hi[3]   = 'a';
        hi[4]   = 'h';
        hi[5]   = '!';

        HAL_I2C_Master_Transmit_DMA(&hi2c1, (0x50), hi, 6);
        vTaskDelay(10);
  }
  /* USER CODE END vdebugTask */
}

这是我试图运行的代码,我根本没有改变HAL功能。我不认为它可能比这更简单,但这就是发生的一切。

我遵循了LCD数据表中的时序限制,并且CubeMX软件没有警告或说明他们的I2C驱动程序有任何特殊要求。我是否对该计划做错了什么?

missignletters

我也尝试过使用也是由CubeMX创建的非DMA阻塞模式轮询传输功能

HAL_I2C_Master_Transmit(&hi2c1, (0x50), hi, 6, 1000);

情况更糟,只有continuously spams the screen with unintelligible text

1 个答案:

答案 0 :(得分:2)

解决方案是关闭初始化模块中的I2C时钟。尽管STM可以处理它,但LCD的数据表表明它只能处理高达10kHz的频率。 对于DMA,必须在CubeMX软件中启用并设置IRQ,以启用DMA TX / RX线。

请注意,时钟仍必须符合硬件限制。我认为比数据表中规定的最大值少大约20%就足够了。对于我的LCD,这意味着我将使用80kHz。

首先进入配置: step 1

然后单击DMA以设置DMA请求。我只选择了TX,因为我不关心LCD上的RX DMA。 step 2