搜索
bottom↓
回复: 3

LPC1788 UART0 P0.0/P0.1可以发送数据但不能接收数据。

[复制链接]

出0入0汤圆

发表于 2014-6-10 20:48:46 | 显示全部楼层 |阅读模式
这两被UART0串口弄得脑大。
控制板是LPC1788  主板是飞思卡尔的S08_FL16
LPC串口0发送数据给主板--> 单片机可以顺利接收 并返回相应对应的数据给控制板
但问题就是LPC1788根本不相应。接收中断  接收缓存都没反应 接线是良好的 通信方式采用的是485

void UART0_Init(uint32_t baudrate)
{
         
  uint32_t Fdiv =0;
        /*
         * 初始化UART0管脚连接
         * P0.0连接到UART0的TXD端
         * P0.1连接到UART0的RXD端
         */
        NVIC_DisableIRQ(UART0_IRQn);          //关闭外部扩展中断
        LPC_IOCON->P0_0=0x04; //端口P0_0 端口配置成 U0_TXD模式
        LPC_IOCON->P0_1=0x04; //端口P0_1 端口配置成 U0_RXD模式
        /*485控制脚*/
        LPC_IOCON->P2_22 =0;//端口配置成IO模式
        LPC_GPIO2->DIR|=(1<<22);//端口配置成输出
       

       
        /*开启UART0的电源*/
        LPC_SC->PCONP |=0x01<<3;
       
                /*使能访问除数锁寄存器(DLAB=1),
        *只有DLAB为1时写入DLM和DLL的
        *波特率分频值才会有效
        */
        LPC_UART0->LCR=0x83;
        /*配置UART0的波特率*/
        Fdiv = (PeripheralClock/ 16 ) / baudrate ;
        LPC_UART0->DLM = Fdiv / 256;                                                       
  LPC_UART0->DLL = Fdiv % 256;

        /*定义数据位为8bit,停止位为1,校验位为NONE*/
        LPC_UART0->FDR = 0xE5;
       
        /* 又是LCR线控制寄存器,这回等于03,也就是禁止访问除数锁存 */
        LPC_UART0->LCR=0x03;
       
        /*使能并复位FIFO*/
  LPC_UART0->FCR  = 0x07; /* 使能FIFO,设置1个字节触发点  */
        Fdiv=LPC_UART0->LSR;/* 通过读操作清除状态*/

  /*使能接收数据中断,THRE中断,RX线状态中断*/
  LPC_UART0->IER = IER_RBR | IER_THRE | IER_RLS;       

   /*配置UART0的先占优先级为1,从优先级为1*/
   NVIC_SetPriority(UART0_IRQn,  ((0x01<<3)|0x01));
        /*使能UART0的中断通道*/
    NVIC_EnableIRQ(UART0_IRQn);
}

/*******************************************************************************************
* 函数名:UART0_IRQHandler()
* 参数  :void
* 返回值:void
* 描述  :UART0中断服务函数
*********************************************************************************************/
void UART0_IRQHandler(void)
{
         uint8_t data;
         uint8_t IIRValue;
         IIRValue=LPC_UART0->IIR& 0x0E;
         if((IIRValue==0x04)||(IIRValue==0x0C))//接收数据中断/字符超时指示
         {
                          data= LPC_UART0->RBR&0xff;                         //接收一个字节
        if(ReceiveTimes<CommDataSize)
         { ReceiveData[ReceiveTimes]=data;
           ReceiveTimes++;
         }
        UART_TongBu_Time=0;//串口同步时间
                                 ReceiveTimes++;                 
   }
         else
         {
                 if(IIRValue==0x02) //发送中断
                 {
                            if(SendTimes<CommDataSize)
           {
             UART0_SendByte(SendData[SendTimes]);//发送的数据传到发送寄存器(自动发送)
             SendTimes++;
           }
          else
           { CMM_Start.Bit.TXorRX=MODE_RX;//转到接收
             UART0_TxEN_OFF;  //禁止发送
             UART0_Tx_IRQ_OFF;  //禁止发送完中断
           }
      }
                        else
                        {
                    // RLS Interrupt.
            data = LPC_UART0->LSR;                  /* 清除RLS中断            */
            data = LPC_UART0->RBR;                  /* 丢弃接收到的错误字节,
            如果此处不读取RBR,则会使该错误字节留在FIFO中,使LSR的bit7置位。  */                       
      }
   }
         
}

出0入0汤圆

发表于 2014-6-10 21:14:41 | 显示全部楼层
看一下主板有没有返回数据,双机通讯最好拿两个jlink联调,那样比较容易找问题,因为接收方都没有中断,那有可能是没法数据发送过来,你可以用上位机串口软件分别调通串口,最好调好后再联调

出0入0汤圆

 楼主| 发表于 2014-6-11 08:52:01 | 显示全部楼层
数据是有返回了,在示波器上也看到了。把这个Rx脚P配置成普通的IO模式就可以读取管脚状态,说明这个脚是好的--连线也是没问题的。

出0入0汤圆

发表于 2014-6-11 10:58:17 | 显示全部楼层
怎么不用485的控制引脚U0_OE,固件库程序里都用控制引脚的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 07:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表