当前位置: 代码迷 >> 单片机 >> 飞思卡尔mc9s12的串口通信,该怎么处理
  详细解决方案

飞思卡尔mc9s12的串口通信,该怎么处理

热度:97   发布时间:2016-04-28 15:08:13.0
飞思卡尔mc9s12的串口通信
我的程序可以发送数据,但是不能接收数据。请问是为什么,我把代码贴出来吧。我发现里边rdrf一旦进入中断后就自动变为0,而且不管我怎么赋值,也不能改变sci0sr1_rdrf的值,请问谁知道是为什么呢?
#include <hidef.h>      /* common defines and macros */
#include "headers/uart.h"
void main(void) {
  UART_s8Init(Duart0, 9600); 
  
        EnableInterrupts;

  UART_s8SendByte( Duart0, 2 );
   
  for(;;) {
  
    _FEED_COP(); /* feeds the dog */
    
  } /* loop forever */
  /* please make sure that you never leave main */
}
#include "headers\uart.h"
#include <mc9s12dg128.h>
#pragma LINK_INFO DERIVATIVE "mc9s12dg128"

#if (Duart_UART0_used)
volatile static U8 u8Uart0_RxBuffer[Duart_BUFFER_SIZE_RX];
volatile static U8 u8Uart0_RxB_indexin=0;
volatile static U8 u8Uart0_RxB_indexout=0;
volatile static U8 u8Rx_0_Error=0;
#endif

S8 UART_s8Init( U8 UART_Id, U32 baudrate)
{
        U16 ubrr_value=0;
#if F_UART==8000000
         switch( baudrate )
         { case   2400 : ubrr_value =   207; break;
           case   4800 : ubrr_value = 103; break;
           case   9600 : ubrr_value =  52; break;
           case  14400 : ubrr_value =  34; break;
           case  19200 : ubrr_value =  25; break;
           case  28800 : ubrr_value =  16; break;
           case  38400 : ubrr_value =  12; break;
           case  57600 : ubrr_value =   8; break;
           case  76800 : ubrr_value =   6; break;
           case 115200 : ubrr_value =   3; break;
           case 230400 : ubrr_value =   1; break;
           case 250000 : ubrr_value =   1; break;
           case 500000 : ubrr_value =   0; break;
           default     : return( -1 );
         }
        #else
                #error "F_UART non reconnu ou non defini !"
  #endif
                
#if (Duart_UART0_used)
                if(UART_Id==Duart0)
                {
                  SCI0BDH=(ubrr_value>>8) & 0xFF;
      SCI0BDL=ubrr_value& 0xFF;    
      SCI0CR1=0x00; // SCICR1: LOOPS=0,SCISWAI=0,RSRC=0,M=0,WAKE=0,ILT=0,PE=0,PT=0
      SCI0CR2=0x2C;         // enable tx et rx interrupts
                }
#endif
        return(0);
}

S8 UART_s8GetByte( U8 UART_Id )
{
#if (Duart_UART0_used)
     if(UART_Id==Duart0)
     {
        if(u8Rx_0_Error==1)
       {
        u8Rx_0_Error=0;
        return(-1); // Err Rx
        }else
       {
        while(SCI1SR1_RDRF==0) ; //=while(!SCI1SR1_RDRF); waite until le data arrive , rdrf!=1
        SCI1SR1_RDRF=1; 
        return SCI1DRL;
  相关解决方案