OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4605|回复: 1

stmf103 spi3 dma中断接收 初次上电接收的数据错误

[复制链接]

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2019-7-30
在线时间
29 小时
发表于 2022-8-16 17:16:04 | 显示全部楼层 |阅读模式
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);
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

668

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1926
金钱
1926
注册时间
2021-8-13
在线时间
262 小时
发表于 2022-8-16 17:51:21 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 07:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表