spi+dma接收,dma失能后不能使能
/*在調試dma的時候遇到不理解的問題,spi從機模式,接收主機的數據,第一個cs低電平搬運的數據是3個或5個FF
另外使用正常的操作,讀取dma剩余字節,關閉dma,處理數據,重新初始化dma,不要這段數據了,因為每次接收數據不固定
執行這個操作時,dma第一次開啟打不開,重新初始化也沒用,關掉dma失能,第二次可以看到緩沖區有數據,但是接受字節為0
無法進行依賴的操作
/
/FF的問題還是沒有解決,但是因為只有第一幀,所以把第一幀丟掉了,然后測試功能,
從機額外一根引腳鏈接片選,檢測cs上升沿信號(spi接受完一幀數據)
使用十分平常的方法,進外部中斷檢測dma還剩多少數據未傳輸,以計算傳輸多少數據
失能dma通道,處理接收的數據,然后重新配置dma目標地址,使數據從0地址開始,重復流程已接受處理不同長度的數據
在調試過程中,失能dma通道后無法再次開啟dma,嘗試失能spidma接收標志,重置dma,重新初始化,重新失能dmamux模塊
都沒有用,原本想重新寫一個初始化,懷疑因為代碼重重包裝漏掉了那一步,但是查詢參考手冊,dma章節沒有怎么設置目標地址
源地址的遞增這些,倒是有地址偏移和接收數據偏移。自己配置并沒有成功
于是聯系廠家,在廠家調試后告訴我調用一個函數,然后好了
函數里進行如下配置
重置dma*
(void)Dma_ResetChannel(pHWUnitCfg->u8TxDmaChannel);
(void)Dma_ResetChannel(pHWUnitCfg->u8RxDmaChannel);
等待spi空閑,移位寄存器無數據*
while (0U != u32RegVal_SR);
清楚接收和發送fifo*
u32RegVal_FSR = ((Spi_GetFSRConfig()) & (SPI_FSR_TFCNT_U32 | SPI_FSR_RFCNT_U32));
****初始化spi
****使能spi,spidubug標志
****因為使用dma,所以使能spidma接收和發送
- Discard all frames in FIFO *
Spi_CRConfig(pSpiDev->pHWUnitCfg->u8HWOffset, SPI_CR_SWRST_U32); - Enable SPI *
Spi_CRConfig(pSpiDev->pHWUnitCfg->u8HWOffset, (SPI_CR_SPEN_U32 | SPI_CR_DBGEN_U32)); - DMA Transmit and Receive Data Enable *
if (STD_OFF != SPI_DMA_SUPPORT)
if (FALSE != pSpiDev->pHWUnitCfg->u16UseDma)
{
SPI_PTR[pSpiDev->pHWUnitCfg->u8HWOffset]->DER = (SPI_DER_RDMEN_U32 | SPI_DER_TDMEN_U32);
}
****再配置dma的接收發送目標地址
****開啟spidma發送
相對這個步驟并沒有初始化spi,沒有清除發送接收緩沖區,另外確實有些中間變量標志位
*/
浙公網安備 33010602011771號