tiny_sci.c

00001 /*
00002   SCI 操作
00003   Satofumi KAMIMURA
00004   $Id$
00005 */
00006 
00007 #include "tiny_sci.h"
00008 #include "cpu_spec.h"
00009 
00010 enum {
00011   //FirstBaudrate = 9600,
00012   FirstBaudrate = 115200,
00013   SCI_BIT_WAIT = (int)(CPU_CLOCK / FirstBaudrate / 7.0),
00014 };
00015 
00016 
00017 int setBaudrate(long baudrate) {
00018   switch (baudrate) {
00019 
00020   case 9600:
00021     SCI1.BRR = 92;
00022     break;
00023 
00024   case 38400:
00025     SCI1.BRR = 22;
00026     break;
00027 
00028   case 57600:
00029     SCI1.BRR = 15;
00030     break;
00031 
00032   case 115200:
00033     SCI1.BRR = 7;
00034     break;
00035 
00036   default:
00037     return -1;
00038   }
00039   return 0;
00040 }
00041 
00042 
00043 void initSCI(void) {
00044   volatile int i;
00045   
00046   SCI1.SCR.BYTE = 0x00;
00047   SCI1.SMR.BYTE = 0;            /* 8bit, 1stop, no parity */
00048   setBaudrate(FirstBaudrate);
00049   for (i = 0; i < SCI_BIT_WAIT; ++i) /* wait 1 bit */
00050     ;
00051   PFC.PACRL2.WORD |= 0x0140;    /* enable RxD1, TxD1 */
00052   SCI1.SCR.BYTE = 0x30;         /* TE = 1, RE = 1 */
00053   SCI1.SSR.BYTE &= ~0x40;
00054 }
00055 
00056 
00057 char getch(void) {
00058   char ch;
00059   
00060   while((SCI1.SSR.BYTE & 0x40) == 0) /* RDRF */
00061     ;
00062   ch = SCI1.RDR;
00063   SCI1.SSR.BYTE &= ~0x40;       /* clear RDRF */
00064 
00065   return ch;
00066 }
00067 
00068 
00069 int recvLine(char *buffer, int maxlen) {
00070   int i;
00071 
00072   for (i = 0; i < maxlen-1; ++i) {
00073     char ch = getch();
00074     if ((ch == '\0') || (ch == '\r') || (ch == '\n')) {
00075       break;
00076     }
00077     buffer[i] = ch;
00078   }
00079   buffer[i] = '\0';
00080 
00081   return i;
00082 }
00083 
00084 
00085 void putch(char ch) {
00086   while ((SCI1.SSR.BYTE & 0x80) == 0) /* TDRE */
00087     ;
00088   SCI1.TDR = ch;
00089   SCI1.SSR.BYTE  &= ~0x80;
00090 }
00091 
00092 
00093 int putstr(char *data) {
00094   char *ch = data;
00095 
00096   while (*ch != '\0') {
00097     putch(*(ch++));
00098   }
00099   return (ch - data);
00100 }
00101 

Generated on Mon Apr 13 22:52:05 2009 by  doxygen 1.5.7.1