打印
[技术问答]

请教M0串口问题?

[复制链接]
2741|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mhh566|  楼主 | 2015-1-3 15:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
麻烦各位高手帮忙解决各串口问题。
M0控制器FIFO触发级别配置为接收8个字节产生中断,通过PC上的串口调试助手发送一串数据,如01,02 ,03,04一直到0F.。但是进入中断服务程序后接受寄存器接受的第一个字节却为0F.   变成0F,02,03,04---0F..
望高手帮忙解答下,谢了。
沙发
匆匆那年| | 2015-1-4 08:51 | 只看该作者
把你的UART初始化部分代码和中断处理部分贴出来,不然大家没办法替你解答

使用特权

评论回复
板凳
gaoyang9992006| | 2015-1-4 08:53 | 只看该作者
你先设定一个应答信号,当应答完成后再发送你的数据,不然一直发送应答信号。

使用特权

评论回复
地板
mhh566|  楼主 | 2015-1-5 10:14 | 只看该作者
void UART0_Init(void)
{
    P3_MFP = (P3_MFP & (~(P31_TXD0 | P30_RXD0))) | (TXD0 | RXD0); //ÅäÖÃP3.1ºÍP3.0ΪUART¹¦ÄÜ
    P3_PMD &=~(3);
          P3_PMD &=(~(1<<3));
    IPRSTC2 |= UART0_RST;                            //¸´Î»UARTÄ£¿é
    IPRSTC2 &= ~UART0_RST;                           //UARTÄ£¿é´Ó¸´Î»×´Ì¬»Ö¸´µ½Õý³£¹¤×÷״̬

    APBCLK |= UART0_CLKEN;                           //ʹÄÜUARTʱÖÓ
    CLKSEL1 = (CLKSEL1 & (~UART_CLK)) | UART_12M;      //Ñ¡ÔñÍⲿ12M×÷ΪUARTʱÖÓÔ´
    CLKDIV &= ~(15<<8);                              //ÉèÖÃUARTʱÖÓ³ýƵֵΪ0

    UA0_FCR |= TX_RST;                               //¸´Î»·¢ËÍFIFO
    UA0_FCR |= RX_RST;                               //¸´Î»½ÓÊÕFIFO
          UA0_FCR |=(1<<5);                                //Öжϴ¥·¢¼¶±ð

    UA0_LCR &= ~PBE;                                 //УÑéλ½ûÖ¹
    UA0_LCR = (UA0_LCR & (~WLS)) | WL_8BIT;          //Êý¾Ý¿í¶ÈΪ8λ
    UA0_LCR &= NSB_ONE;                              //1λֹͣλ

    UA0_BAUD |= DIV_X_EN;                            //ģʽ2:DIV_X_EN = 1
    UA0_BAUD |= DIV_X_ONE;                           //ģʽ2:DIV_X_ONE =1
   
    UA0_BAUD |= ((12000000 / 9600) - 2);             //ÉèÖò¨ÌØÂÊΪ9600£¬Ä£Ê½2²¨ÌØÂÊ=UART_CLK/(UA_BAUD+2)
//        NVIC_IPR3 |=(1<<6);                                                             //ÖжÏÓÅÏȼ¶ÅäÖÃ
    UA0_TOR =(UA0_TOR &(~0x3F))|(40);
    UA0_IER |=TIME_OUT_EN;                                                         //ʹÄܽÓÊÕ³¬Ê±¼ÆÊýÆ÷
        UA0_IER |=RTO_IEN;
        UA0_IER        |= RDA_IEN;                              //ʹÄÜÖжÏ
    NVIC_ISER = UART0_INT;                           //ʹÄÜNVIC UART0ÖжÏ
}

使用特权

评论回复
5
mhh566|  楼主 | 2015-1-5 10:21 | 只看该作者
void UART0_IRQHandler(void)
{
uint8_t i,x=0;
count =0;
//  SYST_CSR &=~1;
if(UA0_ISR &TOUT_INT)
{
  UA0_FCR |= RX_RST;
  UA0_FCR |= TX_RST;
}
if(UA0_ISR & RDA_INT)
{
         for(i=8;i<16;i++)
  {
   while (UA0_FSR & RX_EMPTY);                //µÈ×Ö·û
  command[i] =UA0_RBR;
   if(command[8]!=0xEE)
   {
    command[i-8] =command[i];
          x =command[2];
   }
   else
   {
    x =command[2];
   }
  }         
        if((x==2)||(x==12)||(x==14)||(x==16)||(x==18))
  {
   if(command[8]==0xee)
   {
    UA0_FCR |= RX_RST;
    UA0_FCR |= TX_RST;
          recive_flag =0xAA;
    switch_flag =0x55;
    command[8] =0;
   }
   else if((command[3]==0)&&(command[2]!=2))
   {
    UA0_FCR |= RX_RST;
    UA0_FCR |= TX_RST;
          recive_flag =0xAA;
    switch_flag =0x55;
   }
  }
  else if(x<21)
  {
   UA0_FCR |= RX_RST;
   UA0_FCR |= TX_RST;
   recive_flag =0xAA;
   switch_flag =0x55;
   command[8] =0;
  }
        else
        {
   SYST_CVR =0;
   SYST_CSR |=1;         //ʹÄÜSysTickʱÖÓ
  }
}
}

使用特权

评论回复
6
mhh566|  楼主 | 2015-1-5 10:32 | 只看该作者
gaoyang9992006 发表于 2015-1-4 08:53
你先设定一个应答信号,当应答完成后再发送你的数据,不然一直发送应答信号。 ...

我还遇到一个奇怪问题,在仿真调试情况下,可以看到每执行一步,即使没有读取接收寄存器的值,但是内容却会消失。例如我发送给控制器的是01.02,03,04,当进入中断服务程序时接收寄存器是01,但是我单步运行一次寄存器就变成02了,等运行到要读取接收寄存器值时,它可能就是02,03,04或者00了。

使用特权

评论回复
7
gaoyang9992006| | 2015-1-5 10:42 | 只看该作者
mhh566 发表于 2015-1-5 10:32
我还遇到一个奇怪问题,在仿真调试情况下,可以看到每执行一步,即使没有读取接收寄存器的值,但是内容却 ...

你按照我的方法,先约定一个字符串作为握手的依据,当成功握手三次后再开始传送,你这样试一下,看看能否解决,如果不解决就是代码的某个环节出了问题,有丢帧的嫌疑,这样就好解决问题了。

使用特权

评论回复
8
Ketose| | 2015-1-5 11:17 | 只看该作者
一般出现乱码都是时钟设置问题。

使用特权

评论回复
9
598330983| | 2015-1-5 13:39 | 只看该作者
Ketose 发表于 2015-1-5 11:17
一般出现乱码都是时钟设置问题。

时钟开始的时候震荡的不给力,不均匀,先慢慢的均匀了,再传。

使用特权

评论回复
10
niuyaliang| | 2015-1-6 17:45 | 只看该作者
Ketose 发表于 2015-1-5 11:17
一般出现乱码都是时钟设置问题。

同意,时钟,波特率的问题,楼主可以试着在官方的例程上修改,是否会出现你的问题

使用特权

评论回复
11
lovecat2015| | 2015-1-29 13:01 | 只看该作者
把详细代码和你自己想法说出来

使用特权

评论回复
12
quray1985| | 2015-1-29 19:50 | 只看该作者
估计是波特率设置的不正确

使用特权

评论回复
13
598330983| | 2015-2-28 09:30 | 只看该作者
波特绿搞低点试试,晶振或许不标准

使用特权

评论回复
14
598330983| | 2015-2-28 09:31 | 只看该作者
9600波特率不高了,应该没问题换个晶振试试

使用特权

评论回复
15
598330983| | 2015-2-28 09:32 | 只看该作者
是不是配置有问题

使用特权

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

本版积分规则

1

主题

5

帖子

0

粉丝