Sorry, this alias seems not allow attachment. I paste
my source file here. I don't if it is the right place
to
ask these questions. If not, please point me to the
right alias. Thanks a lot in advance.
sio.c
/*------------------------------------------------------------------------------
SIO.C: Serial Communication Routines.
Copyright 1995-2002 KEIL Software, Inc.
------------------------------------------------------------------------------*/
#include <reg51.h>
#include <string.h>
#include "sio.h"
xdata volatile unsigned char D5ON _at_ 0xB000;
xdata volatile unsigned char D5OFF _at_ 0xB100;
/*------------------------------------------------------------------------------
Notes:
The length of the receive and transmit buffers must be
a power of 2.
Each buffer has a next_in and a next_out index.
If next_in = next_out, the buffer is empty.
(next_in - next_out) % buffer_size = the number of
characters in the buffer.
------------------------------------------------------------------------------*/
#define TBUF_SIZE 2 /*** Must be one of
these powers of 2 (2,4,8,16,32,64,128) ***/
#define RBUF_SIZE 2 //8 /*** Must be one
of these powers of 2 (2,4,8,16,32,64,128) ***/
#define TBUF_SPACE idata /*** Memory space
where the transmit buffer resides ***/
#define RBUF_SPACE idata /*** Memory space
where the receive buffer resides ***/
#define CTRL_SPACE data /*** Memory space for
the buffer indexes ***/
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
#if TBUF_SIZE < 2
#error TBUF_SIZE is too small. It must be larger than
1.
#elif TBUF_SIZE > 128
#error TBUF_SIZE is too large. It must be smaller
than 129.
#elif ((TBUF_SIZE & (TBUF_SIZE-1)) != 0)
#error TBUF_SIZE must be a power of 2.
#endif
#if RBUF_SIZE < 2
#error RBUF_SIZE is too small. It must be larger than
1.
#elif RBUF_SIZE > 128
#error RBUF_SIZE is too large. It must be smaller
than 129.
#elif ((RBUF_SIZE & (RBUF_SIZE-1)) != 0)
#error RBUF_SIZE must be a power of 2.
#endif
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
static TBUF_SPACE unsigned char tbuf [TBUF_SIZE];
static RBUF_SPACE unsigned char rbuf [RBUF_SIZE];
static CTRL_SPACE unsigned char t_in = 0;
static CTRL_SPACE unsigned char t_out = 0;
static CTRL_SPACE unsigned char r_in = 0;
static CTRL_SPACE unsigned char r_out = 0;
static bit ti_restart = 0; /* NZ if TI=1 is required
*/
unsigned char led;
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
static void com_isr (void) interrupt 4
{
/*------------------------------------------------
Received data interrupt.
------------------------------------------------*/
if (RI != 0)
{
RI = 0;
if (((r_in - r_out) & ~(RBUF_SIZE-1)) == 0)
{
rbuf [r_in & (RBUF_SIZE-1)] = SBUF;
r_in++;
}
led = D5ON;
}
/*------------------------------------------------
Transmitted data interrupt.
------------------------------------------------*/
if (TI != 0)
{
TI = 0;
if (t_in != t_out)
{
SBUF = tbuf [t_out & (TBUF_SIZE-1)];
t_out++;
ti_restart = 0;
}
else
{
ti_restart = 1;
}
}
}
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
//#pragma disable
void com_initialize (void)
{
/*------------------------------------------------
Setup TIMER1 to generate the proper baud rate.
------------------------------------------------*/
com_baudrate (1200);
/*------------------------------------------------
Clear com buffer indexes.
------------------------------------------------*/
t_in = 0;
t_out = 0;
r_in = 0;
r_out = 0;
/*------------------------------------------------
Setup serial port registers.
------------------------------------------------*/
SM0 = 0; SM1 = 1; /* serial port MODE 1 */
SM2 = 0;
REN = 1; /* enable serial receiver */
RI = 0; /* clear receiver interrupt */
TI = 0; /* clear transmit interrupt */
ti_restart = 1;
ES = 1; /* enable serial interrupts */
PS = 0; /* set serial interrupts to low
priority */
}
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
//#pragma disable
void com_baudrate (
unsigned baudrate)
{
/*------------------------------------------------
Clear transmit interrupt and buffer.
------------------------------------------------*/
TI = 0; /* clear transmit interrupt */
t_in = 0; /* empty transmit buffer */
t_out = 0;
/*------------------------------------------------
Set timer 1 up as a baud rate generator.
------------------------------------------------*/
TR1 = 0; /* stop timer 1 */
ET1 = 0; /* disable timer 1 interrupt */
PCON |= 0x80; /* 0x80=SMOD: set serial baudrate
doubler */
TMOD &= ~0xF0; /* clear timer 1 mode bits */
TMOD |= 0x20; /* put timer 1 into MODE 2 */
TH1 = (unsigned char) (256 - (XTAL / (16L * 12L *
baudrate)));
TR1 = 1; /* start timer 1 */
}
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
//#pragma disable
char com_putchar (
unsigned char c)
{
/*------------------------------------------------
If the buffer is full, return an error value.
------------------------------------------------*/
if (com_tbuflen () >= TBUF_SIZE)
return (-1);
/*------------------------------------------------
Add the data to the transmit buffer. If the
transmit interrupt is disabled, then enable it.
------------------------------------------------*/
tbuf [t_in & (TBUF_SIZE - 1)] = c;
t_in++;
if (ti_restart)
{
ti_restart = 0;
TI = 1; /* generate transmit interrupt
*/
}
return (0);
}
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
//#pragma disable
int com_getchar (void)
{
if (com_rbuflen () == 0)
return (-1);
return (rbuf [(r_out++) & (RBUF_SIZE - 1)]);
}
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
//#pragma disable
unsigned char com_rbuflen (void)
{
return (r_in - r_out);
}
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
//#pragma disable
unsigned char com_tbuflen (void)
{
return (t_in - t_out);
}
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
main.c
/*------------------------------------------------------------------------------
MAIN.C: Interrupt Driver SIO Using printf.
Copyright 1995-2002 KEIL Software, Inc.
------------------------------------------------------------------------------*/
#include <reg51.h>
#include <stdio.h>
#include "sio.h"
/*XTAL=11059200*/
/*------------------------------------------------------------------------------
_getkey waits until a character is received from the
serial port. This may not
be the exact desired operation (for example if the
buffer is empty, this
function hangs waiting for a character to be
received).
------------------------------------------------------------------------------*/
char _getkey (void)
{
int k;
do
{
k = com_getchar ();
}
while (k == -1);
return ((unsigned char) k);
}
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
char putchar (char c)
{
volatile unsigned int i;
while (com_putchar (c) != 0)
{
for (i=0; i<1000; i++)
{
/*** DO NOTHING ***/
}
}
return (c);
}
/*------------------------------------------------------------------------------
Note that the two function above, _getkey and putchar,
replace the library
functions of the same name. These functions use the
interrupt-driven serial
I/O routines in SIO.C.
------------------------------------------------------------------------------*/
code char message [] =
"This is a test to see if the interrupt driven
serial I/O routines really work.";
void main (void)
{
com_initialize (); /* initialize
interrupt driven serial I/O */
com_baudrate (1200); /* setup for 1200 baud
*/
EA = 1; /* Enable Interrupts
*/
printf ("Interrupt-driven Serial I/O
Example\r\n\r\n");
while (1)
{
unsigned char c;
printf ("You have pressed a key.\r\n");
c = getchar ();
printf ("\r\n");
printf ("You pressed '%c'.\r\n\r\n", c);
}
}
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
--- lei chen <[EMAIL PROTECTED]> :
> Hi,
> I am using FX2 CY3681 to develop a USB device like
> usb-serial adaptor. I want to use the serial port 0
> on CY3681 to send and receive data.
> That is:
> Host1---> EZ-USB FX2 ---> Test system( Solaris)
> RS232 USB
>
_________________________________________________________
Do You Yahoo!?
注册世界一流品质的雅虎免费电邮
http://cn.rd.yahoo.com/mail_cn/tag/1g/*http://cn.mail.yahoo.com/
-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://productguide.itmanagersjournal.com/
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel