Production Test Program (PTP) for the LPC4088 Experiment Base Board

Dependencies:   EALib I2S LM75B SDFileSystem mbed

Revision:
0:0d5190d379d3
Child:
1:47680ec5d783
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Aug 25 13:15:27 2014 +0000
@@ -0,0 +1,361 @@
+/******************************************************************************
+ * Includes
+ *****************************************************************************/
+#include "mbed.h"
+
+#include "MCIFileSystem.h"
+#include "SDFileSystem.h"
+#include "LM75B.h"
+#include "MMA7455.h"
+#include "WM8731.h"
+#include "TextLCD.h"
+#include "DmTftHX8353C.h"
+#include "BubbleDemo.h"
+
+/******************************************************************************
+ * Typedefs and defines
+ *****************************************************************************/
+
+#define BUTTON_PRESSED   0
+#define BUTTON_RELEASED  1
+
+#define LED_ON   0
+#define LED_OFF  1
+
+#define handleError(__a, __b)  printf("Error: %s\n", (__b)); mbed_die()
+
+#define waitForButtonClick()  do {while(button.read() == BUTTON_RELEASED); while(button.read() == BUTTON_PRESSED);} while(false)
+
+/******************************************************************************
+ * Local variables
+ *****************************************************************************/
+
+//MCIFileSystem mcifs("mci");//, P4_16);
+SDFileSystem spifs(p5, p6, p7, p8, "spi"); // mosi, miso, sclk, cs
+
+DigitalOut myled(LED1);
+DigitalIn  button(p23);
+
+SPI shiftreg(p5, p6, p7);  // mosi, miso, sclk,
+DigitalOut shiftregCS(p30);
+
+DigitalOut ledRed(p25);
+DigitalOut ledGreen(p28);
+DigitalOut ledBlue(p26);
+
+/******************************************************************************
+ * Local functions
+ *****************************************************************************/
+
+static void test_micro_sd_card_mci()
+{
+  FILE* fp = fopen("/mci/message.txt", "r");
+  if (fp != NULL) {
+    char buf[20];
+    int num = fread(buf, 1, sizeof(buf), fp);
+    if (num >= 10) {
+      buf[10] = '\0';
+      if (strcmp(buf, "eatest2014") == 0) {
+        printf("MCI SD Card works!\n");
+        fclose(fp);
+        return;
+      }
+      handleError(STATE_ERR_MCIFS, "Invalid data read from /mci/message.txt\n");
+    }
+    handleError(STATE_ERR_MCIFS, "Failed to read >= 10 bytes from /mci/message.txt\n");
+  }
+  handleError(STATE_ERR_MCIFS, "Failed to open /mci/message.txt\n");
+}  
+
+static void test_micro_sd_card_spi()
+{
+  FILE* fp = fopen("/spi/message.txt", "r");
+  if (fp != NULL) {
+    char buf[20];
+    int num = fread(buf, 1, sizeof(buf), fp);
+    if (num >= 10) {
+      buf[10] = '\0';
+      if (strcmp(buf, "eatest2014") == 0) {
+        printf("SPI SD Card works!\n");
+        fclose(fp);
+        return;
+      }
+      handleError(STATE_ERR_SPIFS, "Invalid data read from /spi/message.txt\n");
+    }
+    handleError(STATE_ERR_SPIFS, "Failed to read >= 10 bytes from /spi/message.txt\n");
+  }
+  handleError(STATE_ERR_SPIFS, "Failed to open /spi/message.txt\n");
+}  
+
+static void test_acc()
+{
+  MMA7455 sensor(P0_27, P0_28);
+  
+  //Try to initialize the accelerometer
+  if (!sensor.setMode(MMA7455::ModeMeasurement)) {
+     handleError(STATE_ERR_ACC, "Unable to set mode for MMA7455!\n");
+  }
+  
+  printf("Put on flat surface and press button to calibrate!\n");
+  while (button.read() != BUTTON_PRESSED) {}
+  while (button.read() == BUTTON_PRESSED) {}
+    
+  if (!sensor.calibrate()) {
+     handleError(STATE_ERR_ACC, "Failed to calibrate MMA7455!\n");
+  }
+  
+  printf("Printing values for the next 5 seconds...\n");
+  int x=0, y=0, z=0;
+  
+  Timer t;
+  t.start();
+  while (t.read() < 6) {
+    if (!sensor.read(x, y, z)) {
+      handleError(STATE_ERR_ACC, "Failed to read accelerometer data!\n");
+    }
+    printf("ACC: x,y,z = {%5d, %5d, %5d}\n", x, y, z);
+  }
+  printf("Done with ACC tests!\n");
+}
+
+static void test_lm75()
+{
+  //Create an LM75B object at 0x92/0x93 (ADDRESS_1)
+  LM75B sensor(P0_27, P0_28, LM75B::ADDRESS_1);
+  
+    //Try to open the LM75B
+    if (sensor.open()) {
+        printf("LM75 Device detected!\n");
+ 
+        int i = 10;
+        while (i--) {
+            //Print the current temperature
+            printf("Temp = %.3f\n", (float)sensor);
+ 
+            //Sleep for 0.5 seconds
+            wait(0.5);
+        }
+    } else {
+        handleError(STATE_ERR_LM75, "LM75 Device not detected!\n");
+    }  
+}
+
+static void test_trimpot()
+{
+  AnalogIn trimpot(p15);
+
+  printf("Reading trimpot for 5 seconds...\n");  
+
+  for (int i = 0; i < 50; i++) {
+    printf("Trimpot = %.3f\n", trimpot.read());
+    wait(0.1);
+  }  
+}
+
+static void outputShiftReg(uint8_t val)
+{
+    shiftregCS = 0;  
+    shiftreg.write(val);
+    shiftregCS = 1;
+}
+static void test_shiftreg()
+{
+   outputShiftReg(0x1);
+   wait(0.1);
+   outputShiftReg(0x2);
+   wait(0.1);
+   outputShiftReg(0x4);
+   wait(0.1);
+   outputShiftReg(0x8);
+   wait(0.1);
+   outputShiftReg(0x10);
+   wait(0.1);
+   outputShiftReg(0x20);
+   wait(0.1);
+   outputShiftReg(0x40);
+   wait(0.1);
+   outputShiftReg(0x80);
+   wait(0.1);
+   outputShiftReg(0x40);
+   wait(0.1);
+   outputShiftReg(0x20);
+   wait(0.1);
+   outputShiftReg(0x10);
+   wait(0.1);
+   outputShiftReg(0x8);
+   wait(0.1);
+   outputShiftReg(0x4);
+   wait(0.1);
+   outputShiftReg(0x2);
+   wait(0.1);
+   outputShiftReg(0x1);
+   wait(0.1);
+   outputShiftReg(0x0);
+}
+    
+
+static void test_joystick()
+{
+  DigitalIn up(p32);//p39);
+  DigitalIn down(p38);//p32);
+  DigitalIn left(p39);//p38);
+  DigitalIn right(p37);
+  DigitalIn center(p31);
+
+  printf("Reading joystick for 10 seconds or all directions...\n");  
+  uint16_t mask = 0;
+
+  for (int i = 0; i < 100; i++) {
+    bool line = false;
+    if (up.read() == 0) { printf("UP ");        line = true; mask |= 0x01; }
+    if (down.read() == 0) { printf("DOWN ");    line = true; mask |= 0x02; }
+    if (left.read() == 0) { printf("LEFT ");    line = true; mask |= 0x04; }
+    if (right.read() == 0) { printf("RIGHT ");  line = true; mask |= 0x08; }
+    if (center.read() == 0) { printf("CENTER ");line = true; mask |= 0x10; }
+    if (line) {
+      printf("\n");
+    }
+    if (mask == 0x1F) {
+        printf("All directions tested. Done!\n");
+        break;
+    }
+    wait(0.1);
+  }  
+}
+
+static void test_rgb()
+{
+  printf("All off. Press button to continue\n");
+  ledRed = LED_OFF;
+  ledGreen = LED_OFF;
+  ledBlue = LED_OFF;
+  waitForButtonClick();
+
+  printf("RED on. Press button to continue\n");
+  ledRed = LED_ON;
+  ledGreen = LED_OFF;
+  ledBlue = LED_OFF;
+  waitForButtonClick();
+  
+  printf("GREEN on. Press button to continue\n");
+  ledRed = LED_OFF;
+  ledGreen = LED_ON;
+  ledBlue = LED_OFF;
+  waitForButtonClick();
+  
+  printf("BLUE on. Press button to continue\n");
+  ledRed = LED_OFF;
+  ledGreen = LED_OFF;
+  ledBlue = LED_ON;
+  waitForButtonClick();
+  
+  printf("All on. Press button to continue\n");
+  ledRed = LED_OFF;
+  ledGreen = LED_OFF;
+  ledBlue = LED_OFF;
+  waitForButtonClick();
+}
+
+static void test_audio()
+{
+    WM8731 audio(P0_27, P0_28);
+    if (!audio.writeCmd(WM8731::REG_R15_RESET, 0x0000)) {
+        handleError(STATE_ERR_AUDIO, "Failed to send command to audio codec\n");
+    }
+}
+
+static void test_TextLCD()
+{
+    SPI spi_lcd(p5, p6, p7); // MOSI, MISO, SCLK
+    TextLCD_SPI lcd(&spi_lcd, p30, TextLCD::LCD16x2); // SPI bus, CS pin, LCD Type ok
+    
+    lcd.cls();
+    lcd.locate(0, 0);
+    lcd.putc('E');
+    lcd.putc('m');
+    lcd.putc('b');
+    lcd.putc('e');
+    lcd.putc('d');
+    lcd.putc('d');
+    lcd.putc('e');
+    lcd.putc('d');
+    lcd.putc(' ');
+    lcd.putc('A');
+    lcd.putc('r');
+    lcd.putc('t');
+    lcd.putc('i');
+    lcd.putc('s');
+    lcd.putc('t');
+    lcd.putc('s');
+    lcd.putc('!');
+    lcd.setCursor(TextLCD::CurOff_BlkOn);
+}
+
+static void test_DisplayModule()
+{
+    // Test of DM-TFT18-101 display (http://www.displaymodule.com/collections/featured-modules/products/dm-tft18-101)
+    DmTftHX8353C tft(p5, p7, p30, p17, p16); // mosi, clk, cs, dc, rst
+    tft.init();
+    
+    BubbleDemo bubbleDemo(&tft, tft.width(), tft.height());
+    bubbleDemo.run(750, 20);
+}
+
+int main() {
+    printf("hello! " __DATE__ " at " __TIME__ "\n");
+    
+    shiftregCS = 1;    
+    button.mode(PullUp);
+    
+    ledRed = LED_OFF;
+    ledGreen = LED_OFF;
+    ledBlue = LED_OFF;
+      
+    outputShiftReg(0x0);
+    
+     //startup flash behaviour
+     for(int i=0; i<10; i++)
+     {
+       ledRed = LED_ON;
+       wait(0.05);
+       ledRed = LED_OFF;
+       wait(0.05);
+     }
+     wait(1.0);
+     for(int i=0; i<10; i++)
+     {
+       ledGreen = LED_ON;
+       wait(0.05);
+       ledGreen = LED_OFF;
+       wait(0.05);
+     }
+     wait(1.0);
+     for(int i=0; i<10; i++)
+     {
+       ledBlue = LED_ON;
+       wait(0.05);
+       ledBlue = LED_OFF;
+       wait(0.05);
+     }
+     wait(1.0);    
+
+    //test_micro_sd_card_mci();
+//    test_micro_sd_card_spi();
+    test_acc();
+    test_lm75();
+    test_trimpot();
+    test_joystick();
+    test_rgb();
+    test_audio();
+    //test_TextLCD();
+    //test_DisplayModule();
+    waitForButtonClick();
+
+    while(1) {
+        test_shiftreg();
+        myled = 1;
+        wait(0.2);
+        myled = 0;
+        wait(0.2);
+    }
+}