2995|4

44

帖子

17

TA的资源

一粒金砂(中级)

楼主
 

5509A做UART(异步串口)实验,数据接收错误,请教各位了! [复制链接]

异步串口实验,出现了两个问题:
(1)在FIFO轮循模式下,用串口调试助手发送一个字符串:12345678910111 ,DSP接收到数据后在1602液晶上显示,但是结果为:12345670110111 红色标记的两位传输错误,又尝试把字符串换成:you are great!,结果显示:前面两位是乱码,后面都是正确的。想问下这是什么原因?是波特率设置的问题?晶振是11.05926MHZ,波特率为9600Bps ,换成其他的波特率,比如4800,14400,还是不行。

(2) 把FIFO模式关闭,只在串口中断下进行数据的收发,同样是有串口调试助手发送字符串,DSP接受后在LCD上显示,代码是和轮循模式一样的,出现的结果就是:DSP只发,没收。这又是什么原因啊?

说明(1)(2) 分别是单独调试的,调试一个,另外的就注释掉

下面是在例程基础上稍作改动的原代码:
/*********************************************************************
**        Module Name:                UART                                                                            **
**        Author:                                CTH                                                                              **
**        Version:                        1.0                                                                                    **
**        CreateDate:                        2008-8-10                                                                    **
**        Description:                                                                                        **
**        Remark:                                                                                                                  **
**        Revision History:  2008-8-10                                                                    **
**  Web:                                http://www.study-kit.com                                        **
**********************************************************************/

#include
#include
#include
#include
#include
/***LCD寄存器******/
#define LCD_REG          (*((unsigned int *)0x200003))
#define LCD_DATA         (*((unsigned int *)0x200006))
#define comm 0
#define dat  1  

  /*异步通信接口芯片 内部寄存器*/
#define UART_BASE_ADDR                        0x200008    // UART寄存器地址   
#define RHR                                *((int *)(UART_BASE_ADDR+0))
#define THR                                *((int *)(UART_BASE_ADDR+0))        
#define IER                                *((int *)(UART_BASE_ADDR+1))
#define ISR                                *((int *)(UART_BASE_ADDR+2))        
#define FCR                                *((int *)(UART_BASE_ADDR+2))        
#define LCR                                *((int *)(UART_BASE_ADDR+3))
#define MCR                                *((int *)(UART_BASE_ADDR+4))
#define LSR                                *((int *)(UART_BASE_ADDR+5))
#define MSR                                *((int *)(UART_BASE_ADDR+6))
#define SCR                                *((int *)(UART_BASE_ADDR+7))
#define DLL                                *((int *)(UART_BASE_ADDR+0))
#define DLM                                *((int *)(UART_BASE_ADDR+1))
/*定义UART分频系数,在11.05926M时,波特率为9600BPS*/
#define DLL_DATA 0x48
#define DLM_DATA 0x00

/*变量的定义、初始化*/
CSLBool b;
Uint16 eventId0;
int old_intm;
interrupt void int0(void);  //外部中断0
unsigned char str1[]={"study-kit.com   "};
unsigned char str2[]={"TEL:010-82623343"};
extern void VECSTART(void);

/****函数声明****/
void LCD1602_initial(  );
void Delay(unsigned int nDelay);
void  delaynum(unsigned int d_time);
void  wr_lcd(unsigned char dat_comm, unsigned int content);
void  lcd_display(void);
void clrram();

/*锁相环的设置*/
PLL_Config  myConfig      = {
   0,    //IAI: the PLL locks using the same process that was underway
                 //before the idle mode was entered
   1,    //IOB: If the PLL indicates a break in the phase lock,
                 //it switches to its bypass mode and restarts the PLL phase-locking
                 //sequence
   12,    //PLL multiply value; multiply 12 times
   0             //Divide by 2 PLL divide value; it can be either PLL divide value
                 //(when PLL is enabled), or Bypass-mode divide value
                 //(PLL in bypass mode, if PLL multiply value is set to 1)
};
/*SDRAM的EMIF设置*/
EMIF_Config emiffig = {
   0x221,         //EGCR  : the MEMFREQ = 00,the clock for the memory is equal to cpu frequence
                           //                  the WPE = 0 ,forbiden the writing posting when we debug the EMIF
                           //        the MEMCEN = 1,the memory clock is reflected on the CLKMEM pin
                           //        the NOHOLD = 1,HOLD requests are not recognized by the EMIF
   0xFFFF,        //EMI_RST: any write to this register resets the EMIF state machine

   0x1fff,        //CE3_1:  CE0 space control register 1
   0x00ff,        //CE3_2:  CE0 space control register 2
   0x00ff,        //CE3_3:  CE0 space control register 3  

   0x1fff,        //CE1_1:  CE0 space control register 1
             //        Asynchronous, 16Bit
   0x00ff,        //CE1_2:  CE0 space control register 2
   0x00ff,        //CE1_3:  CE0 space control register 3

   0x1FFF,        //CE2_1:  CE0 space control register 1
             //        Asynchronous, 16Bit
   0xFFFF,        //CE2_2:  CE0 space control register 2
   0x00FF,        //CE2_3:  CE0 space control register 3
   
   0x1fff,        //CE3_1:  CE0 space control register 1
   0x00ff,        //CE3_2:  CE0 space control register 2
   0x00ff,        //CE3_3:  CE0 space control register 3
   
   0x2911,   //SDC1:   SDRAM control register 1
                           //                  TRC = 8
                           //        SDSIZE = 0;SDWID = 0
                           //        RFEN = 1
                           //        TRCD = 2
                           //        TRP  = 2
   0x0410,        //SDPER : SDRAM period register
                           //                  7ns *4096
   0x07FF,    //SDINIT: SDRAM initialization register
                           //        any write to this register to init the all CE spaces,
                           //        do it after hardware reset or power up the C55x device
   0x0131        //SDC2:          SDRAM control register 2
                           //        SDACC = 0;
                           //        TMRD = 01;
                           //        TRAS = 0101;
                           //        TACTV2ACTV = 0001;                                                               
   };

/*中断配置*/
void INTconfig()
{
     /* Temporarily disable all maskable interrupts */
     IRQ_setVecs((Uint32)(&VECSTART));

         /* Temporarily disable all maskable interrupts */
     old_intm = IRQ_globalDisable();

         /* Get Event Id associated with External INT1(8019), for use with */
         eventId0 = IRQ_EVT_INT0;

         /* Clear any pending INT0 interrupts */
         IRQ_clear(eventId0);

         /* Place interrupt service routine address at */
     /* associated vector location */
     IRQ_plug(eventId0,&int0);

         /* Enable INT0(8019) interrupt */
     IRQ_enable(eventId0);

         /* Enable all maskable interrupts */
     IRQ_globalEnable();   
}
void  delay(unsigned int d_time)
{
         while(d_time--);
}

main()
{
     unsigned int temp,data,i,k;
         /*初始化CSL库*/        
     CSL_init();
     
     /*EMIF为全EMIF接口*/
     CHIP_RSET(XBSR,0x0a01);
     
     /*设置系统的运行速度为144MHz*/
     PLL_config(&myConfig);
     
     /*初始化DSP的EMIF*/
     EMIF_config(&emiffig);
     
         INTconfig();

     /*UART初始化*/
            LCR = 0x80;      //设置波提率 通信线路控制寄存器
           temp=LCR;        //通信线路控制寄存器
           DLL = DLL_DATA;  //写除数低8位   
          DLM = DLM_DATA;  //写除数高8位
          temp=DLL_DATA;
          LCR = 0x00;     //设置通信的数据格式,D7=0
         LCR = 0x03;    //8位数据,一个停止位        
         FCR = 0xc1;    //FIFO控制寄存器,在FIFO模式
         MCR = 0x08;    //调制解调控制寄存器,OUT2=1,中断信号可通过系统总线送给8520中断控制寄存器
         IER = 0x00;    //中断使能寄存器禁止,4种中断都禁止
   

     while(1)
     {
         /*发送字符串*/
                 /*for(k=0;k<16;k++)
                   {
                       THR=str1[k];
                       delay(200);
                    }

                 for(k=0;k<16;k++)
                   {
                       THR=str2[k];
                       delay(200);
                    }  
                  delay(5000); */
      
      
           temp=LSR;   //通信线路状态寄存器
           data=ISR;   //中断识别寄存器,判别中断的类型
           THR =0x55;  //发送保持寄存器,要发送的数据是U,对应16进制ASCII
           if(temp&0x01)
           {  
                   lcd_display( ); //  液晶显示接受到字符
                       temp=0;
            }                                    
          delay(5000);

     }


         
}
void Delay(unsigned int nDelay)
{
         int ii,jj,kk=0;
         for ( ii=0;ii          {
                 for ( jj=0;jj<1024;jj++ )
                 {
                         kk++;
                 }
         }
}



//External INT0(EXINT)中断处理函数
interrupt void int0()
{
           unsigned int temp,data,i;
           temp=LSR;
           //data=ISR;

            if(temp&0x01)//LSR的最低位不为0,表示数据已经准备好接收
            {  
                   lcd_display( ); //  液晶显示接受到字符
                   temp=0;
             }  
            if(detect&0x20)//        发送缓冲寄存器为空,进行写操作
           {
                    THR=0x55;
                    printf("write data:%x",THR);
          }
         temp=0;
}

/*************************************************
液晶模块
*************************************************/

/***忙检测****/
void Delay(unsigned int nDelay)
{
        int ii,jj,kk=0;
        for ( ii=0;ii         {
                for ( jj=0;jj<1024;jj++ )
                {
                        kk++;
                }
        }
}
/*时序延时*/
void  delaynum(unsigned int d_time)
{
        while(d_time--);
}
void LCD1602_initial(  )
{
      wr_lcd(comm,0x01);
       wr_lcd(comm,0x30);
        wr_lcd(comm,0x0c);
        wr_lcd(comm,0x06);

}
void  wr_lcd(unsigned char dat_comm, unsigned int content)
{
        Delay(40);
        if(dat_comm)          // wtite  data   
        {
                LCD_REG=0x01;         // rs=1,en=0
                LCD_DATA=content;   
                LCD_REG=0x03;       //en=1,rs=1
                   delaynum(80);
                   LCD_REG=0x00;      //en=0 ,rs=0
        }
        else        //write  command
        {
                LCD_REG=0x00;        
                LCD_DATA=content;   
                 LCD_REG=0x02;      
                 delaynum(80);     
                LCD_REG=0x00;      
        }
    Delay(100);
}
/*液晶显示*/
void lcd_display( )
{
  int n;
  clrram();           
  wr_lcd(comm,0x80);
  for(n=0;n<14;n++)
  {
     wr_lcd(dat,RHR);
         delay(200);
  }
}
/*清屏*/
void clrram()
{
   wr_lcd(comm,0x01);

}



/******************************************************************************\
* End of UART.c
\******************************************************************************/

最新回复

“发的不对”就是说你发送的内容本来就是错的。“显示部分程序有问题”是说显示时数据对应的显示字符搞错了。到底是什么地方不对,一项项的去检查、排除,顺着“发送——接收——显示”这个顺序查找。   详情 回复 发表于 2014-3-24 16:16
点赞 关注
 

回复
举报

1万

帖子

140

TA的资源

版主

沙发
 
要么你发的就不对,要么你的程序特别是显示相关的部分有错。

点评

不太明白版主说的“发的就不对”是什么意思?显示部分程序有问题,怎讲?从哪里可以看出来?希望版主能够说的详细点,谢谢!  详情 回复 发表于 2014-3-23 21:58
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

44

帖子

17

TA的资源

一粒金砂(中级)

板凳
 
chunyang 发表于 2014-3-23 20:43
要么你发的就不对,要么你的程序特别是显示相关的部分有错。


不太明白版主说的“发的就不对”是什么意思?显示部分程序有问题,怎讲?从哪里可以看出来?希望版主能够说的详细点,谢谢!

点评

“发的不对”就是说你发送的内容本来就是错的。“显示部分程序有问题”是说显示时数据对应的显示字符搞错了。到底是什么地方不对,一项项的去检查、排除,顺着“发送——接收——显示”这个顺序查找。  详情 回复 发表于 2014-3-24 16:16
 
 
 

回复

1万

帖子

140

TA的资源

版主

4
 
ttxs_2013 发表于 2014-3-23 21:58
不太明白版主说的“发的就不对”是什么意思?显示部分程序有问题,怎讲?从哪里可以看出来?希望版主能 ...

“发的不对”就是说你发送的内容本来就是错的。“显示部分程序有问题”是说显示时数据对应的显示字符搞错了。到底是什么地方不对,一项项的去检查、排除,顺着“发送——接收——显示”这个顺序查找。

点评

好吧,谢谢回复!  详情 回复 发表于 2014-3-24 19:12
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 
 

回复

44

帖子

17

TA的资源

一粒金砂(中级)

5
 
chunyang 发表于 2014-3-24 16:16
“发的不对”就是说你发送的内容本来就是错的。“显示部分程序有问题”是说显示时数据对应的显示字符搞错 ...


好吧,谢谢回复!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表