portserial.c
上传用户:kongshuqi
上传日期:2013-10-09
资源大小:59k
文件大小:3k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * FreeModbus Libary: ATMega168 Port
  3.  * Copyright (C) 2006 Christian Walter <wolti@sil.at>
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2.1 of the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU Lesser General Public
  16.  * License along with this library; if not, write to the Free Software
  17.  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  18.  *
  19.  * File: $Id: portserial.c,v 1.3 2006/06/15 15:38:08 wolti Exp $
  20.  */
  21. #include <avr/io.h>
  22. #include <avr/interrupt.h>
  23. #include <avr/signal.h>
  24. #include "port.h"
  25. /* ----------------------- Modbus includes ----------------------------------*/
  26. #include "mb.h"
  27. #include "mbport.h"
  28. #define UART_BAUD_RATE 9600
  29. #define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_OSC)/((UART_BAUD_RATE)*16l)-1)
  30. #define UART_UCSRB  UCSR0B
  31. void
  32. vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
  33. {
  34.     UCSR0B |= _BV( TXEN0 );
  35.     if( xRxEnable )
  36.         UCSR0B |= _BV( RXEN0 ) | _BV( RXCIE0 );
  37.     else
  38.         UCSR0B &= ~( _BV( RXEN0 ) | _BV( RXCIE0 ) );
  39.     if( xTxEnable )
  40.         UCSR0B |= _BV( TXEN0 ) | _BV( UDRE0 );
  41.     else
  42.         //UCSR0B &= ~( _BV(TXEN0) | _BV(UDRE0) );
  43.         UCSR0B &= ~( _BV( UDRE0 ) );
  44. }
  45. BOOL
  46. xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
  47. {
  48.     /* prevent compiler warning. */
  49.     (void)ucPORT;
  50.     UBRR0 = UART_BAUD_CALC( ulBaudRate, F_CPU );
  51.     switch ( eParity )
  52.     {
  53.         case MB_PAR_EVEN:
  54.             UCSR0C |= _BV( UPM01 );
  55.             break;
  56.         case MB_PAR_ODD:
  57.             UCSR0C |= _BV( UPM01 ) | _BV( UPM00 );
  58.             break;
  59.         case MB_PAR_NONE:
  60.             break;
  61.     }
  62.     switch ( ucDataBits )
  63.     {
  64.         case 8:
  65.             UCSR0C |= _BV( UCSZ00 ) | _BV( UCSZ01 );
  66.             break;
  67.         case 7:
  68.             UCSR0C |= _BV( UCSZ01 );
  69.             break;
  70.     }
  71.     vMBPortSerialEnable( FALSE, FALSE );
  72.     return TRUE;
  73. }
  74. BOOL
  75. xMBPortSerialPutByte( CHAR ucByte )
  76. {
  77.     UDR0 = ucByte;
  78.     return TRUE;
  79. }
  80. BOOL
  81. xMBPortSerialGetByte( CHAR * pucByte )
  82. {
  83.     *pucByte = UDR0;
  84.     return TRUE;
  85. }
  86. SIGNAL( SIG_USART_DATA )
  87. {
  88.     pxMBFrameCBTransmitterEmpty(  );
  89. }
  90. SIGNAL( SIG_USART_RECV )
  91. {
  92.     //xMBPortSerialPutByte ( 'a');
  93.     pxMBFrameCBByteReceived(  );
  94. }