请教F407的SPI使用DMA发送怎么设置NSS引脚?

2019-07-21 00:18发布

捕获.PNG
如图是采样的SPI3的DMA发送波形,NSS引脚一直为低电平,而且发送完了也不上啦。
我使用的是SPI2 DMA双缓冲来接收SPI3发送的数据
[mw_shl_code=c,false]  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOA, ENABLE);//开启GPIOB时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);//开启SPI3时钟

  GPIO_PinAFConfig(GPIOA,GPIO_PinSource15,GPIO_AF_SPI3);//PA15¸复用为SPI3        NSS
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI3); //PB3¸复用为SPI3  SCK
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI3); //PB4¸复用为SPI3  MISO
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI3); //PB5¸复用为SPI3  MOSI
       
  //GPIOB12,13,14,15初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;//PB3~5¸串口初始化
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推免输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//复用功能
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        //SPI3初始化设置

       
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//设置SPI3单向或者双向的数据模式:SPI设置成双线双向全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置为主模式
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI传输数据为8bit
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                //串行同步时钟的空闲状态为高电平
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        //串行同步时钟的第一个跳变沿(上升或者下降数据被采样)
        SPI_InitStructure.SPI_NSS =  0x0000;                //NSS由硬件控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;                //定义波特率分频值256
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //数据传输从MSB开始
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式

  //SPI3->CR1 |=0x1000;
  SPI3->CR2 =0x0004;
        SPI_Init(SPI3, &SPI_InitStructure);  //初始化SPI3



        SPI_Cmd(SPI3, ENABLE); //使能SPI3

        SPI3_SetSpeed(SPI_BaudRatePrescaler_4);//42MHz全速运行
       
        SPI_I2S_DMACmd(SPI3,SPI_DMAReq_Tx,ENABLE);[/mw_shl_code]

这是SPI3 的发送配置

SPI2用于接收来测试
[mw_shl_code=c,false]  GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_SPI2); //PB12¸复用为SPI2        NSS
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2); //PB13¸复用为SPI2  SCK
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2); //PB14¸复用为SPI2  MISO
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2); //PB15¸复用为SPI2  MOSI
       
  //GPIOB12,13,14,15初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//PB3~5¸′óÃ1|Äüêä3ö       
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推免输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
       
        //SPI2初始化设置
//        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE);//复位SPI2
//        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//停止复位SPI2

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI2单向或者双向的数据模式:SPI设置成双线双向全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;                //设置为从模式
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI传输数据为8bit
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                //串行同步时钟的空闲状态为高电平
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        //串行同步时钟的第二个跳变沿(上升或者下降数据被采样)
        SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;                //NSS由硬件控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;                //定义波特率分频值256
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //数据传输从MSB开始
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
        SPI_Init(SPI2, &SPI_InitStructure);  //初始化SPI2

        SPI_Cmd(SPI2, ENABLE); //使能SPI2

        SPI2_SetSpeed(SPI_BaudRatePrescaler_4);//42MHz全速运行
       
        SPI_I2S_DMACmd(SPI2,SPI_DMAReq_Rx,ENABLE);[/mw_shl_code]
SPI接收到的东西:
捕获3.PNG
逻辑分析仪采样的是正确的数据‘a’,SPI2之前收别的单片机的数据也是对的

0条回答

一周热门 更多>