Add a per-char delay
[fw/altos] / target / serial / serial.c
index 5acd284f58e3b97c1c1c53ade6090cf89ac45240..1c352831dfa1d6f9e4b6c1cfe173f75cbf959e7a 100644 (file)
@@ -79,6 +79,19 @@ sbit at 0x97 P1_7;
 sfr at 0x86 U0CSR;
 sfr at 0xF8 U1CSR;
 
+/*
+ * IRCON2
+ */
+sfr at 0xE8 IRCON2;    /* CPU Interrupt Flag 5 */
+
+sbit at 0xE8 USBIF;    /* USB interrupt flag (shared with Port2) */
+sbit at 0xE8 P2IF;     /* Port2 interrupt flag (shared with USB) */
+sbit at 0xE9 UTX0IF;   /* USART0 TX interrupt flag */
+sbit at 0xEA UTX1IF;   /* USART1 TX interrupt flag (shared with I2S TX) */
+sbit at 0xEA I2STXIF;  /* I2S TX interrupt flag (shared with USART1 TX) */
+sbit at 0xEB P1IF;     /* Port1 interrupt flag */
+sbit at 0xEC WDTIF;    /* Watchdog timer interrupt flag */
+
 # define UxCSR_MODE_UART               (1 << 7)
 # define UxCSR_MODE_SPI                        (0 << 7)
 # define UxCSR_RE                      (1 << 6)
@@ -105,7 +118,7 @@ sfr at 0xfb U1UCR;
 # define UxUCR_SPB_1_STOP_BIT          (0 << 2)
 # define UxUCR_SPB_2_STOP_BITS         (1 << 2)
 # define UxUCR_STOP_LOW                        (0 << 1)
-# define UXUCR_STOP_HIGH               (1 << 1)
+# define UxUCR_STOP_HIGH               (1 << 1)
 # define UxUCR_START_LOW               (0 << 0)
 # define UxUCR_START_HIGH              (1 << 0)
 
@@ -143,6 +156,7 @@ delay (unsigned char n)
        unsigned char i = 0;
        unsigned char j = 0;
 
+       n++;
        while (--n != 0)
                while (--i != 0)
                        while (--j != 0)
@@ -188,32 +202,24 @@ usart_init(void)
        /*
         * Reasonable serial parameters
         */
-       U1UCR = (UxUCR_FLOW_DISABLE |
-                UxUCR_D9_EVEN_PARITY |
+       U1UCR = (UxUCR_FLUSH |
+                UxUCR_FLOW_DISABLE |
+                UxUCR_D9_ODD_PARITY |
                 UxUCR_BIT9_8_BITS |
                 UxUCR_PARITY_DISABLE |
                 UxUCR_SPB_1_STOP_BIT |
-                UxUCR_STOP_LOW |
+                UxUCR_STOP_HIGH |
                 UxUCR_START_LOW);
 }
 
-
-uint8_t
-usart_in_out(uint8_t byte)
-{
-       U1DBUF = byte;
-       while ((U1CSR & UxCSR_TX_BYTE) == 0)
-               ;
-       U1CSR &= ~UxCSR_TX_BYTE;
-       return U1DBUF;
-}
 void
 usart_out_byte(uint8_t byte)
 {
-       U1CSR &= ~UxCSR_TX_BYTE;
        U1DBUF = byte;
-       while ((U1CSR & UxCSR_TX_BYTE) == 0)
+       while (!UTX1IF)
                ;
+       UTX1IF = 0;
+       delay(1);
 }
 
 uint8_t
@@ -227,10 +233,6 @@ usart_in_byte(void)
        return b;
 }
 
-#define spi_init()     usart_init()
-#define spi_out_byte(b)        usart_out_byte(b)
-#define spi_in_byte()  usart_in_byte()
-
 static char string[] = "hello world\r\n";
 
 main ()
@@ -242,12 +244,12 @@ main ()
        while (!(SLEEP & SLEEP_XOSC_STB))
                ;
        
-       spi_init();
+       usart_init();
 
        for (;;) {
-               for (i = 0; i < sizeof (string) - 1; i++) {
+               for (i = 0; i < sizeof(string) - 1; i++)
                        usart_out_byte(string[i]);
-               }
+               delay(5);
                P1 ^= 2;
        }
 }