ARM下驱动中断读写问题

发布于 2022-09-22 13:13:11 字数 53 浏览 32 评论 0

测试程序中read调用成功。寄存器也设置到了,测试中断引脚,是高电平,可没进中断服务程序,请问是什么原因?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

禾厶谷欠 2022-09-29 13:13:11

代码贴出来撒,就这样说 谁知道是什么原因。

我家小可爱 2022-09-29 13:13:11

//TL16C554初始化
void Init_TLB(){
        volatile unsigned char byRx;
        int i;
       
        TLB.RBR = (unsigned long )ioremap_nocache(TLB.nAddress, 4));
        TLB.THR = (unsigned long )ioremap_nocache(TLB.nAddress, 4));
        TLB.LSR = (unsigned long )ioremap_nocache(TLB.nAddress+0x28, 4));
        TLB.MSR = (unsigned long )ioremap_nocache(TLB.nAddress+0x30, 4));
        TLB.LCR = (unsigned long )ioremap_nocache(TLB.nAddress+0x18, 4));
        TLB.FCR = (unsigned long )ioremap_nocache(TLB.nAddress+0x10, 4));
        TLB.MCR = (unsigned long )ioremap_nocache(TLB.nAddress+0x20, 4));
        TLB.DLL = (unsigned long )ioremap_nocache(TLB.nAddress, 4));
        TLB.DLM = (unsigned long )ioremap_nocache(TLB.nAddress+0x08, 4));
        TLB.IER = (unsigned long )ioremap_nocache(TLB.nAddress+0x08, 4));
        TLB.SCR = (unsigned long )ioremap_nocache(TLB.nAddress+0x38, 4));
        TLB.IIR = (unsigned long )ioremap_nocache(TLB.nAddress+0x10, 4));
       
        TLB.sRecvHead = 0;
        TLB.sRecvTail = 0;
        TLB.sSendHead = 0;
        TLB.sSendTail = 0;

       // set FCR.FIFO允许,RXD复位,TXD复位,DMAmode=1,触发为14
        TLB.FCR = 0xcf;
          TLB.FCR) = 0xc9;
       
         TLB.MCR)= 0x08;//使能外部串口通道
         TLB.LCR = 0x83;//设置8bit
         
        //特殊寄存器已打开,设置BPS
                TLB.DLL=0x24;
                TLB.DLM=0x00;

         TLB.LCR =0x03;
       
        TLB.IER=0x03;//接收保持和中断允许

        byRx = TLB.RBR;//空读一次
        i=0;
        while(1){
                //检查接收状态
                byRx = TLB.LSR;
                if(byRx&0x01){
                       
                        byRx = TLB.RBR;
                }
                else
                        break;
                //防止死循环
                i++;
                if(i > 4096)//每个UART最多只能缓存16个字节
                        break;
        }
}

对岸观火 2022-09-29 13:13:11

//TL16C554的接收
unsigned char TLB_Rxd(void){
        volatile unsigned char byRx;
        volatile unsigned char bySt;
        int nRxCnt = 0;
       
        while(nRxCnt < 512){
                //检查接收状态
                bySt = *(volatile unsigned char *)(TLB.LSR);
                if(bySt&0x01){//数据就绪
                        byRx = *(volatile unsigned char *)(TLB.RBR);
                        TLB_RX(byRx);
                }
                else
                        break;
                nRxCnt++;
        }
        return byRx;
}

莫多说 2022-09-29 13:13:11

static void UARTB_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
        long flags;
        save_flags_cli(flags);
               unsigned char temp;
          temp=TLB.IIR;
         printk("TLB.IIR is %d\n",TLB.IIR);
        switch(TLB.IIR) {
                        case 2:
                        printk(KERN_INFO "UARTB_transmited\n" );               
                                break;
                        case 4:
                        case 6:
                                TLB_Rxd();
                        printk(KERN_INFO "UARTB_received\n" );               
                                break;
                        default:
                                printk("Unknow interrupt type!");
                                break;
                    }       
        restore_flags(flags);
}

与之呼应 2022-09-29 13:13:11

if (request_irq(INT_MPUIO_13, UARTB_interrupt, SA_INTERRUPT, DEVICE_NAME, NULL)) {
                unregister_chrdev( TL16C554_MAJOR, DEVICE_NAME );
                printk( DEVICE_NAME "can't request irqA \n" );
                return (-1);
        }
  
中断注册成功,测试INT_MPUIO_13角一直是高电平,可是没进入上面的中断程序,(如果进去了,应该是要打印TLB.IIR is %d\n",吧) 请问是为什么呢··谢谢

孤寂小茶 2022-09-29 13:13:11

不太明白你使用的硬件,不过不能中断的话,可能是你注册的中断号跟你硬件连接不一致?或者在硬件初始化的时候,有把中断打开么?

滿滿的愛 2022-09-29 13:13:11

原帖由 angelawushuang 于 2008-10-30 22:25 发表
if (request_irq(INT_MPUIO_13, UARTB_interrupt, SA_INTERRUPT, DEVICE_NAME, NULL)) {
                unregister_chrdev( TL16C554_MAJOR, DEVICE_NAME );
                printk( DEVICE_NAME "can't request irqA \n" );
                return ...

两点建议:
1、注册的中断号是否正确?
2、虽然是高电平,但是,这个时候,全局中断是否打开了?本身这项中断是否使能了?

×眷恋的温暖 2022-09-29 13:13:11

有时钟的话应该有全局中断。

对一下中断号,中断/引角是否是复用,配置是否正确

山色无中 2022-09-29 13:13:11

注册的中断和硬件号一致 ,申请中断成功了。什么叫初始化硬件时中断是否打开呢?怎么打开啊 ?我不知道怎么设置

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文