Production Test Program (PTP) for the LPC4088 Experiment Base Board
Dependencies: EALib I2S LM75B SDFileSystem mbed
Diff: main.cpp
- 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); + } +}