Raspberry PI GPIO PIN中的带有IRQF_ONESHOT的request_threaded_irq不会阻止新IRQ

问题描述

出于教育目的(我是该领域的新手),我试图编写AD7124 ADC的驱动程序,该驱动程序连接到Raspberry PI4的SPI串行接口,并在Raspbian下运行,内核v5.4我应用了RT补丁。

此ADC具有连续读取模式,在该模式下,通过降低其(DOUT /!RDY)引脚来发出新样本准备就绪的信号。

除了将其连接到MISO引脚外,我的想法是将其连接到Raspi的GPIO引脚上,以便通过降低DOUT /!RDY引脚来触发每个新采样的中断

问题是,在我的中断中完成的SPI读取会触发一个新的中断,如从示波器(https://i.stack.imgur.com/BJnbO.png)捕获到的,连接到DOUT /!RDY引脚(黄色),并且SPI接口的时钟信号(紫色)。 SCLK信号是由SPI读取触发的,我们可以看到只有一个准备好的样本触发了两次读取。

下面,我如何在探测过程中请求IRQ:

    // Getting the interrupt GPIO pin
    padpvd->pgpio_desc = devm_gpiod_get (&spi->dev,AD7124_GPIO_NAME,GPIOD_IN ) ; 
    if (IS_ERR(padpvd->pgpio_desc)) {
      ...
    }   
    // Getting the interrupt number
    padpvd->irq = gpiod_to_irq(padpvd->pgpio_desc);
    if (padpvd->irq < 0) {
      ...
    }   

在IOCTL启动例程中,启动ADC之后,我请求IRQ:

    ret = request_threaded_irq ( padpvd->irq,NULL,ad7124_threaded_irq_handler,IRQF_TRIGGER_FALLING | IRQF_ONESHOT,THIS_MODULE->name,padpvd->ad7124_spi_dev ) ;

在处理程序中,我所做的只是在返回IRQ_HANDLED之前使用spi_sync()调用读取数据并将其存储在缓冲区中。

所以问题是:为什么在我使用IRQF_ONESHOT标志的同时,SPI传输在GPIO PIN上生成的信号会触发中断?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...