Test application for getting the Nucleo F0 30 board to work with Evan's prototype LED board.

Dependencies:   mbed

Revision:
2:a57a5501152c
Parent:
1:256d7a2f8391
Child:
3:6f12c437ab88
--- a/main.cpp	Mon Jul 07 23:39:59 2014 +0000
+++ b/main.cpp	Fri Jul 11 15:37:30 2014 +0000
@@ -1,5 +1,16 @@
 #include "mbed.h" 
- 
+
+#define OK    (0)
+#define ERROR (-1)
+
+// Forward Declarations
+void pwmout_period_ns(pwmout_t* obj, int us);
+int  cmd_S0(uint16_t value);
+void cmd_S1(void);
+
+bool gSpiMode = false;
+SPI* gSpiPtr = NULL;
+
 int main() {
     // NOTE: 24MHz is half the 48MHz clock rate.  The PWM registers
     //       seem to only allow 24MHz at this point, so I'm matching
@@ -12,57 +23,122 @@
 
 
     /////////////////////////////////////////////////
-    //              SPI SETUP
+    //               PWMCLK
     /////////////////////////////////////////////////
-    // We are not using MISO, this is a one-way bus
-    //SPI device(SPI_MOSI, NC, SPI_SCK);
+    pwmout_t outs;
+    pwmout_init(&outs, D9);
+    //pwmout_period_ns(&outs, 2); // 24 MHz (not very clean on the scope)
+    pwmout_period_ns(&outs, 40); // 
+    pwmout_write(&outs, 0.5f);
+
+
+    int ret = OK; // Return value
+    int i = 0;
+
+    printf("17:32\n");
+
+    while (1) {
+        //wait_ms(50);
+        for (i=0; i<16; i++) {
+            ret = cmd_S0(0x0003);
+            if (ret != OK) {
+                printf("ERROR cmd_S0()\n");
+                return ERROR;
+            }
+        }
+        cmd_S1();
+    }
+}
 
-    // Note: Polarity and phase are both 0 for the TC62D723FNG
-    // For a graphical reminder on polarity and phase, visit:
-    //     http://www.eetimes.com/document.asp?doc_id=1272534
-    //
-    //device.format(16, 0);
-    //device.frequency(24000000); // 24 MHz
-    //device.frequency(1000000); // 1 MHz
-    /////////////////////////////////////////////////
+
+// This code is based off:
+// mbed/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F030R8/pwmout_api.c  pwmout_period_us()
+void pwmout_period_ns(pwmout_t* obj, int us) {
+    TIM_TypeDef *tim = (TIM_TypeDef *)(obj->pwm);
+    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
+    float dc = pwmout_read(obj);
+
+    TIM_Cmd(tim, DISABLE);
+
+    obj->period = us;
+
+    TIM_TimeBaseStructure.TIM_Period = obj->period - 1;
+    // Orig code:  TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t)(SystemCoreClock / 1000000) - 1; // 1 µs tick
+    TIM_TimeBaseStructure.TIM_Prescaler = 0;  // BAG 1 ns tick (?)
+    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
+    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
+    TIM_TimeBaseInit(tim, &TIM_TimeBaseStructure);
+
+    // Set duty cycle again
+    pwmout_write(obj, dc);
+
+    TIM_ARRPreloadConfig(tim, ENABLE);
+
+    TIM_Cmd(tim, ENABLE);
+}
 
 
 
-    /////////////////////////////////////////////////
-    //               PWMCLK
-    /////////////////////////////////////////////////
-    //PwmOut pinPWMCLK(D9); // For Nucleo board, not for Redgarden board
-    //pinPWMCLK.write(0.5f); // Set to 50% duty cycle for testing
+// S0 Command:
+//      Needs only SCK and SIN (which are SPI_SCK and SPI_MOSI respectively).
+//      This is because TRANS can be 0 for this command according to the datasheet.
+int cmd_S0(uint16_t value) {
+        // Command S0 and S1 share the same clock line, so we need to be
+        // careful which mode we are in.  This avoids re-initializing these
+        // pins if we are already in SPI mode.
+        // WARNING: Re-initializing every time makes the MOSI line dirty and
+        //          is wasteful for the CPU.
+        if ( gSpiMode == false &&
+             gSpiPtr  == NULL)
+        {
+            // We are not using MISO, this is a one-way bus
+            gSpiPtr = new SPI(SPI_MOSI, NC, SPI_SCK);
 
+            if (gSpiPtr == NULL) {
+                printf("ERROR: Could not allocate SPI\n");
+                return ERROR;
+            }
 
-    /////////////////////////////////////////////////
-    //              OTHER / DEBUG
-    /////////////////////////////////////////////////
-    /////////////////////////////////////////////////
-
+            // Note: Polarity and phase are both 0 for the TC62D723FNG
+            // For a graphical reminder on polarity and phase, visit:
+            //     http://www.eetimes.com/document.asp?doc_id=1272534
+            gSpiPtr->format(16, 0);
+            gSpiPtr->frequency(1000000);  // 1  MHz
+            //gSpiPtr->frequency(24000000); // 24 MHz
+            gSpiMode = true;
+        }
+        gSpiPtr->write(value);
+        return OK;
+}
 
 
 
-    printf("17:22\n");
-    //int i = 0;
-    while(1) {
-        wait_us(50);
-        
-        // S0 Command: Needs only SCK and SIN (which are SPI_SCK and SPI_MOSI respectively)
-        // This is because TRANS can be 0 for this command according to the datasheet
-        SPI data(SPI_MOSI, NC, SPI_SCK);
-        data.format(16, 0);
-        data.frequency(1000000); // 1 MHz
-        data.write(0xFF);
+void cmd_S1(void) {
+    int i = 0;
+    int j = 0;
+    
+    if ( gSpiMode == true &&
+         gSpiPtr  != NULL)
+    {
+        delete gSpiPtr;
+        gSpiPtr  = NULL;
+        gSpiMode = false;
+    }
     
-        // S1 Command: TRANS / "LATCH"
-        // The S1 command doesn't use SIN, but TRANS needs to be on for exactly
-        // three clock pulses.  The easiest way to do this is re-configuring
-        // the SPI bus to use the TRANS line as MOSI and sending 0x07.  If this
-        // doesn't work, we need to bitbang it.
-        SPI latch(PA_9, NC, SPI_SCK);
-        latch.format(16, 0);
-        latch.frequency(1000000); // 1 MHz        
-        latch.write(0x07); // Three clock pulses
+    DigitalOut bbSCK (D13); // bit bang clock
+    DigitalOut bbTRANS(D8); // bit bang TRANS (data) line
+
+    bbSCK   = 0; // Start off/low
+    bbTRANS = 1; // Set high
+
+    // Loop 6 times = 3 clock cycles
+    for (j=0; j<6; j++) { // Always use an even number here!
+        // The order of these two lines matter!
+        i == 0 ? i = 1 : i = 0;          // Toggle i
+        i == 0 ? bbSCK = 0 : bbSCK = 1;  // Set SCK to the same value as i
     }
-}
\ No newline at end of file
+    bbTRANS = 0; // Set low
+}
+
+
+