我在测试SPI DMA传输的时候,计划每次发送不同的BUFF,我准备了两个数组,用DMA的方式。

读取到首字节,然后配置DMA发送。我测试程序,用的SPI速率约50Hz左右,很慢的。

问题是,

第一次读的是spiBuff,第二次又是读的spiBuff,

之后的读取,就是我要的,spiBuff,spiBuff2,spiBuff,spiBuff2

为什么第一次和第二次会相同呢? DMA还有什么主意事项吗?我的操作方法是否有不合理的地方?


//SPI0 中断服务函数程序

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);//重置首字节接收中断标记

SPI0_ClearITFlag(RB_SPI_IF_BYTE_END);

SPI0_ITCfg( ENABLE, RB_SPI_IE_BYTE_END);//启用字节传输完成中断

if( temp & 0x80)//读指令,即将进入发送模式

{

PRINT("SEND_MODE\n");

SendOrRecvMode = SEND_MODE;

GPIOB_ModeCfg(SPI_MISO_PIN, GPIO_ModeOut_PP_5mA);//配置MISO发送

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))//接收完单个字节

{

PRINT("R = %02X\n", (UINT8)(R8_SPI0_BUFFER));

SPI0_ClearITFlag(RB_SPI_IF_BYTE_END);

}

}

else//指令已经成立,发送模式

{

if(SPI0_GetITFlag(RB_SPI_IF_BYTE_END))//接收完单个字节

{

PRINT("R = %02X\n", (UINT8)(R8_SPI0_BUFFER));

SPI0_ClearITFlag(RB_SPI_IF_BYTE_END);

}

if(SPI0_GetITFlag(RB_SPI_IF_FIFO_OV))//FIFO空,需要继续送数据

{

PRINT("RB_SPI_IE_FIFO_OV\n");

SPI0_ClearITFlag(RB_SPI_IF_FIFO_OV);

}

}

}