免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 10490 | 回复: 32
打印 上一主题 下一主题

ARM下驱动中断读写问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-30 21:39 |只看该作者 |倒序浏览
5可用积分
测试程序中read调用成功。寄存器也设置到了,测试中断引脚,是高电平,可没进中断服务程序,请问是什么原因?

论坛徽章:
0
2 [报告]
发表于 2008-10-30 22:12 |只看该作者

回复 #1 angelawushuang 的帖子

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

论坛徽章:
0
3 [报告]
发表于 2008-10-30 22:18 |只看该作者

回复 #2 litao6169 的帖子

//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;
        }
}

论坛徽章:
0
4 [报告]
发表于 2008-10-30 22:19 |只看该作者

回复 #2 litao6169 的帖子

//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;
}

论坛徽章:
0
5 [报告]
发表于 2008-10-30 22:21 |只看该作者

回复 #2 litao6169 的帖子

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);
}

论坛徽章:
0
6 [报告]
发表于 2008-10-30 22:25 |只看该作者

回复 #2 litao6169 的帖子

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",吧) 请问是为什么呢··谢谢

论坛徽章:
0
7 [报告]
发表于 2008-10-31 09:27 |只看该作者
不太明白你使用的硬件,不过不能中断的话,可能是你注册的中断号跟你硬件连接不一致?或者在硬件初始化的时候,有把中断打开么?

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
8 [报告]
发表于 2008-10-31 15:00 |只看该作者
原帖由 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、虽然是高电平,但是,这个时候,全局中断是否打开了?本身这项中断是否使能了?

论坛徽章:
0
9 [报告]
发表于 2008-11-01 00:29 |只看该作者
有时钟的话应该有全局中断。

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

论坛徽章:
0
10 [报告]
发表于 2008-11-02 10:04 |只看该作者

回复 #7 cloudice 的帖子

注册的中断和硬件号一致 ,申请中断成功了。什么叫初始化硬件时中断是否打开呢?怎么打开啊 ?我不知道怎么设置
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP