我在測試SPI DMA傳輸?shù)臅r候,計劃每次發(fā)送不同的BUFF,我準(zhǔn)備了兩個數(shù)組,用DMA的方式。
讀取到首字節(jié),然后配置DMA發(fā)送。我測試程序,用的SPI速率約50Hz左右,很慢的。
問題是,
第一次讀的是spiBuff,第二次又是讀的spiBuff,
之后的讀取,就是我要的,spiBuff,spiBuff2,spiBuff,spiBuff2
為什么第一次和第二次會相同呢? DMA還有什么主意事項嗎?我的操作方法是否有不合理的地方?
//SPI0 中斷服務(wù)函數(shù)程序
UINT8 testF = 0;
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void SPI0_IRQHandler(void)
{
UINT8 temp;
if(SendOrRecvMode == RECEIVE_MODE)//接收模式
{
if(SPI0_GetITFlag(RB_SPI_IF_FST_BYTE))
{
temp = (UINT8)(R8_SPI0_BUFFER);
PRINT("F = %02X\n", temp);
SPI0_ClearITFlag(RB_SPI_IF_FST_BYTE);//重置首字節(jié)接收中斷標(biāo)記
SPI0_ClearITFlag(RB_SPI_IF_BYTE_END);
SPI0_ITCfg( ENABLE, RB_SPI_IE_BYTE_END);//啟用字節(jié)傳輸完成中斷
if( temp & 0x80)//讀指令,即將進(jìn)入發(fā)送模式
{
PRINT("SEND_MODE\n");
SendOrRecvMode = SEND_MODE;
GPIOB_ModeCfg(SPI_MISO_PIN, GPIO_ModeOut_PP_5mA);//配置MISO發(fā)送
R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR;?
if(testF)
{
testF = 0;
R16_SPI0_DMA_BEG = (UINT32)(spiBuff);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
R16_SPI0_DMA_END = (UINT32)(spiBuff + REC_BUFF_LEN);
}
else
{
testF = 1;
R16_SPI0_DMA_BEG = (UINT32)(spiBuff2);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
R16_SPI0_DMA_END = (UINT32)(spiBuff2 + REC_BUFF_LEN);
}
R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END|RB_SPI_IF_DMA_END|RB_SPI_IF_FIFO_OV;
R8_SPI0_CTRL_CFG |= RB_SPI_DMA_ENABLE;
SPI0_ITCfg(ENABLE, RB_SPI_IE_FIFO_OV);/**/
}
else
{
PRINT("RECEIVE_MODE\n");
}
}
else if(SPI0_GetITFlag(RB_SPI_IF_BYTE_END))//接收完單個字節(jié)
{
PRINT("R = %02X\n", (UINT8)(R8_SPI0_BUFFER));
SPI0_ClearITFlag(RB_SPI_IF_BYTE_END);
}
}
else//指令已經(jīng)成立,發(fā)送模式
{
if(SPI0_GetITFlag(RB_SPI_IF_BYTE_END))//接收完單個字節(jié)
{
PRINT("R = %02X\n", (UINT8)(R8_SPI0_BUFFER));
SPI0_ClearITFlag(RB_SPI_IF_BYTE_END);
}
if(SPI0_GetITFlag(RB_SPI_IF_FIFO_OV))//FIFO空,需要繼續(xù)送數(shù)據(jù)
{
PRINT("RB_SPI_IE_FIFO_OV\n");
SPI0_ClearITFlag(RB_SPI_IF_FIFO_OV);
}
}
}