高中生
最后登录1970-1-1
在线时间 小时
注册时间2016-7-23
|
发表于 2016-8-30 22:34:58
|
显示全部楼层
火哥,我上传了我的SPI+DMA的测试程序,spi+DMA自发自收,是用火哥的例程改的,有用的信息就是两个DMA初始化和一个主函数,其他没用的也没全删。
杜板线短接B14 B15 按按钮PC13发送数据,串口显示接收到的数据。
问题说明:
下面函数主循环里,使用方案1,其实就是调用下面的函数SPI2_ReadWriteByte(),但是就会卡在
/* Loop while DR register in not emplty */
while(SPI_I2S_GetFlagStatus(VS_SPI,SPI_I2S_FLAG_TXE) == RESET);
这句话里,如果直接使用方案2,普通spi传输就没问题,
方案3是spi+DMA 发送,三种方案都是用DMA接收。
火哥能否解答一下为啥方案1会卡死。感觉和SPI2->TXE寄存器有关。
while(1)
{
if( Key_Scan(GPIOC,GPIO_Pin_13,0) == KEY_ON )
{
printf("\r\n PC13按下");
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);
//DMA_SetCurrDataCounter(DMA1_Channel4,VS1053_SPI2_DMA_SendBuff_size);//DMAͨµÀµÄDMA»º´æµÄ´óС
DMA_Cmd(DMA1_Channel4,ENABLE);
printf("\r\n DMA1通道4已使能");
for(SPInum=0;SPInum<32;SPInum++)
{
/*方案1*/
//VS_SPI_ReadWriteByte(VS1053_SPI2_DMA_SendBuff[SPInum]);
/*方案2*/
//SPI_I2S_SendData(SPI2, VS1053_SPI2_DMA_SendBuff[SPInum]);
}
/*·方案3start*/
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
DMA_Cmd(DMA1_Channel5,ENABLE);
while(!DMA_GetFlagStatus(DMA1_FLAG_TC5));
printf("\r\n SPI发送完毕");
/*·方案3end*/
while(!DMA_GetFlagStatus(DMA1_FLAG_TC4));
printf("\r\n SPI接收完毕");
DMA_Cmd(DMA1_Channel4,DISABLE);
printf("\r\n DMA1通道4已关闭");
printf("\r\n SPI数据为\r\n");
for(SPInum=0;SPInum<32;SPInum++)
{
printf("VS1053_SPI2_DMA_ReceiveBuff[%d]=%X\r\n",SPInum,VS1053_SPI2_DMA_ReceiveBuff[SPInum]);
}
}
}
unsigned char SPI2_ReadWriteByte(unsigned char writedat)
{
/* Loop while DR register in not emplty */
while(SPI_I2S_GetFlagStatus(VS_SPI,SPI_I2S_FLAG_TXE) == RESET);
/* Send byte through the SPI1 peripheral */
SPI_I2S_SendData(VS_SPI, writedat);
/* Wait to receive a byte */
while(SPI_I2S_GetFlagStatus(VS_SPI, SPI_I2S_FLAG_RXNE) == RESET);
/* Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(VS_SPI);
}
|
|