配置:
// Configures the DMA1 Channel0 for SPI3 Rx request.
void SPI_LowLevel_DMA_RxConfig(uint32_t *SPI3_Buffer_Rx, uint32_t BufferSize){
DMA_InitTypeDef DFDMA_InitStructure;
DMA_ClearFlag(DataFlash_SPI_DMA_STREAM_RX, DataFlash_SPI_DMA_FLAG_FEIF0 | DataFlash_SPI_DMA_FLAG_DMEIF0 | DataFlash_SPI_DMA_FLAG_TEIF0 | DataFlash_SPI_DMA_FLAG_HTIF0 | DataFlash_SPI_DMA_FLAG_TCIF0);
// DMA2 Stream3 disable
DMA_Cmd(DataFlash_SPI_DMA_STREAM_RX, DISABLE);
// DMA2 Stream3 Config
DMA_DeInit(DataFlash_SPI_DMA_STREAM_RX);
DFDMA_InitStructure.DMA_Channel = DataFlash_SPI_DMA_CHANNEL;
DFDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI3_DR_ADDR;
DFDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)SPI3_Buffer_Rx;
DFDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DFDMA_InitStructure.DMA_BufferSize = BufferSize;
DFDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DFDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DFDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DFDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DFDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DFDMA_InitStructure.DMA_Priority = DMA_Priority_High;
DFDMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
DFDMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DFDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DFDMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DataFlash_SPI_DMA_STREAM_RX, &DFDMA_InitStructure);
DMA_ITConfig(DataFlash_SPI_DMA_STREAM_RX, DMA_IT_TC, ENABLE);
DMA_FlowControllerConfig(DataFlash_SPI_DMA_STREAM_RX, DMA_FlowCtrl_Peripheral);
// DMA2 Stream3 enable
DMA_Cmd(DataFlash_SPI_DMA_STREAM_RX, ENABLE);
}
// Configures the DMA1 Channel0 for SPI3 Tx request.
void SPI_LowLevel_DMA_TxConfig(uint32_t *SPI3_Buffer_Tx, uint32_t BufferSize) {
DMA_InitTypeDef DFDMA_InitStructure;
DMA_ClearFlag(DataFlash_SPI_DMA_STREAM_TX, DataFlash_SPI_DMA_FLAG_FEIF5 | DataFlash_SPI_DMA_FLAG_DMEIF5 | DataFlash_SPI_DMA_FLAG_TEIF5 | DataFlash_SPI_DMA_FLAG_HTIF5 | DataFlash_SPI_DMA_FLAG_TCIF5);
// DMA2 Stream3 disable
DMA_Cmd(DataFlash_SPI_DMA_STREAM_TX, DISABLE);
// DMA2 Stream3 Config
DMA_DeInit(DataFlash_SPI_DMA_STREAM_TX);
DFDMA_InitStructure.DMA_Channel = DataFlash_SPI_DMA_CHANNEL;
DFDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI3_DR_ADDR;
DFDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)SPI3_Buffer_Tx;
DFDMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DFDMA_InitStructure.DMA_BufferSize = BufferSize;
DFDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DFDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DFDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DFDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DFDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DFDMA_InitStructure.DMA_Priority = DMA_Priority_High;
DFDMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
DFDMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DFDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DFDMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DataFlash_SPI_DMA_STREAM_TX, &DFDMA_InitStructure);
DMA_FlowControllerConfig(DataFlash_SPI_DMA_STREAM_TX, DMA_FlowCtrl_Peripheral);
DMA_Cmd(DataFlash_SPI_DMA_STREAM_TX, ENABLE);
}
调用:
读:
TestStatus dataflash_read_flash(unsigned int PageAddr,unsigned int ByteAddr,
unsigned char *DataBuffer,unsigned long ByteNum)
{
unsigned long i;
if(ByteNum<=4325376)//欲读取的数据在片内 ,范围:8192*528 Bytes
{
while(!(StatusRegisterRead()&0x80));// Busy or not
Select_Flash();
SPI_Flash_WriteByte(Continuous_Array_Read_Cmd);
SPI_Flash_WriteByte((unsigned char)(PageAddr>>6));
SPI_Flash_WriteByte((unsigned char)((PageAddr<<2)|(ByteAddr>>8)));
SPI_Flash_WriteByte((unsigned char)ByteAddr);
SPI_Flash_WriteByte(0x00); //使用命令03H时,不用再输入无用的数剧,但命令为E8H(加4个)或0BH(加1个)需加无用数据以完成读操作的初始化
SPI_Flash_WriteByte(0x00);
SPI_Flash_WriteByte(0x00);
SPI_Flash_WriteByte(0x00);
SPI_LowLevel_DMA_RxConfig((uint32_t *)DataBuffer,ByteNum);
SPI_I2S_DMACmd(SPI3, SPI_I2S_DMAReq_Rx, ENABLE);
NotSelect_Flash();
return    ASSED;
}
return FAILED;
}
写:
TestStatus DataToPage_ViaBuffer_WithErase_SecWay(unsigned char BufferNumber,unsigned int PageAddr,unsigned int ByteAddr,
unsigned char *Data,unsigned int ByteNum)
{
unsigned int i;
if((ByteNum<=(528-ByteAddr))&&(ByteNum>0))
{
while(!(StatusRegisterRead()&0x80));
Select_Flash();
switch(BufferNumber)
{
case 1: SPI_Flash_WriteByte(0x82);break;
case 2: SPI_Flash_WriteByte(0x85);break;
}
SPI_Flash_WriteByte((unsigned char)(PageAddr>>6));
SPI_Flash_WriteByte((unsigned char)((PageAddr<<2)|(ByteAddr>>8)));
SPI_Flash_WriteByte((unsigned char)ByteAddr);
SPI_I2S_DMACmd(SPI3,SPI_I2S_DMAReq_Tx, DISABLE);
SPI_LowLevel_DMA_TxConfig((uint32_t *)Data,ByteNum);
if( SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) )
{
SPI_I2S_DMACmd(SPI3, SPI_I2S_DMAReq_Tx, ENABLE);
}
NotSelect_Flash();
return PASSED;
}
return FAILED;
}
|