问题描述
我有一个正在使用的 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 (将#修改为@)