新手入门
- 积分
- 18
- 金钱
- 18
- 注册时间
- 2017-11-17
- 在线时间
- 2 小时
|
3金钱
各位大佬好!
我在F0的SPI以DMA的方式往NRF发送数据(以正常的方式,不是循环方式)
void SPI1_DMA_Configuration( void )
{
//RCC_AHBPeriph_DMA1
DMA_InitTypeDef DMA_InitStructure;
/* DMA1 Channel12 RX*/
DMA_DeInit(DMA1_Channel4);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(SPI2->DR));//?? SPI1 ????(0x4001300C) ??(????)
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI1_RX_Buff; //?? SRAM ????(????)
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //???? ??-??
DMA_InitStructure.DMA_BufferSize = SPI_SendBufferSize; //?? SPI1 ????
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //only once
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, DISABLE); //DISABLE finish trans IRQ
DMA_ITConfig(DMA1_Channel4, DMA_IT_TE, DISABLE); //DISABLE error IRQ
/* DMA1 Channel5 (triggered by SPI1 Tx event) Config */
DMA_DeInit(DMA1_Channel5);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(SPI1->DR));
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI1_TX_Buff;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = SPI_SendBufferSize;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //only once
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, DISABLE); //DMA1_Channel3 end intrrupt-No!!!
DMA_ITConfig(DMA1_Channel5, DMA_IT_TE, DISABLE); //DMA1_Channel3 error intrrupt
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); //enable spi DMA send
SPI_Cmd(SPI2, ENABLE);
}
//真正写DMA
void SPI_DMA_Write(U8 *buff, U32 len)
{
DMA_Cmd(DMA1_Channel5, DISABLE);
DMA1_Channel5->CPAR = (uint32_t)(&(SPI2->DR));
DMA1_Channel5->CMAR = (U32) buff;
DMA1_Channel5->CNDTR = len;
DMA_Cmd(DMA1_Channel5, ENABLE);
//uart_puts("SPI_DMA_Write \r\n");
Delay_us(150);
while ( DMA_GetFlagStatus(DMA1_FLAG_TC5) == RESET );
}
//封装的接口
unsigned char SPI_DMA_WriteBuf(unsigned char reg, unsigned char buf[], unsigned char len)
{
U8 status;
CSN_0;
status = SPI_WRByte( reg);
SPI_DMA_Write(buf, len);
CSN_1;
return status;
}
这里我必须要最少等待50us,而不是10us,请问下是什么原因
|
|