打印
[Cortex-M0技术交流]

M0516_DMX512接收程序简化版

[复制链接]
3514|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eydj2008|  楼主 | 2012-12-11 19:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//调试了一天 总结一下经验  下面是简化测试版 调试OK

/***************************************************************************************
描述:  初始化UART
****************************************************************************************/
void UART1_Init(void)
{
    P1_MFP = P1_MFP & (~(P13_AIN3_TXD1 | P12_AIN2_RXD1)) | (TXD1 | RXD1); //配置P1.2和P1.3为UART功能
    P0_MFP = P0_MFP & (~P01_AD1_RTS1) | (RTS1);                           //P01_AD1_RTS1

    IPRSTC2 |= UART1_RST;                            //复位UART模块
    IPRSTC2 &= ~UART1_RST;                           //UART模块从复位状态恢复到正常工作状态

    APBCLK |= UART1_CLKEN;                           //使能UART时钟
    CLKSEL1 = CLKSEL1 & (~UART_CLK) | UART_12M;      //选择外部12M作为UART时钟源
    CLKDIV &= ~(15<<8);                              //设置UART时钟除频值为0

    UA1_FCR |= TX_RST;                               //复位发送FIFO
    UA1_FCR |= RX_RST;                               //复位接收FIFO

    UA1_LCR &= ~PBE;                                 //校验位禁止
    UA1_LCR = (UA1_LCR & (~WLS)) | WL_8BIT;          //数据宽度为8位
    UA1_LCR |= NSB_ONE_HALF;                         //2位停止位

    UA1_BAUD |= DIV_X_EN;                            //模式2:DIV_X_EN = 1
    UA1_BAUD |= DIV_X_ONE;                           //模式2:DIV_X_ONE =1

    UA1_BAUD |= ((12000000 / 250000) - 2);           //设置波特率为250K,模式2波特率=UART_CLK/(UA_BAUD+2)

    //==================================================================================================
    UA1_FUN_SEL = RS485_EN;                          //使能RS485

    UA1_FCR = ~RX_DIS;                               //使能FIFO接收器
    //UA1_FCR |= RX_DIS;                             //禁止FIFO接收器

    UA1_RS485_CSR = RS485_NMM;// | RS485_ADD_EN;     //使能 RS-485 普通操作模式 (NMM) / 使能RS-485 自动方向控制模式

    //UA1_MCR = ~LEV_RTS_H;                          //接收   RTS (Request-To-Send) 信号
    UA1_MCR |= LEV_RTS_H;                            //HIGH

    UA1_MCR &= (~RTS);                               //RXD
    //UA1_MCR |= RTS;                                //TXD

   UA1_IER        |= (RDA_IEN | RLS_IEN);               //使能中断
   NVIC_ISER = UART1_INT;                             //使能NVIC UART1中断  
}


/***************************************************************************************
描述 :  UART1中断代码
****************************************************************************************/
void UART1_IRQHandler(void)
{
   static u16 Counter = 0;  //  DMX地址

    if(UA1_ISR & RLS_INT)                              //线中断
    {  
      if (UA1_ISR & RLS_IF)               //OK  M051多种选择
      //if (UA1_FSR & BIF)                //OK  
      //if (UA1_FSR & RS485_ADD_DE)       //NG   不知道为什么
      {   
         //UA1_FSR |= RS485_ADD_DE;      //CLR
         //UA1_FSR |= BIF;               //下面隐藏代码 可不用
         //UA1_FSR |= FEF;
         //UA1_FSR |= PEF;

         Counter=0;   
         DMX_Flag=0;   //test?

      }
    }     
    else if(UA1_ISR & RDA_INT)                              //接收中断
    {
        TXDRXDData[Counter++] = UA1_RBR;
    }
}

相关帖子

沙发
缥缈九哥| | 2012-12-13 09:47 | 只看该作者
感觉比我的更简洁。哈哈。

使用特权

评论回复
板凳
eydj2008|  楼主 | 2012-12-13 20:21 | 只看该作者
折腾了一天 后面才知道用线中断
感觉还是没有M3那样好用 直接将接收数据 为9BIT 将地址放在第9位 就更简单了
稍后后来一个补充代码  
可以连续读出16个字节 FIFO 少中断几次 (但我测试发现最多只能读14个字节 后面的就错了)
else if(UA1_ISR & RDA_INT)                              //接收中断
    {
   
        TXDRXDData[0] = UA1_RBR;
        TXDRXDData[1] = UA1_RBR;
        TXDRXDData[2] = UA1_RBR;
        TXDRXDData[3] = UA1_RBR;

        -----
   
    }

使用特权

评论回复
地板
aijinquan| | 2012-12-15 10:37 | 只看该作者
新唐的也应该可以用Rs485 9位模式判断吧?

使用特权

评论回复
5
缥缈九哥| | 2012-12-15 11:06 | 只看该作者
可以用9位模式。

使用特权

评论回复
6
eydj2008|  楼主 | 2012-12-16 21:17 | 只看该作者
UA1_RBR 只有8位 没有9位 不方便操作

使用特权

评论回复
7
jakey0225| | 2013-3-13 09:10 | 只看该作者
为什么用串口普通模式调试不通呢
mini51版的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://yonyon.taobao.com  步进电机 细分驱动开发板 编程技术交流交流QQ群A:121960

103

主题

3190

帖子

17

粉丝