tiny_sci.c
00001
00002
00003
00004
00005
00006
00007 #include "tiny_sci.h"
00008 #include "cpu_spec.h"
00009
00010 enum {
00011
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;
00048 setBaudrate(FirstBaudrate);
00049 for (i = 0; i < SCI_BIT_WAIT; ++i)
00050 ;
00051 PFC.PACRL2.WORD |= 0x0140;
00052 SCI1.SCR.BYTE = 0x30;
00053 SCI1.SSR.BYTE &= ~0x40;
00054 }
00055
00056
00057 char getch(void) {
00058 char ch;
00059
00060 while((SCI1.SSR.BYTE & 0x40) == 0)
00061 ;
00062 ch = SCI1.RDR;
00063 SCI1.SSR.BYTE &= ~0x40;
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)
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