硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1238|回复: 4
收起左侧

[SPI/QSPI] 请指教,STM32H7下使用LL库设置了SPI2的EOT中断,程序跑起来后不进EOT中断,找不到原因

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2022-11-5 09:10:20 | 显示全部楼层 |阅读模式
STM32H7下使用LL库设置了SPI2的EOT中断,程序跑起来后不进EOT中断,找不到原因。
初始化代码如下:
static void bsp_Configure_SPI2(void)
  {
          /**SPI2 GPIO Configuration
    PC3     ------> SPI2_MOSI
    PC2     ------> SPI2_MISO
    PB10    ------> SPI2_SCK
        PB4     ------> SPI2_CS
    */
         
        /* (1) Enables GPIO clock and configures the SPI2 pins ********************/
        /* Enable the peripheral clock of GPIOA/GPIOB/GPIOC */
          LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOA);
          LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOB);
          LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOC);
          
        /* Configure SCK Pin  PB10*/   
        LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_10, LL_GPIO_MODE_ALTERNATE);
        LL_GPIO_SetAFPin_0_7(GPIOB, LL_GPIO_PIN_10, LL_GPIO_AF_5);
        LL_GPIO_SetPinSpeed(GPIOB, LL_GPIO_PIN_10, LL_GPIO_SPEED_FREQ_HIGH);
        LL_GPIO_SetPinPull(GPIOB, LL_GPIO_PIN_10, LL_GPIO_PULL_DOWN);

        /* Configure MISO Pin  PC2*/
        LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_2, LL_GPIO_MODE_ALTERNATE);
        LL_GPIO_SetAFPin_0_7(GPIOC, LL_GPIO_PIN_2, LL_GPIO_AF_5);
        LL_GPIO_SetPinSpeed(GPIOC, LL_GPIO_PIN_2, LL_GPIO_SPEED_FREQ_HIGH);
        LL_GPIO_SetPinPull(GPIOC, LL_GPIO_PIN_2, LL_GPIO_PULL_DOWN);  
       
        /* Configure MOSI Pin PC3*/
        LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_3, LL_GPIO_MODE_ALTERNATE);
        LL_GPIO_SetAFPin_0_7(GPIOC, LL_GPIO_PIN_3, LL_GPIO_AF_5);
        LL_GPIO_SetPinSpeed(GPIOC, LL_GPIO_PIN_3, LL_GPIO_SPEED_FREQ_HIGH);
        LL_GPIO_SetPinPull(GPIOC, LL_GPIO_PIN_3, LL_GPIO_PULL_DOWN);
          
        /* Configure CS2 Pin PB4*/
        LL_GPIO_SetPinMode(GPIOB,LL_GPIO_PIN_4,LL_GPIO_MODE_OUTPUT);
        LL_GPIO_SetPinSpeed(GPIOB,LL_GPIO_PIN_4,LL_GPIO_SPEED_FREQ_HIGH);
        LL_GPIO_SetPinPull(GPIOB,LL_GPIO_PIN_4,LL_GPIO_PULL_DOWN);
        LL_GPIO_SetOutputPin(GPIOB,LL_GPIO_PIN_4);       

       /* (2) Configure NVIC for SPI2 transfer complete/error interrupts **********/
        /* Set priority for SPI2_IRQn */
        NVIC_SetPriority(SPI2_IRQn, 0);
        /* Enable SPI2_IRQn           */
        NVIC_EnableIRQ(SPI2_IRQn);  

        /* (3) Configure SPI2 functional parameters ********************************/
       
        /* Enable the peripheral clock of SPI2 */
        LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI2);
       
        /* Configure SPI2 communication */
        LL_SPI_SetBaudRatePrescaler(SPI2,LL_SPI_BAUDRATEPRESCALER_DIV8);
        LL_SPI_SetTransferDirection(SPI2,LL_SPI_FULL_DUPLEX);
        LL_SPI_SetClockPhase(SPI2, LL_SPI_PHASE_2EDGE);
       
        /* Setup Internal SS signal level to avoid a MODF Error if NSS Polarity is LOW, NSS Mode is SOFT and SPI Mode is Master */
        LL_SPI_SetInternalSSLevel(SPI2, LL_SPI_SS_LEVEL_HIGH);
        LL_SPI_SetClockPolarity(SPI2, LL_SPI_POLARITY_LOW);
       
        /* Reset value is LL_SPI_MSB_FIRST */
        LL_SPI_SetTransferBitOrder(SPI2, LL_SPI_MSB_FIRST);
        LL_SPI_SetDataWidth(SPI2, LL_SPI_DATAWIDTH_8BIT);
        LL_SPI_SetNSSMode(SPI2, LL_SPI_NSS_SOFT);
       
        /* Reset value is LL_SPI_MODE_MASTER */
        LL_SPI_SetMode(SPI2, LL_SPI_MODE_MASTER);
       
        /* Lock GPIO for master to avoid glitches on the clock output */
        LL_SPI_EnableGPIOControl(SPI2);
        LL_SPI_EnableMasterRxAutoSuspend(SPI2);
       
        /* Set number of data to transmit */
        LL_SPI_SetTransferSize(SPI2, 6);               
               
        /* Enable TXP Interrupt */
//        LL_SPI_EnableIT_TXP(SPI2);
        /* Enable RXP Interrupt */
//        LL_SPI_EnableIT_RXP(SPI2);

        /* Enable SPI Errors Interrupt */
//        LL_SPI_EnableIT_CRCERR(SPI2);
//        LL_SPI_EnableIT_UDR(SPI2);
//        LL_SPI_EnableIT_OVR(SPI2);
        LL_SPI_EnableIT_EOT(SPI2);
       
       
        /* Enable SPI2 */
        LL_SPI_Enable(SPI2);
  }


相同的方式配置SPI6,SPI6就可以正常的工作。感觉SPI2和SPI6两者之间是有差异的,就是不了解其中有何不同。


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
发表于 2022-11-5 10:02:09 | 显示全部楼层
SPI2和SPI6是有差异的。另外你的GPIO为什么设置下拉LL_GPIO_PULL_DOWN,应该设置上拉或者不带拉。

另外这个FIFO最好配置下,不要让他是随机值。设置为01Data

image.png
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2022-11-5 11:22:52 | 显示全部楼层
回复:1 GPIO已经设置为不带拉。
        2  已经设置了FIFO 阈值 LL_SPI_SetFIFOThreshold(SPI2,LL_SPI_FIFO_TH_01DATA);
测试后情况依旧,还是不能进入中断函数,当然也就进不了EOT中断了。以下是中断服务函数:
void SPI2_IRQHandler(void)
{
         if(LL_SPI_IsActiveFlag_EOT(SPI2) && LL_SPI_IsEnabledIT_EOT(SPI2))
    {
      /* Call function Reception Callback */
      SPI2_EOT_Callback();
      return;
    }
}

后来发现一点问题,先打开SPI2的TXP,EOT中断,然后再进行 NVIC_EnableIRQ(SPI2_IRQn);
这时候程序就死在NVIC_EnableIRQ(SPI2_IRQn)这条语句上,没办法继续执行。请教如何解决
这个问题。
谢谢!
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2022-11-5 11:41:02 | 显示全部楼层
回复:1已经将GPIO设置为不带拉。
          2已经设置FIFO阈值LL_SPI_SetFIFOThreshold(SPI2,LL_SPI_FIFO_TH_01DATA);
测试后发现情况依旧,还是不能进入中断,当然也就进不了EOT中断了。以下为SPI2的中断服务函数:
void SPI2_IRQHandler(void)
{
         if(LL_SPI_IsActiveFlag_EOT(SPI2) && LL_SPI_IsEnabledIT_EOT(SPI2))
    {
      /* Call function Reception Callback */
      SPI2_EOT_Callback();
      return;
    }
}

后来发现一个问题:1 先设置SPI2的TXP,EOT中断后,再进行 NVIC_EnableIRQ(SPI2_IRQn);
代码就会死在NVIC_EnableIRQ(SPI2_IRQn)这一行上。2 如果先设置NVIC_EnableIRQ(SPI2_IRQn)后,
设置SPI2的TXP,EOT中断,代码可以顺利运行,但是在后面不会进入EOT中断。

在请教一下这个问题的解决方法。谢谢!

不知刚才发的回复为何没有显示出来,再发一遍。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
发表于 2022-11-5 11:55:23 | 显示全部楼层
jtshan 发表于 2022-11-5 11:41
回复:1已经将GPIO设置为不带拉。
          2已经设置FIFO阈值LL_SPI_SetFIFOThreshold(SPI2,LL_SPI_FIFO ...

别的问题看不出来了,直接用HAL配置下吧,对比下哪里有问题。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-29 16:00 , Processed in 0.287279 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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