Test program running on MAX32625MBED. Control through USB Serial commands using a terminal emulator such as teraterm or putty.
Dependencies: MaximTinyTester CmdLine MAX541 USBDevice
Diff: MAX11043/MAX11043.cpp
- Revision:
- 76:0397493d7baf
- Parent:
- 75:0900a57f2e5d
- Child:
- 77:3a6e2a5cd7d9
--- a/MAX11043/MAX11043.cpp Sun Feb 23 12:34:49 2020 +0000 +++ b/MAX11043/MAX11043.cpp Mon Feb 24 08:11:55 2020 +0000 @@ -48,6 +48,23 @@ #define MAX11043_EOC_INTERRUPT_POLLING 0 #endif // MAX11043_EOC_INTERRUPT_POLLING //-------------------------------------------------- +// SPI is not interrupt-safe, so use EventQueue to defer execution to user context. +#ifndef MAX11043_EOC_INTERRUPT_EVENTQUEUE +#define MAX11043_EOC_INTERRUPT_EVENTQUEUE 1 +#endif // MAX11043_EOC_INTERRUPT_EVENTQUEUE +#if MAX11043_EOC_INTERRUPT_EVENTQUEUE +#else // MAX11043_EOC_INTERRUPT_EVENTQUEUE +#endif // MAX11043_EOC_INTERRUPT_EVENTQUEUE +#if MAX11043_EOC_INTERRUPT_EVENTQUEUE +// SPI is not interrupt-safe, so use EventQueue to defer execution to user context. +#include "mbed_events.h" +#define MYONEOCTHREADEVENTFLAG_ENABLE_SPI (1UL << 0) +EventFlags myOnEOCThread_event_flags; +Thread myOnEOCThread; +extern void myOnEOCThread_handler(); +#else // MAX11043_EOC_INTERRUPT_EVENTQUEUE +#endif // MAX11043_EOC_INTERRUPT_EVENTQUEUE +//-------------------------------------------------- // Diagnostic: Use MAX32625MBED pin D5 as DigitalOut EOC#-detected #ifndef MAX11043_ScopeTrigger_MAX32625MBED_D5 #define MAX11043_ScopeTrigger_MAX32625MBED_D5 1 @@ -225,6 +242,12 @@ // // EOC Event Output from device // MAX11043 ADC Read operations must be synchronized to EOC End Of Conversion +#if MAX11043_EOC_INTERRUPT_EVENTQUEUE + // SPI is not interrupt-safe, so use EventQueue to defer execution to user context. + myOnEOCThread.start(myOnEOCThread_handler); +#else // MAX11043_EOC_INTERRUPT_EVENTQUEUE +#endif // MAX11043_EOC_INTERRUPT_EVENTQUEUE +// MAX11043 ADC Read operations must be synchronized to EOC End Of Conversion #if MAX11043_EOC_INTERRUPT_POLLING // MAX11043 EOC End Of Conversion input should be InterruptIn(PinName:EOC_pin).fall(onEOCFallingEdge); // Workaround using DigitalIn(PinName:EOC_pin) polled to sync with EOC falling edge for ADC reads @@ -238,8 +261,41 @@ // interruptEOC.fall(&onEOCFallingEdge); EOC_pin.fall(&onEOCFallingEdge); #endif // MAX11043_EOC_INTERRUPT_POLLING +} +// MAX11043 ADC Read operations must be synchronized to EOC End Of Conversion +// SPI is not interrupt-safe, so use EventQueue to defer execution to user context. +#if MAX11043_EOC_INTERRUPT_EVENTQUEUE +void myOnEOCThread_handler() +{ + while (true) { + //signal_wait(int32_t signals, uint32_t millisec=osWaitForever) + //flags_read = myOnEOCThread_event_flags.wait_any(MYONEOCTHREADEVENTFLAG_ENABLE_SPI); + // myOnEOCThread_event_flags.wait_any(MYONEOCTHREADEVENTFLAG_ENABLE_SPI, osWaitForever, false); // clear=false: don't auto clear the flag + myOnEOCThread_event_flags.wait_any(MYONEOCTHREADEVENTFLAG_ENABLE_SPI, osWaitForever, true); // clear=true: auto clear the flag + // + extern MAX11043 g_MAX11043_device; +#if MAX11043_ScopeTrigger_MAX32625MBED_D5 +// Diagnostic: Use MAX32625MBED pin D5 as DigitalOut EOC#-detected + digitalInOut5.write(0); // ScopeTrigger + digitalInOut5.write(1); // ScopeTrigger + digitalInOut5.write(0); // ScopeTrigger + digitalInOut5.write(1); // ScopeTrigger +#endif // MAX11043_ScopeTrigger_MAX32625MBED_D5 + extern SPI spi; // declared in Test_Main_MAX11043.cpp + spi.write((char*)mosiData_onEOCFallingEdge, byteCount_onEOCFallingEdge, (char*)misoData_onEOCFallingEdge, byteCount_onEOCFallingEdge); + // TODO1: update adca + //g_MAX11043_device.adca = (misoData_onEOCFallingEdge[1] << 8) | misoData_onEOCFallingEdge[2]; + // TODO1: update adcb + //g_MAX11043_device.adcb = (misoData_onEOCFallingEdge[3] << 8) | misoData_onEOCFallingEdge[4]; + // TODO1: update adcc + //g_MAX11043_device.adcc = (misoData_onEOCFallingEdge[5] << 8) | misoData_onEOCFallingEdge[6]; + // TODO1: update adcd + //g_MAX11043_device.adcd = (misoData_onEOCFallingEdge[7] << 8) | misoData_onEOCFallingEdge[8]; + } } +#else // MAX11043_EOC_INTERRUPT_EVENTQUEUE +#endif // MAX11043_EOC_INTERRUPT_EVENTQUEUE // MAX11043 ADC Read operations must be synchronized to EOC End Of Conversion #if MAX11043_EOC_INTERRUPT_POLLING @@ -261,7 +317,12 @@ digitalInOut5.write(1); // ScopeTrigger #endif // MAX11043_ScopeTrigger_MAX32625MBED_D5 #endif -#if 1 +#if MAX11043_EOC_INTERRUPT_EVENTQUEUE + // SPI is not interrupt-safe, so use EventQueue to defer execution to user context. + myOnEOCThread_event_flags.set(MYONEOCTHREADEVENTFLAG_ENABLE_SPI); +#else // MAX11043_EOC_INTERRUPT_EVENTQUEUE +#endif // MAX11043_EOC_INTERRUPT_EVENTQUEUE +#if 0 // TODO: read 4 channels in response to EOC# falling edge // WIP MAX11043 interrupt CRASH on Menu item HH CONVRUN High // @@ -316,7 +377,7 @@ //g_MAX11043_device.adcd = (misoData_onEOCFallingEdge[7] << 8) | misoData_onEOCFallingEdge[8]; //} #endif -#if MAX11043_ScopeTrigger_MAX32625MBED_D5 +#if 0 // MAX11043_ScopeTrigger_MAX32625MBED_D5 // Diagnostic: Use MAX32625MBED pin D5 as DigitalOut EOC#-detected digitalInOut5.write(0); // ScopeTrigger digitalInOut5.write(1); // ScopeTrigger