📄 ser1.h
字号:
/***************************************************************************
* This code and information is provided "as is" without warranty of any *
* kind, either expressed or implied, including but not limited to the *
* implied warranties of merchantability and/or fitness for a particular *
* purpose. *
* *
* Copyright (C) 2005 Teridian Semiconductor Corp. All Rights Reserved. *
***************************************************************************/
//**************************************************************************
//
// DESCRIPTION: 71M65xx POWER METER - API for SERIAL Ports.
//
// AUTHOR: RGV
//
// HISTORY: See end of file
//
//**************************************************************************
//
// File: SER1.H
//
//**************************************************************************
// Hardware access layer for UART 1
// This defines two interfaces. There's a specific interface, indexed
// to uart 1. There's also a generic interface, unindexed. The idea
// is that a protocol layer can be written in terms of the generic
// interface, and then quickly ported to any serial interface just by
// changing the include file, say from ser0.h to ser1.h
//
#ifndef SER1_H
#define SER1_H 1
#include "ser.h" // definitions shared by the two uarts
// higher-level serial code is invoked by SER0_XMIT_INT and SER0_RCV_INT
// as defined in options.h
// Get data from the receive register; This can't be a macro, alas,
// because it has to clear the RI bit before it returns a value.
extern bool ser1_error; // status for the most recent byte read
extern uint8_t ser1_rcv (void) small reentrant; /* define a common routine to find parity */
// provide a macro so higher level driver code can run on either port
#undef ser_rcv
#define ser_rcv() ser1_rcv()
// Put data in the transmit register
#if SEVEN_BIT_1
#if PARITY_NONE_1
// seven bits, no parity, two stop bits
#define ser1_xmit(_in_) \
S1CON &= ~TI_; \
S1BUF = _in_ | 0x80 /* force two stop bits */
#else
// seven bits, even or odd parity, one stop bit
#define ser1_xmit(_in_) \
S1CON &= ~TI_; \
A = _in_ & 0x7F; \
if (0 != (P ^ PARITY_ODD_1)) \
A |= 0x80; \
S1BUF = A;
#endif
#else
#if PARITY_NONE_1
// eight bits, no parity, one stop bit
#define ser1_xmit(_in_) \
S1CON &= ~TI_; \
S1BUF = _in_
#else
// eight bits, even or odd parity, one stop bit
#define ser1_xmit(_in_) \
S1CON &= ~TI_; \
A = _in_; /* Force correct parity flag. */ \
if (P ^ PARITY_ODD_1) \
S1CON |= TB8_; /* ODD parity (or MARK). */ \
else \
S1CON &= ~TB8_; /* EVEN parity (or SPACE).. */ \
S1BUF = A
#endif
#endif
// provide a macro so higher level driver code can run on either port
#undef ser_xmit
#define ser_xmit(_in_) ser1_xmit(_in_)
// Is the receive register ready?
#define ser1_rcv_rdy() (S1CON & RI_)
// provide a macro so higher level driver code can run on either port
#undef ser_rcv_rdy
#define ser_rcv_rdy() ser1_rcv_rdy()
// Does the receive register have an error?
#if PARITY_NONE_1
// if no parity, there's no way to tell, so there's never an error
#define ser1_rcv_err() FALSE
#define ser1_clr_err()
#else
// if parity, publish the bit set by ser_rcv();
#define ser1_rcv_err() ser1_error
#define ser1_clr_err() ser1_error = FALSE
#endif
// provide macros so higher level driver code can run on either port
#undef ser_rcv_err
#undef ser_clr_err
#define ser_rcv_err() ser1_rcv_err()
#define ser_clr_err() ser1_clr_err()
// Is the transmit register empty?
#define ser1_xmit_rdy() (S1CON & TI_)
// provide a macro so higher level driver code can run on either port
#undef ser_xmit_rdy
#define ser_xmit_rdy() ser1_xmit_rdy()
// Enable an interrupt when the receive register ready.
#define ser1_enable_rcv_rdy() IEN2 |= ES1_; S1CON |= REN_
// provide a macro so higher level driver code can run on either port
#undef ser_enable_rcv_rdy
#define ser_enable_rcv_rdy() ser1_enable_rcv_rdy()
// Disable an interrupt when the receive register ready.
#define ser1_disable_rcv_rdy() S1CON &= ~REN_
// provide a macro so higher level driver code can run on either port
#undef ser_disable_rcv_rdy
#define ser_disable_rcv_rdy() ser1_disable_rcv_rdy()
// Enable an interrupt when the receive register ready.
#define ser1_enable_xmit_rdy() IEN2 |= ES1_; S1CON |= TI_
// provide a macro so higher level driver code can run on either port
#undef ser_enable_xmit_rdy
#define ser_enable_xmit_rdy() ser1_enable_xmit_rdy()
// Disable an interrupt when the receive register ready.
#define ser1_disable_xmit_rdy() S1CON &= ~TI_
// provide a macro so higher level driver code can run on either port
#undef ser_disable_xmit_rdy
#define ser_disable_xmit_rdy() ser1_disable_xmit_rdy()
// Turn on the transmitter
// #define ser1_xmit_on() DIO &= ~OPT_TXDIS /* enables output */
#if M6520
/* forcibly enables TXE */
#define ser1_xmit_on() CONFIG2 &= ~OPT_TXE
#elif TRACE10
#define ser1_xmit_on() /* does nothing */
#else
#error unknown device
#endif
// provide a macro so higher level driver code can run on either port
#undef ser_xmit_on
#define ser_xmit_on() ser1_xmit_on()
// turn off the transmitter
#if M6520
/* forcibly disables TXE */
#if PULSE_SOFT // then this pin is pulse4, on DIO2
#define ser1_xmit_off() CONFIG2 = (CONFIG2 & ~OPT_TXE) | _DIO2
#else
#define ser1_xmit_off() CONFIG2 = (CONFIG2 & ~OPT_TXE) | _WPULSE
#endif
#elif TRACE10
//#define ser1_xmit_off() DIO |= OPT_TXDIS /* disables output */
#define ser1_xmit_off() /* does nothing */
#else
#error unknown device
#endif
// provide a macro so higher level driver code can run on either port
#undef ser_xmit_off
#define ser_xmit_off() ser1_xmit_off() /* disables output */
// permit other uses of the serial transmitter's pin
// provide a macro so higher level driver code can run on either port
#undef ser_xmit_free
//#define ser1_xmit_free() DIO |= OPT_TXDIS /* disables output */
//#define ser_xmit_free() ser1_xmit_free
#define ser_xmit_free() ser_xmit_off() /* disables output */
// Initialize UART 1
extern void ser1_initialize (enum SERIAL_SPD speed) small reentrant;
// provide a macro so higher level driver code can run on either port
#undef ser_initialize
#define ser_initialize(x) ser1_initialize(x)
#undef BAUD
#define BAUD BAUD_1
/***************************************************************************
* $Log: ser1.h,v $
* Revision 1.22 2006/10/13 00:47:29 tvander
* Removed compile options for 6530, 6515;
* renamed 6511 and 6513 to trace11 and trace13;
* Binary verified unchanged from previous version.
*
* Revision 1.21 2006/09/27 00:57:02 tvander
* More comments
*
* Revision 1.20 2006/09/09 01:10:05 gmikef
* *** empty log message ***
*
* Revision 1.19 2006/08/17 22:21:22 tvander
* For software pulse outputs, SER1 switches OPT_TX to DIO2, so PULSE4
* can come out, instead of the watt-pulse.
*
* Revision 1.18 2006/07/07 00:56:58 tvander
* Made the serial initialization routines reentrant.
*
* Revision 1.17 2006/05/25 03:26:59 tvander
* Logic to enable pulse output for DIO2
*
* Revision 1.15 2005/09/22 23:45:07 tvander
* Clean build all models and unit tests, updated copyright to be fore Teridian
*
* Revision 1.14 2005/09/11 00:33:59 tvander
* Clean compiles
*
* Revision 1.13 2005/09/07 05:28:05 tvander
* 7 bit transmit wasn't managing the transmit interrupt flag!! (e.g. TI in uart0)
*
* Revision 1.12 2005/08/31 05:54:40 gmikef
* First version w/ LAPIE interface.
*
* Revision 1.11 2005/08/28 02:15:47 gmikef
* *** empty log message ***
*
* Revision 1.10 2005/08/19 01:04:40 gmikef
* *** empty log message ***
*
* Revision 1.9 2005/05/26 21:54:36 tvander
* Flag is grossly working with GUI: signs on, reads, writes both xdata and idata, interlocks with CE cycle, and timeouts work.
*
* Revision 1.8 2005/05/19 00:31:01 tvander
* Fixed so ser0 and ser1 can coexist in the same file. as they were designed to do.
*
* Revision 1.7 2005/04/21 02:00:59 gmikef
* *** empty log message ***
*
* Revision 1.5 2005/04/09 02:04:26 gmikef
* *** empty log message ***
*
* Revision 1.6 2005/04/06 23:04:43 tvander
* First valid compile of flag
*
* Revision 1.5 2005/03/31 00:18:23 tvander
* Minimally unit tested.
* UART 0 is tested at 9600 BAUD 7 bits even parity, one stop bit.
* UART 1 is tested at 300 BAUD 7 bits even parity, one stop bit.
*
* Revision 1.4 2005/03/24 22:12:52 tvander
* Misc improvements
*
* Revision 1.3 2005/03/24 01:39:00 tvander
* First successful compile of serial unit test
*
* Revision 1.2 2005/03/23 19:19:32 tvander
* Added untested timer functions.
* Updated iicdio and iiceep to reflect improvements in 6510 code.
* ser0 and ser1 updated to provide features for flag.
*
* Revision 1.1 2005/03/15 00:32:35 tvander
* More realistic hardware abstraction layer.
*
* Revision 1.1 2005/03/11 22:17:22 tvander
* Structure
*
* Copyright (C) 2005 Teridian Semiconductor Corp. All Rights Reserved. *
* this program is fully protected by the United States copyright *
* laws and is the property of Teridian Semiconductor Corporation. *
***************************************************************************/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -