uart.c
上传用户:yyhongfa
上传日期:2013-01-18
资源大小:267k
文件大小:8k
开发平台:

C/C++

  1. /****************************************************************************
  2. uart.c
  3. ****************************************************************************/
  4. #ifndef UART_C
  5. #define UART_C
  6. #include  "config.h"
  7. //#include "IAP.h"
  8. //#include "ffs.h"
  9. #include "uart.h"
  10. //#include "main.h"
  11. u8_t  uart0_Buf[MAX_UART0_BUFFER];
  12. u8_t  uart1_Buf[MAX_UART1_BUFFER];
  13. u16_t  p_Uart0Wr, p_Uart1Wr;  /*point to the address will be  written ,every UART interrupt*/
  14. u16_t uart0_Useful_Data,  uart1_Useful_Data;  /*point to the address read , getchar()*/
  15. BOOL uart0_Interrupt, uart1_Interrupt ;
  16. /********************************
  17.  UART0 采用中断方式处理
  18.  *******************************/
  19.  void __irq IRQ_UART0(void)
  20. {
  21.     if(0x04 EQ (U0IIR & 0x0f))
  22.     {
  23.           p_Uart0Wr %= MAX_UART0_BUFFER;
  24.   
  25.           uart0_Buf[p_Uart0Wr++] = U0RBR;
  26.  
  27.          uart0_Useful_Data++;
  28.  if(uart0_Useful_Data > MAX_UART0_BUFFER)
  29.  {
  30.      uart0_Useful_Data = MAX_UART0_BUFFER;/*Because the max userful data is MAX_UART0_BUFFER*/
  31.  }
  32.  uart0_Interrupt = TRUE;
  33.     }  
  34.    VICVectAddr = 0x00;
  35. }
  36. /****************************************************************************
  37. * 名称:UART0_Ini()
  38. * 功能:初始化串口0。设置为8位数据位,1位停止位,
  39.                     无奇偶校验
  40. * 入口参数:无
  41. * 出口参数:无
  42. ****************************************************************************/
  43. void  UART0_Ini(void)
  44.     u16_t i;
  45.    PINSEL0 |= 0x00000005;     // 设置I/O连接到UART0
  46.    PINSEL1 &= 0xFFFFFFF5;
  47.    U0LCR = 0x83;             // DLAB = 1,可设置波特率
  48.    U0DLL = U0LCR_VALUE;
  49.    U0DLM = 0x00;
  50.    U0LCR = 0x03;
  51.    
  52.    U0FCR = 0x01; /*enable FIFO, 1byte*/
  53.    U0IER = 0x01; /*enable RBR interrupt*/
  54.    VICIntSelect = 0x00000000; 
  55.    VICVectCntl0 = 0x26; 
  56.    VICVectAddr0 = (u32_t)IRQ_UART0;
  57.    VICIntEnable |= 0x00000040;
  58.    for(i = 0; i < MAX_UART0_BUFFER; i++)
  59.    {
  60.         uart0_Buf[i] = 0;
  61.    }
  62.     p_Uart0Wr = 0;
  63.     uart0_Useful_Data = 0; 
  64. }
  65. /********************************
  66.  UART1 采用中断方式处理
  67.  *******************************/
  68.  void __irq IRQ_UART1(void)
  69. {
  70.     if(0x04 EQ (U1IIR & 0x0f))
  71.     {
  72.           p_Uart1Wr %= MAX_UART1_BUFFER;
  73.   uart1_Buf[p_Uart1Wr++] = U1RBR;
  74.  
  75.          uart1_Useful_Data++;
  76.  if(uart1_Useful_Data > MAX_UART1_BUFFER)
  77.  {
  78.      uart1_Useful_Data = MAX_UART1_BUFFER ;/*Because the max userful data is MAX_UART0_BUFFER*/
  79.  }
  80.  uart1_Interrupt = TRUE;
  81.     }  
  82.    VICVectAddr = 0x00;
  83. }
  84. /************************************
  85.   uart1 init
  86.  **********************************/
  87. void UART1_Ini(void)
  88. {
  89.    u16_t i;
  90.    U1LCR = 0x83;             // DLAB = 1,可设置波特率
  91.    U1DLL = U1LCR_VALUE;
  92.    U1DLM = 0x00;
  93.    U1LCR = 0x03;
  94.    
  95.    U1FCR = 0x01;
  96.    U1IER = 0x01;
  97.     VICIntSelect = 0x00000000;  /* ALL IRQ Interrupt*/
  98.     VICVectCntl1 = 0x27;           /*UART1 to IRQ Slot 1, the second highest priority*/
  99.     VICVectAddr1 = (int)IRQ_UART1;
  100.     VICIntEnable |= 0x00000080;
  101.    PINSEL0 |= 0x00050000;
  102.    PINSEL0 &= 0xfff5ffff;
  103.    for(i = 0; i < MAX_UART1_BUFFER; i++)
  104.    {
  105.         uart1_Buf[i] = 0;
  106.    }
  107.    p_Uart1Wr = 0;
  108.   uart1_Useful_Data = 0;
  109. }
  110. /****************************************************************************
  111. * 名称:sendByte_2_user()
  112. * 功能:向串口发送字节数据,并等待发送完毕。
  113. * 入口参数:data 要发送的数据
  114. * 出口参数:无
  115. ****************************************************************************/
  116. void  sendByte_2_user(u8_t data)
  117. {  U0THR = data;     // 发送数据
  118.    while( (U0LSR&0x40)==0 );     // 等待数据发送完毕
  119. }
  120. //UART SEND BYTE
  121. void sendByte_2_modem(u8_t data)
  122. #ifdef DEBUG_MODEM_DATA
  123.     const  CHAR ascTable[17] = {"0123456789ABCDEF"};
  124.     sendByte_2_user(ascTable[data>>4]);
  125.     sendByte_2_user(ascTable[data&0x0f]);
  126.     sendByte_2_user(' ');
  127. #endif
  128.    U1THR = data;
  129.    while((U1LSR & 0x40) == 0);
  130. }
  131. /****************************************************************************
  132. * 名称:sendString_2_user()
  133. * 功能:向串口发送一字符串
  134. * 入口参数:srt 要发送的字符串的指针
  135. * 出口参数:无
  136. ****************************************************************************/
  137. void  sendString_2_user(char *str)
  138. {  while(1)
  139.    {  if( *str == '' ) break;
  140.       sendByte_2_user(*str++);     // 发送数据
  141.    }
  142. }
  143. /****************************************************************************
  144. * 名称:sendString_2_modem()
  145. * 功能:向串口发送一字符串
  146. * 入口参数:srt 要发送的字符串的指针
  147. * 出口参数:无
  148. ****************************************************************************/
  149. void  sendString_2_modem(char *str)
  150. {  while(1)
  151.    {  if( *str == '' ) break;
  152.       sendByte_2_modem(*str++);     // 发送数据
  153.    }
  154. }
  155. /*****************************
  156.    INT16 Uart0_getByte(u8_t *ch)
  157.      *ch : output byte address
  158.      return: -1  no data
  159.                 0    ok
  160.   ******************************/
  161.   INT16 Uart0_getByte(u8_t *ch)
  162.  {
  163.        //DEBUG_FUNCTION("rnUart0_getByte");
  164.        
  165.        uart0_Interrupt = FALSE;
  166.    
  167.        if(uart0_Useful_Data EQ 0)
  168.        {
  169.              return UART_NO_DATA;
  170.        }
  171. else
  172. {
  173.       if(uart0_Useful_Data <= p_Uart0Wr)
  174.       {
  175.              *ch = uart0_Buf[p_Uart0Wr - uart0_Useful_Data];
  176.       }
  177.      else
  178.      {
  179.               *ch = uart0_Buf[MAX_UART0_BUFFER - uart0_Useful_Data + p_Uart0Wr];        
  180.      }
  181.    if(uart0_Interrupt EQ TRUE)/*interrupt by UART0, so the data just read may be not right*/
  182.    {
  183.        return UART_NO_DATA;
  184.    }
  185.    else
  186.    {
  187.       uart0_Useful_Data--;
  188.       return DATA_READ_OK;
  189.    }
  190. }
  191.  }
  192. /*****************************
  193.    INT16 Uart1_getByte(u8_t *ch)
  194.      *ch : output byte address
  195.      return: -1  no data
  196.                 0    ok
  197.   ******************************/
  198.   INT16 Uart1_getByte(u8_t *ch)
  199.  {
  200.        //DEBUG_FUNCTION("rnUart0_getByte");
  201.  uart1_Interrupt = FALSE;
  202.  
  203.        if(uart1_Useful_Data EQ 0)
  204.        {
  205.              return UART_NO_DATA;
  206.        }
  207. else
  208. {
  209.       if(uart1_Useful_Data <= p_Uart1Wr)
  210.       {
  211.            *ch = uart1_Buf[p_Uart1Wr - uart1_Useful_Data];
  212.       }
  213.      else
  214.      {
  215.           *ch = uart1_Buf[MAX_UART1_BUFFER - uart1_Useful_Data + p_Uart1Wr];
  216.      }
  217.     if(uart1_Interrupt EQ TRUE)/*interrupt by UART1, so the data just read may be not right*/
  218.     {
  219.         return UART_NO_DATA;
  220.     }
  221.     else
  222.     {
  223.          uart1_Useful_Data--;
  224.         return DATA_READ_OK;
  225.     }
  226. }
  227.  }
  228. /**********************************
  229.    return now UART1 useful data length
  230.   *********************************/
  231.   u16_t  get_modem_datalen(void)
  232.   {
  233.       return uart1_Useful_Data;
  234.   }
  235. /****************************
  236.   return UART0  useful data lenght
  237.  ******************************/
  238. u16_t  get_user_datalen(void)
  239. {
  240.     return uart0_Useful_Data;
  241. }
  242. u32_t get_modem_data(u8_t *buf)
  243. {
  244.     u8_t ch;
  245.      int  len = 0;
  246. #ifdef DEBUG_MODEM_DATA
  247.     const  CHAR ascTable[17] = {"0123456789ABCDEF"};
  248. #endif
  249.    
  250.     while((uart1_Useful_Data > 0) AND (len <= MAX_READ_LEN))
  251.     {
  252.   if(Uart1_getByte(&ch) EQ DATA_READ_OK)
  253.   {
  254.       buf[len++] = ch;
  255.   
  256.  #ifdef DEBUG_MODEM_DATA
  257.      sendByte_2_user(ascTable[ch>>4]);
  258.             sendByte_2_user(ascTable[ch&0x0f]);
  259.             sendByte_2_user(' ');
  260. #endif
  261.   }
  262.    }
  263.    return len;
  264. }
  265. #define MAX_DELAY_TIME 200
  266. u32_t get_user_data(u8_t *buf)
  267. {
  268.      u8_t ch;
  269.      u16_t len = 0;
  270.      u32_t  time = sys_jiffies();
  271.   
  272.     while((uart0_Useful_Data > 0) OR((sys_jiffies() - time) < MAX_DELAY_TIME))
  273.     {
  274.   if(Uart0_getByte(&ch) EQ DATA_READ_OK)
  275.   {
  276.       buf[len++] = ch;
  277.       time = sys_jiffies();
  278.   }
  279.   if(len > MAX_READ_LEN)
  280.          {
  281.              break;
  282.   }
  283.     }
  284.    return len;
  285. }
  286. u32_t writeDate_2_modem(void *device, u8_t *data, u32_t len)
  287. {
  288.      u32_t temp = len;
  289.  
  290.      while(len > 0)
  291.      {
  292.            sendByte_2_modem(*data++);
  293.     len--;
  294.      }
  295.     return temp;
  296. }
  297. u32_t writeDate_2_user( u8_t *data, u32_t len)
  298. {
  299.      u32_t temp = len;
  300.    
  301.     while(len > 0)
  302.      {
  303.            sendByte_2_user(*data++);
  304.     len--;
  305.      }
  306.     return temp;
  307. }
  308. void sio_read_abort(void *pd)
  309. {
  310.    return;
  311. }
  312. #endif