初级会员

- 积分
- 84
- 金钱
- 84
- 注册时间
- 2019-7-30
- 在线时间
- 29 小时
|
1金钱
项目用的stmf103平台,用到三个spi口,配置成dma接收中断模式。spi1 没问题,但是初次上电 spi2 spi3接收的数据为0,单片机必须重启一下,接收的数据才正确。那位大神解释一下?void SI24R1_Init(SI24R1_FuncInfo_TypeDef *p_PortInit)
{
SPI_TypeDef *SPIx = p_PortInit->SPIx;
SPI_InitTypeDef SPI_InitStruct;
NVIC_InitTypeDef NVIC_InitStructure;
if(SPIx == SPI1)
{
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );
p_PortInit->DMAy_ChannelRX = DMA1_Channel2;
p_PortInit->DMAy_ChannelTX = DMA1_Channel3;
p_PortInit->DMAy_FlagRX = DMA1_FLAG_TC2;
p_PortInit->DMAy_FlagTX = DMA1_FLAG_TC3;
}
else if(SPIx == SPI2)
{
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );
p_PortInit->DMAy_ChannelRX = DMA1_Channel4;
p_PortInit->DMAy_ChannelTX = DMA1_Channel5;
p_PortInit->DMAy_FlagRX = DMA1_FLAG_TC4;
p_PortInit->DMAy_FlagTX = DMA1_FLAG_TC5;
}
else if(SPIx == SPI3)
{
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Channel1_IRQn;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI3, ENABLE );
p_PortInit->DMAy_ChannelRX = DMA2_Channel1;
p_PortInit->DMAy_ChannelTX = DMA2_Channel2;
p_PortInit->DMAy_FlagRX = DMA2_FLAG_TC1;
p_PortInit->DMAy_FlagTX = DMA2_FLAG_TC2;
}
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//全双工模式
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;//第一个边沿
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;//上升沿捕获
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; // 3MHz
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial = 7;
SPI_Init(SPIx,&SPI_InitStruct);
SPI_Cmd(SPIx, DISABLE );
SPI_SSOutputCmd(SPIx, ENABLE);
SPI_I2S_DMACmd(SPIx, SPI_I2S_DMAReq_Rx, ENABLE);
DMA_Rx_Init( p_PortInit->DMAy_ChannelRX, ( u32 )&SPIx->DATAR, ( u32 )p_PortInit->RX_BUFF, sizeof(p_PortInit->RX_BUFF) );
DMA_Cmd( p_PortInit->DMAy_ChannelRX, DISABLE );
SPI_I2S_DMACmd(SPIx, SPI_I2S_DMAReq_Tx, ENABLE);
DMA_Tx_Init( p_PortInit->DMAy_ChannelTX, ( u32 )&SPIx->DATAR, ( u32 )p_PortInit->TX_BUFF, sizeof(p_PortInit->TX_BUFF) );
DMA_Cmd( p_PortInit->DMAy_ChannelTX, DISABLE );
DMA_Cmd(p_PortInit->DMAy_ChannelRX, DISABLE );
DMA_Cmd(p_PortInit->DMAy_ChannelTX, DISABLE );
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
|
|