1、背景
某客戶在使用 STM32U595QII6Q 開(kāi)發(fā)產(chǎn)品時(shí)發(fā)現(xiàn),使用該芯片的 SPI3 與對(duì)方通信時(shí),如果發(fā)送的數(shù)據(jù)超過(guò) 1024 字節(jié)時(shí),SPI3 作為主設(shè)備,使用 HAL 庫(kù)的 SPI 相關(guān)發(fā)送函數(shù),發(fā)送完成回調(diào)函數(shù)不會(huì)執(zhí)行。
2、問(wèn)題復(fù)盤(pán)
鑒于沒(méi)有 STM32U595QII6Q 對(duì)應(yīng)的開(kāi)發(fā)板,于是使用 NUCLEO-U575ZI-Q 復(fù)現(xiàn)問(wèn)題。
2.1. 復(fù)盤(pán)
2.1.1. 運(yùn)行例程
客戶在項(xiàng)目里還涉及了 LPDMA 外設(shè),于是選擇了 en.stm32cubeu5-v1-6-0STM32Cube_FW_U5_V1.6.0ProjectsNUCLEO-U575ZIQExamplesSPISPI_FullDuplex_ComDMA_LowPower_Master運(yùn)行發(fā)現(xiàn)結(jié)果正常。
2.1.2. 修改數(shù)據(jù)長(zhǎng)度
首先將長(zhǎng)度修改為(512<<0),數(shù)據(jù)內(nèi)容填充為 0xa5,測(cè)試發(fā)現(xiàn)一切正常。然后將長(zhǎng)度修改為(512<<1),發(fā)現(xiàn)的確 HAL_SPI_TxRxCpltCallback 未被執(zhí)行。注意,此時(shí) SPI3 工作duplex mode。
2.1.3. 最小化系統(tǒng)
利用 stm32cubeMX 配置了一個(gè)工程,SPI3 工作在 half-duplex mode。測(cè)試結(jié)果與上面的類(lèi)似。
3、分析
檢查正常時(shí)(數(shù)據(jù)長(zhǎng)度為 512),SPI3 狀態(tài)寄存器的值。
4、建議
對(duì)于 stm32u5 系列 mcu,如果 SPI3 都有此長(zhǎng)度限制,建議將驅(qū)動(dòng)代碼修改如下:
if ((hspi->hdmarx->Mode == DMA_LINKEDLIST_CIRCULAR) &&
(hspi->hdmatx->Mode == DMA_LINKEDLIST_CIRCULAR))
{
MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, 0UL);
}
else
{
If( SPI3 == hspi->Instance && Size >= 1023)
{
status = HAL_ERROR;
}
else
{
MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, Size);
}
}
5、小結(jié)
客戶在使用 stm32u575/u585/u595 系列 mcu SPI3 時(shí),請(qǐng)注意傳輸數(shù)據(jù)長(zhǎng)度,不能超過(guò)1024。