我使用STM32与SPIFLASH做了一个U盘,使用SPI通信都能很正常的工作,但速度不快最多只能达到30KBPS。后来是同DMA-SPI速度是上去了,也能读写,但就是格式化不了,一下两段代码分别是SPI通信与DMA-SPA通信,请教是哪边出了问题。
SPI:
void W25X_Write_Bytes(uint32_t nSector,u8* pBuffer, u16 nBytes)
{
u16 i;
uint32_t k1;
for(i=0;i<nBytes;i++)
{
W25X_Write_Enable();
FLASH_CS_0();
SPI_Write_Byte(W25X_PageProgram);
SPI_Write_Byte((u8)(((nSector+i) & 0xFFFFFF) >> 16)); /* 发送3个字节的地址信息 */
SPI_Write_Byte((u8)(((nSector+i) & 0xFFFF) >> 8));
SPI_Write_Byte((u8)(nSector+i) & 0xFF);
k1=nSector+i;
// for(i=0;i<nBytes;i++)
SPI_Write_Byte(pBuffer);
FLASH_CS_1();
W25X_Wait_Busy();
}
}
DMA_SPI:
#define DMA_BUFFER_SIZE 128
static uint8_t _spi_flash_buffer[ DMA_BUFFER_SIZE ];void W25X_Write_Bytes(uint32_t nSector,u8* pBuffer, u16 nBytes)
{
u16 i;
uint32_t k1,k2,k3;
for(i=0; i<nBytes/DMA_BUFFER_SIZE; i++)
{
W25X_Write_Enable();
FLASH_CS_0();
SPI_Write_Byte(W25X_PageProgram);
k1=nSector+i*DMA_BUFFER_SIZE;
SPI_Write_Byte((u8)((nSector+i*DMA_BUFFER_SIZE) & 0xFFFFFF >> 16)); /* 发送3个字节的地址信息 */
k2=nSector+i*DMA_BUFFER_SIZE;
SPI_Write_Byte((u8)((nSector+i*DMA_BUFFER_SIZE) & 0xFFFF >> 8));
k3=nSector+i*DMA_BUFFER_SIZE;
SPI_Write_Byte((u8)((nSector+i*DMA_BUFFER_SIZE) & 0xFF) );
memcpy(_spi_flash_buffer,pBuffer+i*DMA_BUFFER_SIZE,DMA_BUFFER_SIZE);
DMA_Txconfig((uint32_t )_spi_flash_buffer, DMA_BUFFER_SIZE);
DMA_Cmd(DMA1_Channel5, ENABLE);
DMA_Cmd(DMA1_Channel4, ENABLE);
while (!(DMA_GetFlagStatus(DMA1_FLAG_TC5)));
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx , DISABLE);
}
FLASH_CS_1();
W25X_Wait_Busy();
}
其中DMA_Txconfig((uint32_t )_spi_flash_buffer, DMA_BUFFER_SIZE) 是对DMA进行配置
|