问题描述
出于教育目的(我是该领域的新手),我试图编写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 (将#修改为@)