最近做项目需要使用SPI+DMA,为了做实验感受DMA传输数据块,本人以SPI+DMA来读取flash中的数据。网上有很多例程是spi直接读取flash,无法提高性能。因为只是简单的实验SPI的DMA功能,所以在写数据时并没有考虑页写一些制约,只是简单的将1k大小的数据写入flash,然后用DMA读出这1K大小的数据,相信SPI和DMA的配置大家都很熟悉了,本人在此不在强调,只是说几点注意点的:
(1)DMA关于SPI通道的选择,在stm32中,SPI1_RX读请求是DMA通道2,SPI1_TX发送请求是DMA通道3。刚开始我在配置通道的时候没仔细看,看的是SPI/I2S2_RX这个请求,把通道配置成了通道四和通道五,结果一直无法出来结果。所以这个是第一个要注意的。
(2)设置发送和接收缓冲区,并且对发送缓冲区初始化,本例中我设定发送和接收缓冲区大小是1K,可以根据自己需要设定,本帖子起抛砖引玉作用。
uint32_t Tx_Buffer[256];
uint32_t Rx_Buffer[256];
对发送缓冲区初始化:
for(i = 0; i< 256; i++)
{
Tx_Buffer[i] = i;
}
下面是对DMA的初始化,本例中没有用到中断。
void DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
/*开启时钟*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);