在 STM32G474

问题描述

我有一个正在使用的 LCD 屏幕,它要求发送的第一个 spi 数据包长度为 10 位,所有后续数据包的长度均为 8 位。所以 commands 是 10 位,data 是位。必须在同一事务中的命令之后向设备发送数据。

我尝试了一些利用 HAL 的实现,但它们似乎都在 MOSI 和 CLK 线路上引起了一些奇怪的行为。

方法 1:使用 HAL

void set_spi_size_10(SPI_HandleTypeDef *hspi)
{
    HAL_SPI_DeInit(hspi);
    hspi->Init.DataSize = SPI_DATASIZE_10BIT;
    HAL_SPI_Init(hspi);
}

void set_spi_size_8(SPI_HandleTypeDef *hspi)
{
    HAL_SPI_DeInit(hspi);
    hspi->Init.DataSize = SPI_DATASIZE_8BIT;
    HAL_SPI_Init(hspi);
}

void send_data() 
{
    set_spi_size_10(&hspi2);
    HAL_SPI_Transmit(&hspi2,some_buffer,HAL_MAX_DELAY);
    set_spi_size_8(&hspi2);
}

方法二:寄存器操作

void set_spi_size_10(SPI_HandleTypeDef *hspi)
{

    __HAL_SPI_disABLE(hspi);
    hspi->Init.DataSize = SPI_DATASIZE_10BIT;
    uint32_t frxth = SPI_RXFIFO_THRESHOLD_HF;
    WRITE_REG(hspi->Instance->CR2,(((hspi->Init.NSS >> 16U) & SPI_CR2_SSOE) |
                                    (hspi->Init.TIMode & SPI_CR2_FRF) |
                                    (hspi->Init.NsspMode & SPI_CR2_Nssp) |
                                    (SPI_DATASIZE_10BIT & SPI_CR2_DS_Msk) |
                                    (frxth & SPI_CR2_FRXTH)));
    __HAL_SPI_ENABLE(hspi);
}

void set_spi_size_8(SPI_HandleTypeDef *hspi)
{
    __HAL_SPI_disABLE(hspi);

    hspi->Init.DataSize = SPI_DATASIZE_8BIT;
    uint32_t frxth = SPI_RXFIFO_THRESHOLD_QF;
    WRITE_REG(hspi->Instance->CR2,(((hspi->Init.NSS >> 16U) & SPI_CR2_SSOE) |
                                    (hspi->Init.TIMode & SPI_CR2_FRF) |
                                    (hspi->Init.NsspMode & SPI_CR2_Nssp) |
                                    (SPI_DATASIZE_8BIT & SPI_CR2_DS_Msk) |
                                    (frxth & SPI_CR2_FRXTH)));
    __HAL_SPI_ENABLE(hspi);
}

单独使用这些函数时,它们工作正常,但是当一个一个地使用这些函数时,事务无法正常工作。

使用逻辑分析仪,我可以看到初始化/取消初始化时间似乎相当长,并且在重新初始化时会导致 CLK 和 MOSI 线路发生意外变化。

如果可能的话,我不想将数据弄乱,但这是另一种选择。 (看看设备制造商的例子,这是他们采取的方法)。

https://www.newhavendisplay.com/specs/NHD-0420DZW-AB5.pdf https://github.com/NewhavenDisplay/NHD-0420DZW_Example/blob/main/NHD-0420DZW_Serial/NHD-0420DZW_Serial.ino

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)