我在测试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);
}
}
}