UCS1903 tape led

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LEDTape.cpp Source File

LEDTape.cpp

00001 /*
00002  * UCS1903 tape led IC
00003  */
00004 #include "mbed.h"
00005 #include "LEDTape.h"
00006 
00007 SPI tape(p11, p12, p13);
00008 
00009 //#define tape_write(d) tape.write(d)
00010 #ifndef tape_write
00011 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
00012 void tape_write (int d) {
00013     while (! (LPC_SSP0->SR & (1<<1))); // TNF
00014     LPC_SSP0->DR = d;
00015 }
00016 #elif defined(TARGET_LPC11U24)
00017 void tape_write (int d) {
00018     while (! (LPC_SSP1->SR & (1<<1))); // TNF
00019     LPC_SSP1->DR = d;
00020 }
00021 #endif
00022 #endif
00023 
00024 void tapeReset (int flag) {
00025     int i;
00026 
00027     __disable_irq();
00028 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
00029     if (flag) {
00030         while ((LPC_SSP0->SR & ((1<<4)|(1<<0))) != (1<<0)); // BSY, TFE
00031         LPC_PINCON->PINSEL1 &= ~(0x03<<4);  // GPIO
00032         LPC_GPIO0->FIODIR0 |= (1<<18);
00033         LPC_GPIO0->FIOSET0 = (1<<18);
00034     } else {
00035         for (i = 0; i < 4; i ++) {
00036             tape_write(0x1f);
00037         }
00038         LPC_PINCON->PINSEL1 &= ~(0x03<<4);
00039         LPC_PINCON->PINSEL1 |= (0x02<<4);  // SSP MOSI
00040     }
00041 #elif defined(TARGET_LPC11U24)
00042     if (flag) {
00043         while ((LPC_SSP1->SR & ((1<<4)|(1<<0))) != (1<<0)); // BSY, TFE
00044         LPC_IOCON->PIO1_22 &= ~0x07;    // GPIO
00045         LPC_GPIO->DIR[1] |= (1<<22);
00046         LPC_GPIO->SET[1] |= (1<<22);
00047     } else {
00048         for (i = 0; i < 4; i ++) {
00049             tape_write(0x1f);
00050         }
00051         LPC_IOCON->PIO1_22 &= ~0x07;    
00052         LPC_IOCON->PIO1_22 |= 0x02;     // SSP MOSI
00053     }
00054 #endif
00055     __enable_irq();
00056 }
00057 
00058 void tapeSend (int dat) {
00059     int b;
00060 
00061     __disable_irq();
00062     for (b = 0x800000; b; b = b >> 1) {
00063         if (dat & b) {
00064             // 1
00065             tape_write(0x01);
00066         } else {
00067             // 0
00068             tape_write(0x0f);
00069         }
00070     }
00071     __enable_irq();
00072 }
00073 
00074 void tapeInit (int freq) {
00075     tape.format(5, 1);
00076     if (freq) {
00077         tape.frequency(freq * 1000);
00078     } else {
00079         // high speed (800kbps)
00080         tape.frequency(4000000);
00081     }
00082     tapeReset(1);
00083 }