这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » UART0 求救:UART0中断接收、查询发送

共2条 1/1 1 跳转至

UART0 求救:UART0中断接收、查询发送

院士
2006-09-17 18:14:16     打赏
UART0 求救:UART0中断接收、查询发送



关键词: UART0     求救     中断     接收     查询     发送    

院士
2006-12-22 22:43:00     打赏
2楼
问 如题,小弟用UART0中断接收、查询发送,上位机软件用的是ZLG提供的EasyARM串口调试助手,本人试图从上位机发送数据,存储于接收缓存区,然后将接收到的数据发回上位机,我是根据ZLG提供的试验改的程序,但现在不能触发中断,程序如下:
uint8 UART0_Rx_Buff[8];        //定义UART0接收缓冲区

void  UART0_Ini(void)
{  uint16 Fdiv;

   U0LCR = 0x83;                    // DLAB = 1,可设置波特率
   Fdiv = (Fpclk / 16) / UART_BPS;  // 设置波特率
   U0DLM = Fdiv / 256;                            
   U0DLL = Fdiv % 256;                        
   U0LCR = 0x03;
}
        


void IRQ_UART0_Rx_Set(void)   //设置UART0中断
{
    U0FCR=0x81;  //使能FIFO,并设置触发深度为8字节
    U0IER=0x01;  //使能接收数据可用中断和接收超时中断
    
    VICIntSelect=0x00000000;    //使能所有通道为IRQ中断
    VICVectCntl2=0x26;   //UART0中断分配到IRQ slot2,
                              //优先级次与I2C和外部中断3(键盘中断)
    VICVectAddr2=(int)IRQ_UART0_Rx;    //设置UART0向量地址
    VICIntEnable=0x00000040;        //使能UART0中断
    
}

void  UART0_SendByte(uint8 data)
{  U0THR = data;                    // 发送数据

   while( (U0LSR&0x40)==0 );        // 等待数据发送完毕
}


void ISendBuf(void)
{
    uint8 i;
    
    for(i=0;i<8;i++)
    {
        UART0_SendByte(UART0_Rx_Buff[i]);//发送缓冲区
                                              //UART0_Rx_Buff[]数据
        
    }
    
    while((U0LSR&0x20)==0);
    
}


void __irq IRQ_UART0_Rx(void)
{
    uint8    i;
    
//    if(0x04==(U0IIR&0x0F))
    for(i=0;i<8;i++)
    {
        UART0_Rx_Buff[i]=U0RBR;    //读取FIFO中的数据存储与
                        //缓冲区UART0_Rx_Buff[8],该操作自动清除标志位        
    }
    
    ISendBuf();  //将接收到的数据发回
    
    VICVectAddr=0x00;
    
}


void main(void)
{
  PINSEL0    =0x800A8055;//设置引脚功能(PWM2.4.5.6;P0.15.16.30(EIN0/2/3);
  PINSEL1    =0x20000402; //P0.0/1为UART0;P0.2/3为I2C有效;其他均为I/O,

  UART0_Ini();     //初始化串口模式
  IRQ_UART0_Rx_Set();//接收中断设置  
  .
  .
  .
  .

}
程序运行中,用ZLG提供的软件发送数据30 31 32 33 34 35 36 37,不能触发中断,发14个字节也不能触发,郁闷阿,急!!!!!!!
另,在观察存储单元0xe0000c008时,显示c1,应该表示的是U0IIR的内容吧,应为U0IIR与U0FCR地址同为0xe0000c008,所以有点儿晕~~~~

还望高手指教阿~~~~~谢谢啦先!! 1: 顶上去难道周末大家都休息??诸位不要这么吝啬嘛~~~帮帮忙~~~~ 2: 通讯速率对不对啊 3: 通讯速率都是115200啊,通讯速率都是115200啊,而且内核IRQ中断也打开了,把原来的0xdf改成0x5f了~~~我晕了!! 4: 刚试了一下ZLG的例程也不行刚试了一下ZLG的例程也不行,用的是EasyARM2210的开发板,简直郁闷死了,例程不是都调试通过了的吗??ZLG公司的高手们赶紧给支个招儿啊~~~急!! 5: 晶振和例程的一样吗?把波特率降低一些看看 6: 降了晶振和例程的一样,我把波特率改成9600也不成啊~~~ 7: re:可以先使用ISP软件测试一下串口和开发板是否正常通讯(开发板上的ISP跳线要短接,使用串口延长线将开发板的UART0与PC串口连接)。

使用EasyARM软件时,要正确配置使用的串口及波特率、数据位数等。

8: 开发板可以通过UART0向PC发数据,但不能产生接收中断串口和开发板能正常通讯,因为可以通过UART0向PC发送数据。但即使用ZLG提供的历程也不能产生接收中断,实在不知如何解决阿~~~还请帮忙!! 9: 倒塌了~~~我可以做到海量随意收发呀~~~看例程void UartObj::Exec(void)
{
static unsigned char cData = 0;
unsigned char ch;
  Status = U0->IIR & 0x0f;
  switch (Status) {
    case 0x06://接收线状态
      switch (U0->LSR) {
        case 0x63:
          break;
      }
      break;
    case 0x04://接收数据可用
    case 0x0c://字符超时指示
     do{
      ch = U0->RBR;
      if (ch == '$') {
        cData = '$';
        RxBuffer[RxCount ++] = ch;
      }
      else if(cData == '$'){
        if (ch >= 0x20) {
          RxBuffer[RxCount ++] = ch;
        }
        else if (ch == 0x0d) {
          RxBuffer[RxCount ++] = ch;
        }
        else if (ch == 0x0a) {
//          if (RxBuffer[(RxCount - 1) & 0x7f] == 0x0d) {
            cData = 0;
            RxBuffer[RxCount ++] = ch;
//isr_evt_set (DefBeep_1, Beep_Task);
            isr_evt_set (1, Uart_Task);
//          }
        }
      }
    }while(U0->LSR & (1 << RDR));
      break;
    case 0x01://LPCARM保留中断,可用于软件模拟激活UART0中断
     if (!(VIC->SoftInt & (1 << VICIntSel_UART0))) {//硬件UART0中断
       break;//正常的UART0中断退出
     }
    case 0x02://THRE中断
        TxBusy = TxCount != TxdCount;//保证FIFO发送全部结束时,缓冲区空不拒绝发送
      for (int i = 0; (i < 16) && (TxCount != TxdCount); i ++) {//1次写入FIFO最多16个字节
        ch = TxBuffer[TxdCount ++];//取出缓冲区1个字节数据
        if (ch >= 0x0a) {//防止非法字符漏入
          U0->THR = ch;//将缓冲区1个字节数据写入FIFO
        }
      }
      break;
//    case 0x0f://保留中断
//      break;
  }   
}
10: re hotpower:大哥您千万别倒,你瞧我都这样了不还得挺直了~~~~
我现在的问题是为什么不能触发UART0中断,用ZLG光盘带的例程在EasyARM2210的开发板上都不行啊~~~~~大哥给点儿思路?? 11: 倒了~~~触发UART0中断只有2个办法~~~经典的是发送首个字节,非典的是用软中断触发,就像51用TI=1触发一样~~~ 12: 实际上串口程序是世上最好编写的程序之一~~~用以下这个小玩意,100%调试成功率~~~.想错都难~~~ 13: 我的建议1)首先硬件是否ok?查询法检查一遍或者示波器观察。前面买过zlg一块开发板,串口1的电平转换ic是坏的。3232的芯片损坏情况并不少见。
2)中断是否ok?如果其它中断正常,跳过。因为隐约记得程序状态寄存器CPSR有一个全局中断允许位,没有正确设置会导致所有IRQ中断不运作。我吃过亏。 14: 那都是"魔板"搞得鬼~~~哈哈 15: re 大家:其他中断都能正常触发和响应,就是串口接收中断无法触发!怀疑是串口的Tx线有问题!刚检查了电路板串口硬件连接,一块儿是自己做的,一块儿是ZLG的,板子都没问题,也检查了串口线,也没问题,现在开始怀疑是不是PC的串口有问题了~~~
对了,据说可以用ISP读PC的CPU id,不知怎么操作??哪位大虾搞过,还望不吝赐教,越详细越好,谁让咱太菜呢~~~~都让不知多少高手倒塌了~~~哭!!还得感谢大虾hotpower,小弟正在down你说的那个串口软件,再次感谢,还望继续支持!!! 16: re hotpower:大虾~~~不是吧,你说的那个软件我down了,“请先运行Keil uVersion,然后进入软件仿真调试状态打开串口调试窗口。将需要模拟发送的数据在本程序中输入。”???????我用的是ADS也行吗,疑问ing....... 17: 正常状态的PC串口各个脚是什么状态??敢问大家正常状态的PC串口各个脚是什么状态??我的PC状态如下:1脚:地;
2脚:地;3脚低电平(-9V左右);4、7脚:高电平(9V左右);5、6、8、9脚:地;
不知道这种状态是否正常~~~~
另:兄弟我找到一个软件,串口调试助手V2.2,比Hotpower大虾提供的可能更适合我一些。再用串口调试助手V2.2发送数据时,PC串口3脚无变化,这是不是意味着我的PC串口有问题啊~~~~~
各位给个建议阿,焦急阿~~~~~~~~~~~~~~~~~~~~~~~~~~~ 18: 谢谢大家谢谢大家,问题解决了,还是PC的串口有问题,换了台PC就ok了!
感谢大家几天来的出谋划策~~~~ 19: 建议用汽车人的串口通V3.20倒塌了~~~ADS~~~我眩晕~~~

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]