gpt4 book ai didi

c - STM Nucleo I2C 未发送所有数据

转载 作者:行者123 更新时间:2023-12-01 22:03:38 26 4
gpt4 key购买 nike

编辑:

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

<小时/>

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

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

到目前为止,它只发送了我请求发送的大约一半数据。我已经使用简单的“显示固件”命令对其进行了测试,并且该命令有效。这样我就可以验证 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 .

最佳答案

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

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

首先进入配置: step 1

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

关于c - STM Nucleo I2C 未发送所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40028291/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com