解决方案是关闭初始化模块中的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驱动程序有任何特殊要求。我是否对该计划做错了什么?
我也尝试过使用也是由CubeMX创建的非DMA阻塞模式轮询传输功能
HAL_I2C_Master_Transmit(&hi2c1, (0x50), hi, 6, 1000);
情况更糟,只有continuously spams the screen with unintelligible text。