我在測試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);

}

}

}