OpenEdv-开源电子网

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

相同的配置,SPI2联立DMA发送数据,数据一直发送不出来,用SPI1联立DMA发送数据却可以,想请教一下各位大佬

[复制链接]

2

主题

4

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-3-30
在线时间
20 小时
发表于 2021-6-27 15:26:01 | 显示全部楼层 |阅读模式
1金钱
#include "stm32f4xx.h"
unsigned int cnt=0,flag=0;
unsigned char LensAbck[42]={
0x55,0x12,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xff};
unsigned char CmdTx[8]={0x55,0x00,0x00,0x00,0x00,0x00,0x00,0xff};
void SPI1_Tx_Buff(void);
void SPI1_init(void);
void SPI2_init(void);
void SPI2_Tx_Buff(void);
int main()
{
        SPI2_init();
        SPI1_init();
        while(1)
        {
                SPI2_Tx_Buff();
                SPI1_Tx_Buff();
               
        }
}

void SPI1_init(void)
{
        //SPI1 PB3,4,5 SPI1 SCK MISO MOSI
        GPIO_InitTypeDef GPIO_InitStruct;
        SPI_InitTypeDef SPI_InitStruct;
        DMA_InitTypeDef DMA_InitStruct;
        //时钟使能
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
        //IO口配置
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
        GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStruct);
       
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
        GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
        GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStruct);
       
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1);
       
        //SPI设置
        SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
        SPI_InitStruct.SPI_Direction=SPI_Direction_1Line_Tx;
        SPI_InitStruct.SPI_CPHA=SPI_CPHA_2Edge;
        SPI_InitStruct.SPI_CPOL=SPI_CPOL_High;
        SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_LSB;
        SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;
        SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;
        SPI_InitStruct.SPI_CRCPolynomial=7;
        SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_32;
        SPI_Init(SPI1,&SPI_InitStruct);
        SPI_Cmd(SPI1,ENABLE);
       
        //DMA设置 SPI1-TX——DMA2—Stream3-channel3 RX-DMA2-Stream2_channel2
        DMA_DeInit(DMA2_Stream3);
        DMA_InitStruct.DMA_Channel=DMA_Channel_3;
        DMA_InitStruct.DMA_DIR=DMA_DIR_MemoryToPeripheral;
        DMA_InitStruct.DMA_Memory0BaseAddr=(u32)LensAbck;
        DMA_InitStruct.DMA_PeripheralBaseAddr=(u32)&SPI1->DR;
        DMA_InitStruct.DMA_MemoryDataSize=42;
        DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
        DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
        DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
        DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
        DMA_InitStruct.DMA_FIFOMode=DMA_FIFOMode_Disable;
        DMA_InitStruct.DMA_Priority=DMA_Priority_High;
        DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;
        DMA_Init(DMA2_Stream3,&DMA_InitStruct);
        SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE);
        DMA_Cmd(DMA2_Stream3,DISABLE);
}

void SPI1_Tx_Buff(void)
{
        cnt++;
        if(cnt>=3000)
        {
                cnt=0;
        //        GPIO_ToggleBits(GPIOB,GPIO_Pin_6);
                DMA_Cmd(DMA2_Stream3,DISABLE);
                DMA_SetCurrDataCounter(DMA2_Stream3,42);
                SPI1->DR;
                while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
                DMA_ClearFlag(DMA2_Stream3,DMA_FLAG_TCIF3);
                DMA_Cmd(DMA2_Stream3,ENABLE);
        }
}
void SPI2_Tx_Buff(void)
{
                flag++;
        if(flag>=3000)
        {
                flag=0;
                GPIO_ToggleBits(GPIOB,GPIO_Pin_6);
                DMA_Cmd(DMA1_Stream4,DISABLE);
                DMA_SetCurrDataCounter(DMA1_Stream4,8);
                SPI2->DR;
                while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
                DMA_ClearFlag(DMA1_Stream4,DMA_FLAG_TCIF4);
                DMA_Cmd(DMA1_Stream4,ENABLE);
        }
       

}

void SPI2_init(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        DMA_InitTypeDef DMA_Tx_InitStruct;
        //DMA_InitTypeDef DMA_Rx_initStruct;
        SPI_InitTypeDef SPI_InitStruct;
       
        //时钟使能
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
        //IO口设置
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
        GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStruct);
        //NSS设置
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
        GPIO_Init(GPIOB,&GPIO_InitStruct);
        GPIO_ResetBits(GPIOB,GPIO_Pin_12);
       
        //IO口复用
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2);
       
        //SPI设置
        SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
        SPI_InitStruct.SPI_Direction=SPI_Direction_1Line_Tx;
        SPI_InitStruct.SPI_CPHA=SPI_CPHA_2Edge;
        SPI_InitStruct.SPI_CPOL=SPI_CPOL_High;
        SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_LSB;
        SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;
        SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;
        SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_32;
        SPI_InitStruct.SPI_CRCPolynomial=7;
        SPI_Init(SPI2,&SPI_InitStruct);
        SPI_Cmd(SPI2,ENABLE);
       
        //DMA发送设置
        //SPI2_Tx--DMA1-Stream4-channel0
        DMA_DeInit(DMA1_Stream4);
        DMA_Tx_InitStruct.DMA_Channel=DMA_Channel_0;
        DMA_Tx_InitStruct.DMA_DIR=DMA_DIR_MemoryToPeripheral;
        DMA_Tx_InitStruct.DMA_Memory0BaseAddr=(u32)CmdTx;
        DMA_Tx_InitStruct.DMA_PeripheralBaseAddr=(u32)&SPI2->DR;
        DMA_Tx_InitStruct.DMA_BufferSize=8;
        DMA_Tx_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
        DMA_Tx_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
        DMA_Tx_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
        DMA_Tx_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
        DMA_Tx_InitStruct.DMA_FIFOMode=DMA_FIFOMode_Disable;
        DMA_Tx_InitStruct.DMA_Priority=DMA_Priority_High;
        DMA_Tx_InitStruct.DMA_Mode=DMA_Mode_Normal;
        DMA_Init(DMA1_Stream4,&DMA_Tx_InitStruct);
        SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);
        DMA_Cmd(DMA1_Stream4,DISABLE);
        //SPI2_Rx--DMA1-Stream3-channel0
}
SPI1,SPI2发出的数据图,只有SPI1能发出数据,SPI2却没反应。



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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-6-28 01:41:12 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 14:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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