
Test program running on MAX32625MBED. Control through USB Serial commands using a terminal emulator such as teraterm or putty.
Dependencies: MaximTinyTester CmdLine MAX541 USBDevice
Revision 53:3d5a3d241a5e, committed 2020-02-11
- Comitter:
- whismanoid
- Date:
- Tue Feb 11 09:01:20 2020 +0000
- Parent:
- 52:607010f0c54e
- Child:
- 54:26a973c5dac4
- Commit message:
- enable SPI commands
Changed in this revision
--- a/MAX11043/MAX11043.cpp Tue Feb 11 01:16:34 2020 +0000 +++ b/MAX11043/MAX11043.cpp Tue Feb 11 09:01:20 2020 +0000 @@ -1,934 +1,933 @@ -// /******************************************************************************* -// * Copyright (C) 2020 Maxim Integrated Products, Inc., All Rights Reserved. -// * -// * Permission is hereby granted, free of charge, to any person obtaining a -// * copy of this software and associated documentation files (the "Software"), -// * to deal in the Software without restriction, including without limitation -// * the rights to use, copy, modify, merge, publish, distribute, sublicense, -// * and/or sell copies of the Software, and to permit persons to whom the -// * Software is furnished to do so, subject to the following conditions: -// * -// * The above copyright notice and this permission notice shall be included -// * in all copies or substantial portions of the Software. -// * -// * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -// * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES -// * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -// * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// * OTHER DEALINGS IN THE SOFTWARE. -// * -// * Except as contained in this notice, the name of Maxim Integrated -// * Products, Inc. shall not be used except as stated in the Maxim Integrated -// * Products, Inc. Branding Policy. -// * -// * The mere transfer of this software does not imply any licenses -// * of trade secrets, proprietary technology, copyrights, patents, -// * trademarks, maskwork rights, or any other form of intellectual -// * property whatsoever. Maxim Integrated Products, Inc. retains all -// * ownership rights. -// ******************************************************************************* -// */ -// ********************************************************************* -// @file MAX11043.cpp -// ********************************************************************* -// Device Driver file -// DO NOT EDIT; except areas designated "CUSTOMIZE". Automatically generated file. -// generated by XMLSystemOfDevicesToMBED.py -// System Name = ExampleSystem -// System Description = Device driver example - -#include "MAX11043.h" - -// Device Name = MAX11043 -// Device Description = 200ksps, Low-Power, Serial SPI 24-Bit, 4-Channel, Differential/Single-Ended Input, Simultaneous-Sampling SD ADC -// Device DeviceBriefDescription = 24-bit 200ksps Delta-Sigma ADC -// Device Manufacturer = Maxim Integrated -// Device PartNumber = MAX11043ATL+ -// Device RegValue_Width = DataWidth16bit_HL -// -// ADC MaxOutputDataRate = 200ksps -// ADC NumChannels = 4 -// ADC ResolutionBits = 24 -// -// SPI CS = ActiveLow -// SPI FrameStart = CS -// SPI CPOL = 0 -// SPI CPHA = 0 -// SPI MOSI and MISO Data are both stable on Rising edge of SCLK -// SPI SCLK Idle Low -// SPI SCLKMaxMHz = 40 -// SPI SCLKMinMHz = 0 -// -// InputPin Name = CONVRUN -// InputPin Description = CONVRUN (digital input). Convert Run. Drive high to start continuous conversions on all 4 channels. The device is idle when -// CONVRUN is low. -// InputPin Function = Configuration -// -// InputPin Name = SHDN -// InputPin Description = Shutdown (digital input). Active-High Shutdown Input. Drive high to shut down the MAX11043. -// InputPin Function = Configuration -// -// InputPin Name = DACSTEP -// InputPin Description = DACSTEP (digital input). DAC Step Input. Drive high to move the DAC output in the direction of UP/DWN on the next rising -// edge of the system clock. -// InputPin Function = Configuration -// -// InputPin Name = UP/DWN# -// InputPin Description = UP/DWN# (digital input). DAC Step Direction Select. Drive high to step up, drive low to step down when DACSTEP is toggled. -// InputPin Function = Configuration -// -// OutputPin Name = EOC -// OutputPin Description = End of Conversion Output. Active-Low End-of-Conversion Indicator. EOC asserts low to indicate that new data is ready. -// OutputPin Function = Event -// - -// CODE GENERATOR: class constructor definition -MAX11043::MAX11043(SPI &spi, DigitalOut &cs_pin, // SPI interface - // CODE GENERATOR: class constructor definition gpio InputPin pins - DigitalOut &CONVRUN_pin, // Digital Configuration Input to MAX11043 device - DigitalOut &SHDN_pin, // Digital Configuration Input to MAX11043 device - DigitalOut &DACSTEP_pin, // Digital Configuration Input to MAX11043 device - DigitalOut &UP_slash_DWNb_pin, // Digital Configuration Input to MAX11043 device - // CODE GENERATOR: class constructor definition gpio OutputPin pins - DigitalIn &EOC_pin, // Digital Event Output from MAX11043 device - // CODE GENERATOR: class constructor definition ic_variant - MAX11043_ic_t ic_variant) - // CODE GENERATOR: class constructor initializer list - : m_spi(spi), m_cs_pin(cs_pin), // SPI interface - // CODE GENERATOR: class constructor initializer list gpio InputPin pins - m_CONVRUN_pin(CONVRUN_pin), // Digital Configuration Input to MAX11043 device - m_SHDN_pin(SHDN_pin), // Digital Configuration Input to MAX11043 device - m_DACSTEP_pin(DACSTEP_pin), // Digital Configuration Input to MAX11043 device - m_UP_slash_DWNb_pin(UP_slash_DWNb_pin), // Digital Configuration Input to MAX11043 device - // CODE GENERATOR: class constructor initializer list gpio OutputPin pins - m_EOC_pin(EOC_pin), // Digital Event Output from MAX11043 device - // CODE GENERATOR: class constructor initializer list ic_variant - m_ic_variant(ic_variant) -{ - // CODE GENERATOR: class constructor definition SPI interface initialization - // - // SPI CS = ActiveLow - // SPI FrameStart = CS - m_SPI_cs_state = 1; - m_cs_pin = m_SPI_cs_state; - - // SPI CPOL = 0 - // SPI CPHA = 0 - // SPI MOSI and MISO Data are both stable on Rising edge of SCLK - // SPI SCLK Idle Low - m_SPI_dataMode = 0; //SPI_MODE0; // CPOL=0,CPHA=0: Rising Edge stable; SCLK idle Low - m_spi.format(8,m_SPI_dataMode); // int bits_must_be_8, int mode=0_3 CPOL=0,CPHA=0 - - // SPI SCLKMaxMHz = 40 - // SPI SCLKMinMHz = 0 - //#define SPI_SCLK_Hz 48000000 // 48MHz - //#define SPI_SCLK_Hz 24000000 // 24MHz - //#define SPI_SCLK_Hz 12000000 // 12MHz - //#define SPI_SCLK_Hz 6000000 // 6MHz - //#define SPI_SCLK_Hz 4000000 // 4MHz - //#define SPI_SCLK_Hz 2000000 // 2MHz - //#define SPI_SCLK_Hz 1000000 // 1MHz - m_SPI_SCLK_Hz = 12000000; // 12MHz; MAX11043 limit is 40MHz - m_spi.frequency(m_SPI_SCLK_Hz); - - // - // CODE GENERATOR: class constructor definition gpio InputPin (Input to device) initialization - // - // CONVRUN Configuration Input to MAX11043 device - m_CONVRUN_pin = 1; // output logic high -- initial value in constructor - // - // SHDN Configuration Input to MAX11043 device - m_SHDN_pin = 1; // output logic high -- initial value in constructor - // - // DACSTEP Configuration Input to MAX11043 device - m_DACSTEP_pin = 1; // output logic high -- initial value in constructor - // - // UP_slash_DWNb Configuration Input to MAX11043 device - m_UP_slash_DWNb_pin = 1; // output logic high -- initial value in constructor - // - // CODE GENERATOR: class constructor definition gpio OutputPin (Output from MAX11043 device) initialization - // - // EOC Event Output from device -} - -// CODE GENERATOR: class destructor definition -MAX11043::~MAX11043() -{ - // do nothing -} - -// CODE GENERATOR: spi_frequency setter definition -/// set SPI SCLK frequency -void MAX11043::spi_frequency(int spi_sclk_Hz) -{ - m_SPI_SCLK_Hz = spi_sclk_Hz; - m_spi.frequency(m_SPI_SCLK_Hz); -} - -// CODE GENERATOR: omit global g_MAX11043_device -// CODE GENERATOR: extern function declarations -// CODE GENERATOR: extern function requirement MAX11043::SPIoutputCS -// Assert SPI Chip Select -// SPI chip-select for MAX11043 -// -void MAX11043::SPIoutputCS(int isLogicHigh) -{ - // CODE GENERATOR: extern function definition for function SPIoutputCS - // CODE GENERATOR: extern function definition for standard SPI interface function SPIoutputCS(int isLogicHigh) - m_SPI_cs_state = isLogicHigh; - m_cs_pin = m_SPI_cs_state; -} - -// CODE GENERATOR: extern function requirement MAX11043::SPIwrite16bits -// SPI write 16 bits -// SPI interface to MAX11043 shift 16 bits mosiData into MAX11043 DIN -// -void MAX11043::SPIwrite16bits(int16_t mosiData16) -{ - // CODE GENERATOR: extern function definition for function SPIwrite16bits - // TODO1: CODE GENERATOR: extern function definition for standard SPI interface function SPIwrite16bits(int16_t mosiData16) - size_t byteCount = 2; - static char mosiData[2]; - static char misoData[2]; - mosiData[0] = (char)((mosiData16 >> 8) & 0xFF); // MSByte - mosiData[1] = (char)((mosiData16 >> 0) & 0xFF); // LSByte - // - // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts() - //~ noInterrupts(); - // - //~ digitalWrite(Scope_Trigger_Pin, LOW); // diagnostic Scope_Trigger_Pin - // - unsigned int numBytesTransferred = m_spi.write(mosiData, byteCount, misoData, byteCount); - //~ m_spi.transfer(mosiData8_FF0000); - //~ m_spi.transfer(mosiData16_00FF00); - //~ m_spi.transfer(mosiData16_0000FF); - // - //~ digitalWrite(Scope_Trigger_Pin, HIGH); // diagnostic Scope_Trigger_Pin - // - // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts() - //~ interrupts(); - // Optional Diagnostic function to print SPI transactions - if (onSPIprint) - { - onSPIprint(byteCount, (uint8_t*)mosiData, (uint8_t*)misoData); - } - // - // VERIFY: SPIwrite24bits print diagnostic information - //cmdLine.serial().printf(" MOSI->")); - //cmdLine.serial().printf(" 0x")); - //Serial.print( (mosiData8_FF0000 & 0xFF), HEX); - //cmdLine.serial().printf(" 0x")); - //Serial.print( (mosiData16_00FF00 & 0xFF), HEX); - //cmdLine.serial().printf(" 0x")); - //Serial.print( (mosiData16_0000FF & 0xFF), HEX); - // hex dump mosiData[0..byteCount-1] -#if 0 // HAS_MICROUSBSERIAL - cmdLine_microUSBserial.serial().printf("\r\nSPI"); - if (byteCount > 7) { - cmdLine_microUSBserial.serial().printf(" byteCount:%d", byteCount); - } - cmdLine_microUSBserial.serial().printf(" MOSI->"); - for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) - { - cmdLine_microUSBserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]); - } - // hex dump misoData[0..byteCount-1] - cmdLine_microUSBserial.serial().printf(" MISO<-"); - for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++) - { - cmdLine_microUSBserial.serial().printf(" 0x%2.2X", misoData[byteIndex]); - } - cmdLine_microUSBserial.serial().printf(" "); -#endif -#if 0 // HAS_DAPLINK_SERIAL - cmdLine_DAPLINKserial.serial().printf("\r\nSPI"); - if (byteCount > 7) { - cmdLine_DAPLINKserial.serial().printf(" byteCount:%d", byteCount); - } - cmdLine_DAPLINKserial.serial().printf(" MOSI->"); - for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) - { - cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]); - } - // hex dump misoData[0..byteCount-1] - cmdLine_DAPLINKserial.serial().printf(" MISO<-"); - for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++) - { - cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", misoData[byteIndex]); - } - cmdLine_DAPLINKserial.serial().printf(" "); -#endif - // VERIFY: DIAGNOSTIC: print MAX5715 device register write - // TODO: MAX5715_print_register_verbose(mosiData8_FF0000, mosiData16_00FFFF); - // TODO: print_verbose_SPI_diagnostic(mosiData16_FF00, mosiData16_00FF, misoData16_FF00, misoData16_00FF); - // - // int misoData16 = (misoData16_FF00 << 8) | misoData16_00FF; - // return misoData16; -} - -// CODE GENERATOR: extern function requirement MAX11043::SPIreadWrite16bits -// SPI read and write 16 bits -// SPI interface to MAX11043 shift 16 bits mosiData16 into MAX11043 DIN -// while simultaneously capturing 16 bits miso data from MAX11043 DOUT -// -int16_t MAX11043::SPIreadWrite16bits(int16_t mosiData16) -{ - // CODE GENERATOR: extern function definition for function SPIreadWrite16bits - // TODO1: CODE GENERATOR: extern function definition for standard SPI interface function SPIreadWrite16bits(int16_t mosiData16) - size_t byteCount = 2; - static char mosiData[2]; - static char misoData[2]; - mosiData[0] = (char)((mosiData16 >> 8) & 0xFF); // MSByte - mosiData[1] = (char)((mosiData16 >> 0) & 0xFF); // LSByte - // - // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts() - //~ noInterrupts(); - // - //~ digitalWrite(Scope_Trigger_Pin, LOW); // diagnostic Scope_Trigger_Pin - // - unsigned int numBytesTransferred = m_spi.write(mosiData, byteCount, misoData, byteCount); - //~ m_spi.transfer(mosiData8_FF0000); - //~ m_spi.transfer(mosiData16_00FF00); - //~ m_spi.transfer(mosiData16_0000FF); - // - //~ digitalWrite(Scope_Trigger_Pin, HIGH); // diagnostic Scope_Trigger_Pin - // - // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts() - //~ interrupts(); - // Optional Diagnostic function to print SPI transactions - if (onSPIprint) - { - onSPIprint(byteCount, (uint8_t*)mosiData, (uint8_t*)misoData); - } - // - // VERIFY: SPIwrite24bits print diagnostic information - //cmdLine.serial().printf(" MOSI->")); - //cmdLine.serial().printf(" 0x")); - //Serial.print( (mosiData8_FF0000 & 0xFF), HEX); - //cmdLine.serial().printf(" 0x")); - //Serial.print( (mosiData16_00FF00 & 0xFF), HEX); - //cmdLine.serial().printf(" 0x")); - //Serial.print( (mosiData16_0000FF & 0xFF), HEX); - // hex dump mosiData[0..byteCount-1] -#if 0 // HAS_MICROUSBSERIAL - cmdLine_microUSBserial.serial().printf("\r\nSPI"); - if (byteCount > 7) { - cmdLine_microUSBserial.serial().printf(" byteCount:%d", byteCount); - } - cmdLine_microUSBserial.serial().printf(" MOSI->"); - for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) - { - cmdLine_microUSBserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]); - } - // hex dump misoData[0..byteCount-1] - cmdLine_microUSBserial.serial().printf(" MISO<-"); - for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++) - { - cmdLine_microUSBserial.serial().printf(" 0x%2.2X", misoData[byteIndex]); - } - cmdLine_microUSBserial.serial().printf(" "); -#endif -#if 0 // HAS_DAPLINK_SERIAL - cmdLine_DAPLINKserial.serial().printf("\r\nSPI"); - if (byteCount > 7) { - cmdLine_DAPLINKserial.serial().printf(" byteCount:%d", byteCount); - } - cmdLine_DAPLINKserial.serial().printf(" MOSI->"); - for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) - { - cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]); - } - // hex dump misoData[0..byteCount-1] - cmdLine_DAPLINKserial.serial().printf(" MISO<-"); - for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++) - { - cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", misoData[byteIndex]); - } - cmdLine_DAPLINKserial.serial().printf(" "); -#endif - // VERIFY: DIAGNOSTIC: print MAX5715 device register write - // TODO: MAX5715_print_register_verbose(mosiData8_FF0000, mosiData16_00FFFF); - // TODO: print_verbose_SPI_diagnostic(mosiData16_FF00, mosiData16_00FF, misoData16_FF00, misoData16_00FF); - // - //int misoData16 = (misoData16_FF00 << 8) | misoData16_00FF; - int misoData16 = (misoData[0] << 8) | misoData[1]; - return misoData16; -} - -// CODE GENERATOR: extern function requirement MAX11043::SPIreadWrite32bits -// SPI read and write 32 bits -// SPI interface to MAX11043 shift 32 bits mosiData into MAX11043 DIN -// while simultaneously capturing 32 bits miso data from MAX11043 DOUT -// -int32_t MAX11043::SPIreadWrite32bits(int32_t mosiData32) -{ - // CODE GENERATOR: extern function definition for function SPIreadWrite32bits - // TODO1: CODE GENERATOR: extern function definition for standard SPI interface function SPIreadWrite32bits(int32_t mosiData32) - size_t byteCount = 4; - static char mosiData[4]; - static char misoData[4]; - mosiData[0] = (char)((mosiData32 >> 24) & 0xFF); // MSByte - mosiData[1] = (char)((mosiData32 >> 16) & 0xFF); - mosiData[2] = (char)((mosiData32 >> 8) & 0xFF); - mosiData[3] = (char)((mosiData32 >> 0) & 0xFF); // LSByte - // - // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts() - //~ noInterrupts(); - // - //~ digitalWrite(Scope_Trigger_Pin, LOW); // diagnostic Scope_Trigger_Pin - // - unsigned int numBytesTransferred = m_spi.write(mosiData, byteCount, misoData, byteCount); - //~ m_spi.transfer(mosiData8_FF0000); - //~ m_spi.transfer(mosiData16_00FF00); - //~ m_spi.transfer(mosiData16_0000FF); - // - //~ digitalWrite(Scope_Trigger_Pin, HIGH); // diagnostic Scope_Trigger_Pin - // - // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts() - //~ interrupts(); - // Optional Diagnostic function to print SPI transactions - if (onSPIprint) - { - onSPIprint(byteCount, (uint8_t*)mosiData, (uint8_t*)misoData); - } - // - // VERIFY: SPIwrite24bits print diagnostic information - //cmdLine.serial().printf(" MOSI->")); - //cmdLine.serial().printf(" 0x")); - //Serial.print( (mosiData8_FF0000 & 0xFF), HEX); - //cmdLine.serial().printf(" 0x")); - //Serial.print( (mosiData16_00FF00 & 0xFF), HEX); - //cmdLine.serial().printf(" 0x")); - //Serial.print( (mosiData16_0000FF & 0xFF), HEX); - // hex dump mosiData[0..byteCount-1] -#if 0 // HAS_MICROUSBSERIAL - cmdLine_microUSBserial.serial().printf("\r\nSPI"); - if (byteCount > 7) { - cmdLine_microUSBserial.serial().printf(" byteCount:%d", byteCount); - } - cmdLine_microUSBserial.serial().printf(" MOSI->"); - for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) - { - cmdLine_microUSBserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]); - } - // hex dump misoData[0..byteCount-1] - cmdLine_microUSBserial.serial().printf(" MISO<-"); - for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++) - { - cmdLine_microUSBserial.serial().printf(" 0x%2.2X", misoData[byteIndex]); - } - cmdLine_microUSBserial.serial().printf(" "); -#endif -#if 0 // HAS_DAPLINK_SERIAL - cmdLine_DAPLINKserial.serial().printf("\r\nSPI"); - if (byteCount > 7) { - cmdLine_DAPLINKserial.serial().printf(" byteCount:%d", byteCount); - } - cmdLine_DAPLINKserial.serial().printf(" MOSI->"); - for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) - { - cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]); - } - // hex dump misoData[0..byteCount-1] - cmdLine_DAPLINKserial.serial().printf(" MISO<-"); - for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++) - { - cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", misoData[byteIndex]); - } - cmdLine_DAPLINKserial.serial().printf(" "); -#endif - // VERIFY: DIAGNOSTIC: print MAX5715 device register write - // TODO: MAX5715_print_register_verbose(mosiData8_FF0000, mosiData16_00FFFF); - // TODO: print_verbose_SPI_diagnostic(mosiData16_FF00, mosiData16_00FF, misoData16_FF00, misoData16_00FF); - // - //int misoData32 = (misoData32_FF000000 << 24) | (misoData32_FF0000 << 16) | (misoData32_0000FF00 << 8) | misoData32_000000FF; - int misoData32 = (misoData[0] << 24) | (misoData[1] << 16) | (misoData[2] << 8) | misoData[3]; - return misoData32; -} - -// TODO1: CODE GENERATOR: extern function GPIOoutputSHDN alias SHDNoutputValue -// CODE GENERATOR: extern function requirement MAX11043::SHDNoutputValue -// Assert MAX11043 SHDN pin : High = _____, Low = _____. -// -void MAX11043::SHDNoutputValue(int isLogicHigh) -{ - // CODE GENERATOR: extern function definition for function SHDNoutputValue - // TODO1: CODE GENERATOR: extern function definition for gpio interface function SHDNoutputValue - // TODO1: CODE GENERATOR: gpio pin SHDN assuming member function m_SHDN_pin - // TODO1: CODE GENERATOR: gpio direction output - // m_SHDN_pin.output(); // only applicable to DigitalInOut - // TODO1: CODE GENERATOR: gpio function Value - m_SHDN_pin = isLogicHigh; -} - -// TODO1: CODE GENERATOR: extern function GPIOoutputCONVRUN alias CONVRUNoutputValue -// CODE GENERATOR: extern function requirement MAX11043::CONVRUNoutputValue -// Assert MAX11043 CONVRUN pin : High = _____, Low = _____. -// -void MAX11043::CONVRUNoutputValue(int isLogicHigh) -{ - // CODE GENERATOR: extern function definition for function CONVRUNoutputValue - // TODO1: CODE GENERATOR: extern function definition for gpio interface function CONVRUNoutputValue - // TODO1: CODE GENERATOR: gpio pin CONVRUN assuming member function m_CONVRUN_pin - // TODO1: CODE GENERATOR: gpio direction output - // m_CONVRUN_pin.output(); // only applicable to DigitalInOut - // TODO1: CODE GENERATOR: gpio function Value - m_CONVRUN_pin = isLogicHigh; -} - -// TODO1: CODE GENERATOR: extern function GPIOoutputDACSTEP alias DACSTEPoutputValue -// CODE GENERATOR: extern function requirement MAX11043::DACSTEPoutputValue -// Assert MAX11043 DACSTEP pin : High = _____, Low = _____. -// -void MAX11043::DACSTEPoutputValue(int isLogicHigh) -{ - // CODE GENERATOR: extern function definition for function DACSTEPoutputValue - // TODO1: CODE GENERATOR: extern function definition for gpio interface function DACSTEPoutputValue - // TODO1: CODE GENERATOR: gpio pin DACSTEP assuming member function m_DACSTEP_pin - // TODO1: CODE GENERATOR: gpio direction output - // m_DACSTEP_pin.output(); // only applicable to DigitalInOut - // TODO1: CODE GENERATOR: gpio function Value - m_DACSTEP_pin = isLogicHigh; -} - -// TODO1: CODE GENERATOR: extern function GPIOoutputUP_slash_DWNb alias UP_slash_DWNboutputValue -// CODE GENERATOR: extern function requirement MAX11043::UP_slash_DWNboutputValue -// Assert MAX11043 UP_slash_DWNb pin : High = _____, Low = _____. -// -void MAX11043::UP_slash_DWNboutputValue(int isLogicHigh) -{ - // CODE GENERATOR: extern function definition for function UP_slash_DWNboutputValue - // TODO1: CODE GENERATOR: extern function definition for gpio interface function UP_slash_DWNboutputValue - // TODO1: CODE GENERATOR: gpio pin UP_slash_DWNb assuming member function m_UP_slash_DWNb_pin - // TODO1: CODE GENERATOR: gpio direction output - // m_UP_slash_DWNb_pin.output(); // only applicable to DigitalInOut - // TODO1: CODE GENERATOR: gpio function Value - m_UP_slash_DWNb_pin = isLogicHigh; -} - -// CODE GENERATOR: extern function requirement MAX11043::EOCinputWaitUntilLow -// Wait for MAX11043 EOC pin low, indicating end of conversion. -// Required when using any of the InternalClock modes. -// -void MAX11043::EOCinputWaitUntilLow() -{ - // CODE GENERATOR: extern function definition for function EOCinputWaitUntilLow - // TODO1: CODE GENERATOR: extern function definition for gpio interface function EOCinputWaitUntilLow - // TODO1: CODE GENERATOR: gpio pin EOC assuming member function m_EOC_pin - // TODO1: CODE GENERATOR: gpio direction input - // m_EOC_pin.input(); // only applicable to DigitalInOut - // TODO1: CODE GENERATOR: gpio function WaitUntilLow - while (m_EOC_pin != 0) - { - // spinlock waiting for logic low pin state - } -} - -// CODE GENERATOR: extern function requirement MAX11043::EOCinputValue -// Return the status of the MAX11043 EOC pin. -// -int MAX11043::EOCinputValue() -{ - // CODE GENERATOR: extern function definition for function EOCinputValue - // TODO1: CODE GENERATOR: extern function definition for gpio interface function EOCinputValue - // TODO1: CODE GENERATOR: gpio pin EOC assuming member function m_EOC_pin - // TODO1: CODE GENERATOR: gpio direction input - // m_EOC_pin.input(); // only applicable to DigitalInOut - // TODO1: CODE GENERATOR: gpio function Value - return m_EOC_pin.read(); -} - -// CODE GENERATOR: class member function definitions -//---------------------------------------- -// Menu item '!' -// Initialize device -// @return 1 on success; 0 on failure -uint8_t MAX11043::Init(void) -{ - - //---------------------------------------- - // TODO1: AC79 MAX11043 AIN0-AIN1 reference voltage, in Volts - VRef_xxxxxx = 2.500; - - //---------------------------------------- - // shadow of register ctrl CMD_r000_1001_dddd_dddd_CTRL - ctrl = 0x01; - - //---------------------------------------- - // set by Configure_PGA gain index register pga CMD_r000_1110_xxdd_xddd_PGA - pgaGain = 1; - - //---------------------------------------- - // init (based on old EV kit GUI) - #warning "Not Implemented Yet: MAX11043::Init init..." - // bool bOpResult = false; - // String FWVersionString = "00"; - // bool bDemoMode = true; - // int scan_resolution = 0; - // int scan_channels = 0; - // int scan_bits = 0; - // int sampleRateFactore = 0; - // double sampleRate = 0; - // unsigned long banks_requested = 0; - // bool bScanMode = 0; - - //---------------------------------------- - // Device ID Validation - #warning "Not Implemented Yet: MAX11043::Init Device ID Validation..." - // const uint32_t part_id_expect = 0x000F02; - // uint32_t part_id_readback; - // RegRead(xxxxxxxxxxxxCMD_r001_0001_xxxx_xxxx_xxxx_xxxx_xxxx_xddd_PART_ID, &part_id_readback); - // if (part_id_readback != part_id_expect) return 0; - - //---------------------------------------- - // write8 0x00 PD = 0x03 (Reset Registers; enter Standby mode) - // RegWrite(xxxxxxxxxxxCMD_r000_0000_xxxx_xxdd_PD, PD_11_Reset); - - //---------------------------------------- - // write8 0x00 PD = 0x00 (NOP) - // RegWrite(xxxxxxxxxxxxCMD_r000_0000_xxxx_xxdd_PD, PD_00_Normal); - - //---------------------------------------- - // success - return 1; -} - -//---------------------------------------- -// Write a MAX11043 register. -// -// CMD_1aaa_aaaa_REGISTER_READ bit is cleared 0 indicating a write operation. -// -// MAX11043 register length can be determined by function RegSize. -// -// For 8-bit register size: -// -// SPI 16-bit transfer -// -// SPI MOSI = 0aaa_aaaa_dddd_dddd -// -// SPI MISO = xxxx_xxxx_xxxx_xxxx -// -// For 16-bit register size: -// -// SPI 24-bit or 32-bit transfer -// -// SPI MOSI = 0aaa_aaaa_dddd_dddd_dddd_dddd -// -// SPI MISO = xxxx_xxxx_xxxx_xxxx_xxxx_xxxx -// -// For 24-bit register size: -// -// SPI 32-bit transfer -// -// SPI MOSI = 0aaa_aaaa_dddd_dddd_dddd_dddd_dddd_dddd -// -// SPI MISO = xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx -// -// @return 1 on success; 0 on failure -uint8_t MAX11043::RegWrite(MAX11043_CMD_enum_t commandByte, uint32_t regData) -{ - - //---------------------------------------- - // switch based on register address szie RegSize(commandByte) - //commandByte = (MAX11043_CMD_enum_t)((commandByte &~ CMD_0aaa_aa10_RdAddr_ReadAnyRegister) & 0xFF); - switch(RegSize(commandByte)) - { - case 8: // 8-bit register size - { - // SPI 16-bit transfer - // SPI MOSI = 0aaa_aaaa_dddd_dddd - // SPI MISO = xxxx_xxxx_xxxx_xxxx - int16_t mosiData16 = ((int16_t)commandByte << 8) | ((int16_t)regData & 0xFF); - SPIoutputCS(0); - SPIwrite16bits(mosiData16); - SPIoutputCS(1); - } - break; - case 16: // 16-bit register size - #warning "Not Verified Yet: MAX11043::RegWrite 16-bit SPIreadWrite32bits" - { - // SPI 24-bit or 32-bit transfer - // SPI MOSI = 0aaa_aaaa_dddd_dddd_dddd_dddd - // SPI MISO = xxxx_xxxx_xxxx_xxxx_xxxx_xxxx - // SPI MOSI = 0aaa_aaaa_dddd_dddd_dddd_dddd_0000_0000 - // SPI MISO = xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx - int32_t mosiData32 = ((int32_t)commandByte << 24) | (((int32_t)regData & 0xFFFF) << 8); - SPIoutputCS(0); - SPIreadWrite32bits(mosiData32); - SPIoutputCS(1); - } - break; - case 24: // 24-bit register size - { - // SPI 32-bit transfer - // SPI MOSI = 0aaa_aaaa_dddd_dddd_dddd_dddd_dddd_dddd - // SPI MISO = xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx - int32_t mosiData32 = ((int32_t)commandByte << 24) | ((int32_t)regData & 0x00FFFFFF); - SPIoutputCS(0); - SPIreadWrite32bits(mosiData32); - SPIoutputCS(1); - } - break; - } - - //---------------------------------------- - // success - return 1; -} - -//---------------------------------------- -// Read an 8-bit MAX11043 register -// -// CMD_1aaa_aaaa_REGISTER_READ bit is set 1 indicating a read operation. -// -// MAX11043 register length can be determined by function RegSize. -// -// For 8-bit register size: -// -// SPI 16-bit transfer -// -// SPI MOSI = 1aaa_aaaa_0000_0000 -// -// SPI MISO = xxxx_xxxx_dddd_dddd -// -// For 16-bit register size: -// -// SPI 24-bit or 32-bit transfer -// -// SPI MOSI = 1aaa_aaaa_0000_0000_0000_0000 -// -// SPI MISO = xxxx_xxxx_dddd_dddd_dddd_dddd -// -// For 24-bit register size: -// -// SPI 32-bit transfer -// -// SPI MOSI = 1aaa_aaaa_0000_0000_0000_0000_0000_0000 -// -// SPI MISO = xxxx_xxxx_dddd_dddd_dddd_dddd_dddd_dddd -// -// -// @return 1 on success; 0 on failure -uint8_t MAX11043::RegRead(MAX11043_CMD_enum_t commandByte, uint32_t* ptrRegData) -{ - - //---------------------------------------- - // switch based on register address szie RegSize(regAddress) - //commandByte = (MAX11043_CMD_enum_t)((commandByte &~ CMD_0aaa_aa10_RdAddr_ReadAnyRegister) & 0xFF); - switch(RegSize(commandByte)) - { - case 8: // 8-bit register size - { - // SPI 16-bit transfer - // SPI MOSI = 1aaa_aaaa_0000_0000 - // SPI MISO = xxxx_xxxx_dddd_dddd - int16_t mosiData16 = ((CMD_0aaa_aa10_RdAddr_ReadAnyRegister | (int16_t)commandByte) << 8) | ((int16_t)0); - SPIoutputCS(0); - int16_t misoData16 = SPIreadWrite16bits(mosiData16); - SPIoutputCS(1); - (*ptrRegData) = (misoData16 & 0x00FF); - } - break; - case 16: // 16-bit register size - #warning "Not Verified Yet: MAX11043::RegRead 16-bit SPIreadWrite32bits" - { - // SPI 24-bit or 32-bit transfer - // SPI MOSI = 1aaa_aaaa_0000_0000_0000_0000 - // SPI MISO = xxxx_xxxx_dddd_dddd_dddd_dddd - // SPI MOSI = 1aaa_aaaa_0000_0000_0000_0000_0000_0000 - // SPI MISO = xxxx_xxxx_dddd_dddd_dddd_dddd_xxxx_xxxx - int32_t mosiData32 = ((CMD_0aaa_aa10_RdAddr_ReadAnyRegister | (int32_t)commandByte) << 24); - SPIoutputCS(0); - int32_t misoData32 = SPIreadWrite32bits(mosiData32); - SPIoutputCS(1); - (*ptrRegData) = ((misoData32 >> 8) & 0x00FFFF); - } - break; - case 24: // 24-bit register size - { - // SPI 32-bit transfer - // SPI MOSI = 1aaa_aaaa_0000_0000_0000_0000_0000_0000 - // SPI MISO = xxxx_xxxx_dddd_dddd_dddd_dddd_dddd_dddd - int32_t mosiData32 = ((CMD_0aaa_aa10_RdAddr_ReadAnyRegister | (int32_t)commandByte) << 24); - SPIoutputCS(0); - int32_t misoData32 = SPIreadWrite32bits(mosiData32); - SPIoutputCS(1); - (*ptrRegData) = (misoData32 & 0x00FFFFFF); - } - break; - } - - //---------------------------------------- - // success - return 1; -} - -//---------------------------------------- -// Return the size of a MAX11043 register -// -// @return 8 for 8-bit, 16 for 16-bit, 24 for 24-bit, else 0 for undefined register size -uint8_t MAX11043::RegSize(MAX11043_CMD_enum_t commandByte) -{ - - //---------------------------------------- - // switch based on register address value regAddress - // commandByte = (MAX11043_CMD_enum_t)((commandByte &~ CMD_0aaa_aa10_RdAddr_ReadAnyRegister) & 0xFF); - switch(commandByte) - { - default: - case CMD_0aaa_aa00_WrAddr_WriteAnyRegister: - case CMD_0aaa_aa10_RdAddr_ReadAnyRegister: - case CMD_1111_1111_NoOperationMOSIidleHigh: - return 0; // undefined register size - case CMD_0001_1110_d8_Rd07_Status: - case CMD_0101_0100_d8_Wr15_FilterCAddress: - case CMD_0101_0110_d8_Rd15_FilterCAddress: - case CMD_0110_0000_d8_Wr18_FlashMode: - case CMD_0110_0010_d8_Rd18_FlashMode: - return 8; // 8-bit register size - case CMD_0010_0000_d16_Wr08_Configuration: - case CMD_0010_0010_d16_Rd08_Configuration: - case CMD_0010_0100_d16_Wr09_DAC: - case CMD_0010_0110_d16_Rd09_DAC: - case CMD_0010_1000_d16_Wr0A_DACStep: - case CMD_0010_1010_d16_Rd0A_DACStep: - case CMD_0010_1100_d16_Wr0B_DACHDACL: - case CMD_0010_1110_d16_Rd0B_DACHDACL: - case CMD_0011_0000_d16_Wr0C_ConfigA: - case CMD_0011_0010_d16_Rd0C_ConfigA: - case CMD_0011_0100_d16_Wr0D_ConfigB: - case CMD_0011_0110_d16_Rd0D_ConfigB: - case CMD_0011_1000_d16_Wr0E_ConfigC: - case CMD_0011_1010_d16_Rd0E_ConfigC: - case CMD_0011_1100_d16_Wr0F_ConfigD: - case CMD_0011_1110_d16_Rd0F_ConfigD: - case CMD_0100_0000_d16_Wr10_Reference: - case CMD_0100_0010_d16_Rd10_Reference: - case CMD_0100_0100_d16_Wr11_AGain: - case CMD_0100_0110_d16_Rd11_AGain: - case CMD_0100_1000_d16_Wr12_BGain: - case CMD_0100_1010_d16_Rd12_BGain: - case CMD_0100_1100_d16_Wr13_CGain: - case CMD_0100_1110_d16_Rd13_CGain: - case CMD_0101_0000_d16_Wr14_DGain: - case CMD_0101_0010_d16_Rd14_DGain: - case CMD_0110_0100_d16_Wr19_FlashAddr: - case CMD_0110_0110_d16_Rd19_FlashAddr: - case CMD_0110_1000_d16_Wr1A_FlashDataIn: - case CMD_0110_1010_d16_Rd1A_FlashDataIn: - case CMD_0110_1110_d16_Rd1B_FlashDataOut: - return 16; // 16-bit register size - case CMD_0000_0010_d24_Rd00_ADCa: - case CMD_0000_0110_d24_Rd01_ADCb: - case CMD_0000_1010_d24_Rd02_ADCc: - case CMD_0000_1110_d24_Rd03_ADCd: - return 24; // 24-bit register size - case CMD_0001_0010_d24_d24_Rd04_ADCab: - case CMD_0001_0110_d24_d24_Rd05_ADCcd: - return 48; // 24-bit register size - case CMD_0001_1010_d24_d24_d24_d24_Rd06_ADCabcd: - return 96; // 24-bit register size - case CMD_0101_1000_d32_Wr16_FilterCDataOut: - case CMD_0101_1010_d32_Rd16_FilterCDataOut: - case CMD_0101_1100_d32_Wr17_FilterCDataIn: - case CMD_0101_1110_d32_Rd17_FilterCDataIn: - return 32; // 32-bit register size - } -} - -//---------------------------------------- -// Return the address field of a MAX11043 register -// -// @return register address field as given in datasheet -uint8_t MAX11043::RegAddrOfCommand(MAX11043_CMD_enum_t commandByte) -{ - - //---------------------------------------- - // extract register address value from command byte - return (uint8_t)((commandByte &~ 0x83) >> 2); // CMD_0aaa_aa10_RdAddr_ReadAnyRegister -} - -//---------------------------------------- -// Test whether a command byte is a register read command -// -// @return true if command byte is a register read command -uint8_t MAX11043::IsRegReadCommand(MAX11043_CMD_enum_t commandByte) -{ - - //---------------------------------------- - // Test whether a command byte is a register read command - return (commandByte &~ 0x02) ? 1 : 0; // CMD_0aaa_aa10_RdAddr_ReadAnyRegister -} - -//---------------------------------------- -// Return the name of a MAX11043 register -// -// @return null-terminated constant C string containing register name or empty string -const char* MAX11043::RegName(MAX11043_CMD_enum_t commandByte) -{ - - //---------------------------------------- - // switch based on register address value regAddress - // commandByte = (MAX11043_CMD_enum_t)((commandByte &~ CMD_0aaa_aa10_RdAddr_ReadAnyRegister) & 0xFF); - switch(commandByte) - { - default: - return ""; // undefined register - // case CMD_0aaa_aa00_WrAddr_WriteAnyRegister: return "_______"; - // case CMD_0aaa_aa10_RdAddr_ReadAnyRegister: return "_______"; - // case CMD_1111_1111_NoOperationMOSIidleHigh: return "_______"; - case CMD_0000_0010_d24_Rd00_ADCa: return "ADCa"; - case CMD_0000_0110_d24_Rd01_ADCb: return "ADCb"; - case CMD_0000_1010_d24_Rd02_ADCc: return "ADCc"; - case CMD_0000_1110_d24_Rd03_ADCd: return "ADCd"; - case CMD_0001_0010_d24_d24_Rd04_ADCab: return "ADCab"; - case CMD_0001_0110_d24_d24_Rd05_ADCcd: return "ADCcd"; - case CMD_0001_1010_d24_d24_d24_d24_Rd06_ADCabcd: return "ADCabcd"; - case CMD_0001_1110_d8_Rd07_Status: return "Status"; - case CMD_0010_0000_d16_Wr08_Configuration: return "Configuration"; - case CMD_0010_0010_d16_Rd08_Configuration: return "Configuration"; - case CMD_0010_0100_d16_Wr09_DAC: return "DAC"; - case CMD_0010_0110_d16_Rd09_DAC: return "DAC"; - case CMD_0010_1000_d16_Wr0A_DACStep: return "DACStep"; - case CMD_0010_1010_d16_Rd0A_DACStep: return "DACStep"; - case CMD_0010_1100_d16_Wr0B_DACHDACL: return "DACHDACL"; - case CMD_0010_1110_d16_Rd0B_DACHDACL: return "DACHDACL"; - case CMD_0011_0000_d16_Wr0C_ConfigA: return "ConfigA"; - case CMD_0011_0010_d16_Rd0C_ConfigA: return "ConfigA"; - case CMD_0011_0100_d16_Wr0D_ConfigB: return "ConfigB"; - case CMD_0011_0110_d16_Rd0D_ConfigB: return "ConfigB"; - case CMD_0011_1000_d16_Wr0E_ConfigC: return "ConfigC"; - case CMD_0011_1010_d16_Rd0E_ConfigC: return "ConfigC"; - case CMD_0011_1100_d16_Wr0F_ConfigD: return "ConfigD"; - case CMD_0011_1110_d16_Rd0F_ConfigD: return "ConfigD"; - case CMD_0100_0000_d16_Wr10_Reference: return "Reference"; - case CMD_0100_0010_d16_Rd10_Reference: return "Reference"; - case CMD_0100_0100_d16_Wr11_AGain: return "AGain"; - case CMD_0100_0110_d16_Rd11_AGain: return "AGain"; - case CMD_0100_1000_d16_Wr12_BGain: return "BGain"; - case CMD_0100_1010_d16_Rd12_BGain: return "BGain"; - case CMD_0100_1100_d16_Wr13_CGain: return "CGain"; - case CMD_0100_1110_d16_Rd13_CGain: return "CGain"; - case CMD_0101_0000_d16_Wr14_DGain: return "DGain"; - case CMD_0101_0010_d16_Rd14_DGain: return "DGain"; - case CMD_0101_0100_d8_Wr15_FilterCAddress: return "FilterCAddress"; - case CMD_0101_0110_d8_Rd15_FilterCAddress: return "FilterCAddress"; - case CMD_0101_1000_d32_Wr16_FilterCDataOut: return "FilterCDataOut"; - case CMD_0101_1010_d32_Rd16_FilterCDataOut: return "FilterCDataOut"; - case CMD_0101_1100_d32_Wr17_FilterCDataIn: return "FilterCDataIn"; - case CMD_0101_1110_d32_Rd17_FilterCDataIn: return "FilterCDataIn"; - case CMD_0110_0000_d8_Wr18_FlashMode: return "FlashMode"; - case CMD_0110_0010_d8_Rd18_FlashMode: return "FlashMode"; - case CMD_0110_0100_d16_Wr19_FlashAddr: return "FlashAddr"; - case CMD_0110_0110_d16_Rd19_FlashAddr: return "FlashAddr"; - case CMD_0110_1000_d16_Wr1A_FlashDataIn: return "FlashDataIn"; - case CMD_0110_1010_d16_Rd1A_FlashDataIn: return "FlashDataIn"; - case CMD_0110_1110_d16_Rd1B_FlashDataOut: return "FlashDataOut"; - } -} - - -// End of file +// /******************************************************************************* +// * Copyright (C) 2020 Maxim Integrated Products, Inc., All Rights Reserved. +// * +// * Permission is hereby granted, free of charge, to any person obtaining a +// * copy of this software and associated documentation files (the "Software"), +// * to deal in the Software without restriction, including without limitation +// * the rights to use, copy, modify, merge, publish, distribute, sublicense, +// * and/or sell copies of the Software, and to permit persons to whom the +// * Software is furnished to do so, subject to the following conditions: +// * +// * The above copyright notice and this permission notice shall be included +// * in all copies or substantial portions of the Software. +// * +// * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES +// * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// * OTHER DEALINGS IN THE SOFTWARE. +// * +// * Except as contained in this notice, the name of Maxim Integrated +// * Products, Inc. shall not be used except as stated in the Maxim Integrated +// * Products, Inc. Branding Policy. +// * +// * The mere transfer of this software does not imply any licenses +// * of trade secrets, proprietary technology, copyrights, patents, +// * trademarks, maskwork rights, or any other form of intellectual +// * property whatsoever. Maxim Integrated Products, Inc. retains all +// * ownership rights. +// ******************************************************************************* +// */ +// ********************************************************************* +// @file MAX11043.cpp +// ********************************************************************* +// Device Driver file +// DO NOT EDIT; except areas designated "CUSTOMIZE". Automatically generated file. +// generated by XMLSystemOfDevicesToMBED.py +// System Name = ExampleSystem +// System Description = Device driver example + +#include "MAX11043.h" + +// Device Name = MAX11043 +// Device Description = 200ksps, Low-Power, Serial SPI 24-Bit, 4-Channel, Differential/Single-Ended Input, Simultaneous-Sampling SD ADC +// Device DeviceBriefDescription = 24-bit 200ksps Delta-Sigma ADC +// Device Manufacturer = Maxim Integrated +// Device PartNumber = MAX11043ATL+ +// Device RegValue_Width = DataWidth16bit_HL +// +// ADC MaxOutputDataRate = 200ksps +// ADC NumChannels = 4 +// ADC ResolutionBits = 24 +// +// SPI CS = ActiveLow +// SPI FrameStart = CS +// SPI CPOL = 0 +// SPI CPHA = 0 +// SPI MOSI and MISO Data are both stable on Rising edge of SCLK +// SPI SCLK Idle Low +// SPI SCLKMaxMHz = 40 +// SPI SCLKMinMHz = 0 +// +// InputPin Name = CONVRUN +// InputPin Description = CONVRUN (digital input). Convert Run. Drive high to start continuous conversions on all 4 channels. The device is idle when +// CONVRUN is low. +// InputPin Function = Configuration +// +// InputPin Name = SHDN +// InputPin Description = Shutdown (digital input). Active-High Shutdown Input. Drive high to shut down the MAX11043. +// InputPin Function = Configuration +// +// InputPin Name = DACSTEP +// InputPin Description = DACSTEP (digital input). DAC Step Input. Drive high to move the DAC output in the direction of UP/DWN on the next rising +// edge of the system clock. +// InputPin Function = Configuration +// +// InputPin Name = UP/DWN# +// InputPin Description = UP/DWN# (digital input). DAC Step Direction Select. Drive high to step up, drive low to step down when DACSTEP is toggled. +// InputPin Function = Configuration +// +// OutputPin Name = EOC +// OutputPin Description = End of Conversion Output. Active-Low End-of-Conversion Indicator. EOC asserts low to indicate that new data is ready. +// OutputPin Function = Event +// + +// CODE GENERATOR: class constructor definition +MAX11043::MAX11043(SPI &spi, DigitalOut &cs_pin, // SPI interface + // CODE GENERATOR: class constructor definition gpio InputPin pins + DigitalOut &CONVRUN_pin, // Digital Configuration Input to MAX11043 device + DigitalOut &SHDN_pin, // Digital Configuration Input to MAX11043 device + DigitalOut &DACSTEP_pin, // Digital Configuration Input to MAX11043 device + DigitalOut &UP_slash_DWNb_pin, // Digital Configuration Input to MAX11043 device + // CODE GENERATOR: class constructor definition gpio OutputPin pins + DigitalIn &EOC_pin, // Digital Event Output from MAX11043 device + // CODE GENERATOR: class constructor definition ic_variant + MAX11043_ic_t ic_variant) + // CODE GENERATOR: class constructor initializer list + : m_spi(spi), m_cs_pin(cs_pin), // SPI interface + // CODE GENERATOR: class constructor initializer list gpio InputPin pins + m_CONVRUN_pin(CONVRUN_pin), // Digital Configuration Input to MAX11043 device + m_SHDN_pin(SHDN_pin), // Digital Configuration Input to MAX11043 device + m_DACSTEP_pin(DACSTEP_pin), // Digital Configuration Input to MAX11043 device + m_UP_slash_DWNb_pin(UP_slash_DWNb_pin), // Digital Configuration Input to MAX11043 device + // CODE GENERATOR: class constructor initializer list gpio OutputPin pins + m_EOC_pin(EOC_pin), // Digital Event Output from MAX11043 device + // CODE GENERATOR: class constructor initializer list ic_variant + m_ic_variant(ic_variant) +{ + // CODE GENERATOR: class constructor definition SPI interface initialization + // + // SPI CS = ActiveLow + // SPI FrameStart = CS + m_SPI_cs_state = 1; + m_cs_pin = m_SPI_cs_state; + + // SPI CPOL = 0 + // SPI CPHA = 0 + // SPI MOSI and MISO Data are both stable on Rising edge of SCLK + // SPI SCLK Idle Low + m_SPI_dataMode = 0; //SPI_MODE0; // CPOL=0,CPHA=0: Rising Edge stable; SCLK idle Low + m_spi.format(8,m_SPI_dataMode); // int bits_must_be_8, int mode=0_3 CPOL=0,CPHA=0 + + // SPI SCLKMaxMHz = 40 + // SPI SCLKMinMHz = 0 + //#define SPI_SCLK_Hz 48000000 // 48MHz + //#define SPI_SCLK_Hz 24000000 // 24MHz + //#define SPI_SCLK_Hz 12000000 // 12MHz + //#define SPI_SCLK_Hz 6000000 // 6MHz + //#define SPI_SCLK_Hz 4000000 // 4MHz + //#define SPI_SCLK_Hz 2000000 // 2MHz + //#define SPI_SCLK_Hz 1000000 // 1MHz + m_SPI_SCLK_Hz = 12000000; // 12MHz; MAX11043 limit is 40MHz + m_spi.frequency(m_SPI_SCLK_Hz); + + // + // CODE GENERATOR: class constructor definition gpio InputPin (Input to device) initialization + // + // CONVRUN Configuration Input to MAX11043 device + m_CONVRUN_pin = 1; // output logic high -- initial value in constructor + // + // SHDN Configuration Input to MAX11043 device + m_SHDN_pin = 1; // output logic high -- initial value in constructor + // + // DACSTEP Configuration Input to MAX11043 device + m_DACSTEP_pin = 1; // output logic high -- initial value in constructor + // + // UP_slash_DWNb Configuration Input to MAX11043 device + m_UP_slash_DWNb_pin = 1; // output logic high -- initial value in constructor + // + // CODE GENERATOR: class constructor definition gpio OutputPin (Output from MAX11043 device) initialization + // + // EOC Event Output from device +} + +// CODE GENERATOR: class destructor definition +MAX11043::~MAX11043() +{ + // do nothing +} + +// CODE GENERATOR: spi_frequency setter definition +/// set SPI SCLK frequency +void MAX11043::spi_frequency(int spi_sclk_Hz) +{ + m_SPI_SCLK_Hz = spi_sclk_Hz; + m_spi.frequency(m_SPI_SCLK_Hz); +} + +// CODE GENERATOR: omit global g_MAX11043_device +// CODE GENERATOR: extern function declarations +// CODE GENERATOR: extern function requirement MAX11043::SPIoutputCS +// Assert SPI Chip Select +// SPI chip-select for MAX11043 +// +void MAX11043::SPIoutputCS(int isLogicHigh) +{ + // CODE GENERATOR: extern function definition for function SPIoutputCS + // CODE GENERATOR: extern function definition for standard SPI interface function SPIoutputCS(int isLogicHigh) + m_SPI_cs_state = isLogicHigh; + m_cs_pin = m_SPI_cs_state; +} + +// CODE GENERATOR: extern function requirement MAX11043::SPIwrite16bits +// SPI write 16 bits +// SPI interface to MAX11043 shift 16 bits mosiData into MAX11043 DIN +// +void MAX11043::SPIwrite16bits(int16_t mosiData16) +{ + // CODE GENERATOR: extern function definition for function SPIwrite16bits + // TODO1: CODE GENERATOR: extern function definition for standard SPI interface function SPIwrite16bits(int16_t mosiData16) + size_t byteCount = 2; + static char mosiData[2]; + static char misoData[2]; + mosiData[0] = (char)((mosiData16 >> 8) & 0xFF); // MSByte + mosiData[1] = (char)((mosiData16 >> 0) & 0xFF); // LSByte + // + // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts() + //~ noInterrupts(); + // + //~ digitalWrite(Scope_Trigger_Pin, LOW); // diagnostic Scope_Trigger_Pin + // + unsigned int numBytesTransferred = m_spi.write(mosiData, byteCount, misoData, byteCount); + //~ m_spi.transfer(mosiData8_FF0000); + //~ m_spi.transfer(mosiData16_00FF00); + //~ m_spi.transfer(mosiData16_0000FF); + // + //~ digitalWrite(Scope_Trigger_Pin, HIGH); // diagnostic Scope_Trigger_Pin + // + // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts() + //~ interrupts(); + // Optional Diagnostic function to print SPI transactions + if (onSPIprint) + { + onSPIprint(byteCount, (uint8_t*)mosiData, (uint8_t*)misoData); + } + // + // VERIFY: SPIwrite24bits print diagnostic information + //cmdLine.serial().printf(" MOSI->")); + //cmdLine.serial().printf(" 0x")); + //Serial.print( (mosiData8_FF0000 & 0xFF), HEX); + //cmdLine.serial().printf(" 0x")); + //Serial.print( (mosiData16_00FF00 & 0xFF), HEX); + //cmdLine.serial().printf(" 0x")); + //Serial.print( (mosiData16_0000FF & 0xFF), HEX); + // hex dump mosiData[0..byteCount-1] +#if 0 // HAS_MICROUSBSERIAL + cmdLine_microUSBserial.serial().printf("\r\nSPI"); + if (byteCount > 7) { + cmdLine_microUSBserial.serial().printf(" byteCount:%d", byteCount); + } + cmdLine_microUSBserial.serial().printf(" MOSI->"); + for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) + { + cmdLine_microUSBserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]); + } + // hex dump misoData[0..byteCount-1] + cmdLine_microUSBserial.serial().printf(" MISO<-"); + for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++) + { + cmdLine_microUSBserial.serial().printf(" 0x%2.2X", misoData[byteIndex]); + } + cmdLine_microUSBserial.serial().printf(" "); +#endif +#if 0 // HAS_DAPLINK_SERIAL + cmdLine_DAPLINKserial.serial().printf("\r\nSPI"); + if (byteCount > 7) { + cmdLine_DAPLINKserial.serial().printf(" byteCount:%d", byteCount); + } + cmdLine_DAPLINKserial.serial().printf(" MOSI->"); + for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) + { + cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]); + } + // hex dump misoData[0..byteCount-1] + cmdLine_DAPLINKserial.serial().printf(" MISO<-"); + for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++) + { + cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", misoData[byteIndex]); + } + cmdLine_DAPLINKserial.serial().printf(" "); +#endif + // VERIFY: DIAGNOSTIC: print MAX5715 device register write + // TODO: MAX5715_print_register_verbose(mosiData8_FF0000, mosiData16_00FFFF); + // TODO: print_verbose_SPI_diagnostic(mosiData16_FF00, mosiData16_00FF, misoData16_FF00, misoData16_00FF); + // + // int misoData16 = (misoData16_FF00 << 8) | misoData16_00FF; + // return misoData16; +} + +// CODE GENERATOR: extern function requirement MAX11043::SPIreadWrite16bits +// SPI read and write 16 bits +// SPI interface to MAX11043 shift 16 bits mosiData16 into MAX11043 DIN +// while simultaneously capturing 16 bits miso data from MAX11043 DOUT +// +int16_t MAX11043::SPIreadWrite16bits(int16_t mosiData16) +{ + // CODE GENERATOR: extern function definition for function SPIreadWrite16bits + // TODO1: CODE GENERATOR: extern function definition for standard SPI interface function SPIreadWrite16bits(int16_t mosiData16) + size_t byteCount = 2; + static char mosiData[2]; + static char misoData[2]; + mosiData[0] = (char)((mosiData16 >> 8) & 0xFF); // MSByte + mosiData[1] = (char)((mosiData16 >> 0) & 0xFF); // LSByte + // + // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts() + //~ noInterrupts(); + // + //~ digitalWrite(Scope_Trigger_Pin, LOW); // diagnostic Scope_Trigger_Pin + // + unsigned int numBytesTransferred = m_spi.write(mosiData, byteCount, misoData, byteCount); + //~ m_spi.transfer(mosiData8_FF0000); + //~ m_spi.transfer(mosiData16_00FF00); + //~ m_spi.transfer(mosiData16_0000FF); + // + //~ digitalWrite(Scope_Trigger_Pin, HIGH); // diagnostic Scope_Trigger_Pin + // + // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts() + //~ interrupts(); + // Optional Diagnostic function to print SPI transactions + if (onSPIprint) + { + onSPIprint(byteCount, (uint8_t*)mosiData, (uint8_t*)misoData); + } + // + // VERIFY: SPIwrite24bits print diagnostic information + //cmdLine.serial().printf(" MOSI->")); + //cmdLine.serial().printf(" 0x")); + //Serial.print( (mosiData8_FF0000 & 0xFF), HEX); + //cmdLine.serial().printf(" 0x")); + //Serial.print( (mosiData16_00FF00 & 0xFF), HEX); + //cmdLine.serial().printf(" 0x")); + //Serial.print( (mosiData16_0000FF & 0xFF), HEX); + // hex dump mosiData[0..byteCount-1] +#if 0 // HAS_MICROUSBSERIAL + cmdLine_microUSBserial.serial().printf("\r\nSPI"); + if (byteCount > 7) { + cmdLine_microUSBserial.serial().printf(" byteCount:%d", byteCount); + } + cmdLine_microUSBserial.serial().printf(" MOSI->"); + for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) + { + cmdLine_microUSBserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]); + } + // hex dump misoData[0..byteCount-1] + cmdLine_microUSBserial.serial().printf(" MISO<-"); + for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++) + { + cmdLine_microUSBserial.serial().printf(" 0x%2.2X", misoData[byteIndex]); + } + cmdLine_microUSBserial.serial().printf(" "); +#endif +#if 0 // HAS_DAPLINK_SERIAL + cmdLine_DAPLINKserial.serial().printf("\r\nSPI"); + if (byteCount > 7) { + cmdLine_DAPLINKserial.serial().printf(" byteCount:%d", byteCount); + } + cmdLine_DAPLINKserial.serial().printf(" MOSI->"); + for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) + { + cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]); + } + // hex dump misoData[0..byteCount-1] + cmdLine_DAPLINKserial.serial().printf(" MISO<-"); + for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++) + { + cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", misoData[byteIndex]); + } + cmdLine_DAPLINKserial.serial().printf(" "); +#endif + // VERIFY: DIAGNOSTIC: print MAX5715 device register write + // TODO: MAX5715_print_register_verbose(mosiData8_FF0000, mosiData16_00FFFF); + // TODO: print_verbose_SPI_diagnostic(mosiData16_FF00, mosiData16_00FF, misoData16_FF00, misoData16_00FF); + // + //int misoData16 = (misoData16_FF00 << 8) | misoData16_00FF; + int misoData16 = (misoData[0] << 8) | misoData[1]; + return misoData16; +} + +// CODE GENERATOR: extern function requirement MAX11043::SPIreadWrite32bits +// SPI read and write 32 bits +// SPI interface to MAX11043 shift 32 bits mosiData into MAX11043 DIN +// while simultaneously capturing 32 bits miso data from MAX11043 DOUT +// +int32_t MAX11043::SPIreadWrite32bits(int32_t mosiData32) +{ + // CODE GENERATOR: extern function definition for function SPIreadWrite32bits + // TODO1: CODE GENERATOR: extern function definition for standard SPI interface function SPIreadWrite32bits(int32_t mosiData32) + size_t byteCount = 4; + static char mosiData[4]; + static char misoData[4]; + mosiData[0] = (char)((mosiData32 >> 24) & 0xFF); // MSByte + mosiData[1] = (char)((mosiData32 >> 16) & 0xFF); + mosiData[2] = (char)((mosiData32 >> 8) & 0xFF); + mosiData[3] = (char)((mosiData32 >> 0) & 0xFF); // LSByte + // + // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts() + //~ noInterrupts(); + // + //~ digitalWrite(Scope_Trigger_Pin, LOW); // diagnostic Scope_Trigger_Pin + // + unsigned int numBytesTransferred = m_spi.write(mosiData, byteCount, misoData, byteCount); + //~ m_spi.transfer(mosiData8_FF0000); + //~ m_spi.transfer(mosiData16_00FF00); + //~ m_spi.transfer(mosiData16_0000FF); + // + //~ digitalWrite(Scope_Trigger_Pin, HIGH); // diagnostic Scope_Trigger_Pin + // + // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts() + //~ interrupts(); + // Optional Diagnostic function to print SPI transactions + if (onSPIprint) + { + onSPIprint(byteCount, (uint8_t*)mosiData, (uint8_t*)misoData); + } + // + // VERIFY: SPIwrite24bits print diagnostic information + //cmdLine.serial().printf(" MOSI->")); + //cmdLine.serial().printf(" 0x")); + //Serial.print( (mosiData8_FF0000 & 0xFF), HEX); + //cmdLine.serial().printf(" 0x")); + //Serial.print( (mosiData16_00FF00 & 0xFF), HEX); + //cmdLine.serial().printf(" 0x")); + //Serial.print( (mosiData16_0000FF & 0xFF), HEX); + // hex dump mosiData[0..byteCount-1] +#if 0 // HAS_MICROUSBSERIAL + cmdLine_microUSBserial.serial().printf("\r\nSPI"); + if (byteCount > 7) { + cmdLine_microUSBserial.serial().printf(" byteCount:%d", byteCount); + } + cmdLine_microUSBserial.serial().printf(" MOSI->"); + for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) + { + cmdLine_microUSBserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]); + } + // hex dump misoData[0..byteCount-1] + cmdLine_microUSBserial.serial().printf(" MISO<-"); + for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++) + { + cmdLine_microUSBserial.serial().printf(" 0x%2.2X", misoData[byteIndex]); + } + cmdLine_microUSBserial.serial().printf(" "); +#endif +#if 0 // HAS_DAPLINK_SERIAL + cmdLine_DAPLINKserial.serial().printf("\r\nSPI"); + if (byteCount > 7) { + cmdLine_DAPLINKserial.serial().printf(" byteCount:%d", byteCount); + } + cmdLine_DAPLINKserial.serial().printf(" MOSI->"); + for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) + { + cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]); + } + // hex dump misoData[0..byteCount-1] + cmdLine_DAPLINKserial.serial().printf(" MISO<-"); + for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++) + { + cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", misoData[byteIndex]); + } + cmdLine_DAPLINKserial.serial().printf(" "); +#endif + // VERIFY: DIAGNOSTIC: print MAX5715 device register write + // TODO: MAX5715_print_register_verbose(mosiData8_FF0000, mosiData16_00FFFF); + // TODO: print_verbose_SPI_diagnostic(mosiData16_FF00, mosiData16_00FF, misoData16_FF00, misoData16_00FF); + // + //int misoData32 = (misoData32_FF000000 << 24) | (misoData32_FF0000 << 16) | (misoData32_0000FF00 << 8) | misoData32_000000FF; + int misoData32 = (misoData[0] << 24) | (misoData[1] << 16) | (misoData[2] << 8) | misoData[3]; + return misoData32; +} + +// TODO1: CODE GENERATOR: extern function GPIOoutputSHDN alias SHDNoutputValue +// CODE GENERATOR: extern function requirement MAX11043::SHDNoutputValue +// Assert MAX11043 SHDN pin : High = _____, Low = _____. +// +void MAX11043::SHDNoutputValue(int isLogicHigh) +{ + // CODE GENERATOR: extern function definition for function SHDNoutputValue + // TODO1: CODE GENERATOR: extern function definition for gpio interface function SHDNoutputValue + // TODO1: CODE GENERATOR: gpio pin SHDN assuming member function m_SHDN_pin + // TODO1: CODE GENERATOR: gpio direction output + // m_SHDN_pin.output(); // only applicable to DigitalInOut + // TODO1: CODE GENERATOR: gpio function Value + m_SHDN_pin = isLogicHigh; +} +// TODO1: CODE GENERATOR: extern function GPIOoutputCONVRUN alias CONVRUNoutputValue +// CODE GENERATOR: extern function requirement MAX11043::CONVRUNoutputValue +// Assert MAX11043 CONVRUN pin : High = _____, Low = _____. +// +void MAX11043::CONVRUNoutputValue(int isLogicHigh) +{ + // CODE GENERATOR: extern function definition for function CONVRUNoutputValue + // TODO1: CODE GENERATOR: extern function definition for gpio interface function CONVRUNoutputValue + // TODO1: CODE GENERATOR: gpio pin CONVRUN assuming member function m_CONVRUN_pin + // TODO1: CODE GENERATOR: gpio direction output + // m_CONVRUN_pin.output(); // only applicable to DigitalInOut + // TODO1: CODE GENERATOR: gpio function Value + m_CONVRUN_pin = isLogicHigh; +} + +// TODO1: CODE GENERATOR: extern function GPIOoutputDACSTEP alias DACSTEPoutputValue +// CODE GENERATOR: extern function requirement MAX11043::DACSTEPoutputValue +// Assert MAX11043 DACSTEP pin : High = _____, Low = _____. +// +void MAX11043::DACSTEPoutputValue(int isLogicHigh) +{ + // CODE GENERATOR: extern function definition for function DACSTEPoutputValue + // TODO1: CODE GENERATOR: extern function definition for gpio interface function DACSTEPoutputValue + // TODO1: CODE GENERATOR: gpio pin DACSTEP assuming member function m_DACSTEP_pin + // TODO1: CODE GENERATOR: gpio direction output + // m_DACSTEP_pin.output(); // only applicable to DigitalInOut + // TODO1: CODE GENERATOR: gpio function Value + m_DACSTEP_pin = isLogicHigh; +} + +// TODO1: CODE GENERATOR: extern function GPIOoutputUP_slash_DWNb alias UP_slash_DWNboutputValue +// CODE GENERATOR: extern function requirement MAX11043::UP_slash_DWNboutputValue +// Assert MAX11043 UP_slash_DWNb pin : High = _____, Low = _____. +// +void MAX11043::UP_slash_DWNboutputValue(int isLogicHigh) +{ + // CODE GENERATOR: extern function definition for function UP_slash_DWNboutputValue + // TODO1: CODE GENERATOR: extern function definition for gpio interface function UP_slash_DWNboutputValue + // TODO1: CODE GENERATOR: gpio pin UP_slash_DWNb assuming member function m_UP_slash_DWNb_pin + // TODO1: CODE GENERATOR: gpio direction output + // m_UP_slash_DWNb_pin.output(); // only applicable to DigitalInOut + // TODO1: CODE GENERATOR: gpio function Value + m_UP_slash_DWNb_pin = isLogicHigh; +} + +// CODE GENERATOR: extern function requirement MAX11043::EOCinputWaitUntilLow +// Wait for MAX11043 EOC pin low, indicating end of conversion. +// Required when using any of the InternalClock modes. +// +void MAX11043::EOCinputWaitUntilLow() +{ + // CODE GENERATOR: extern function definition for function EOCinputWaitUntilLow + // TODO1: CODE GENERATOR: extern function definition for gpio interface function EOCinputWaitUntilLow + // TODO1: CODE GENERATOR: gpio pin EOC assuming member function m_EOC_pin + // TODO1: CODE GENERATOR: gpio direction input + // m_EOC_pin.input(); // only applicable to DigitalInOut + // TODO1: CODE GENERATOR: gpio function WaitUntilLow + while (m_EOC_pin != 0) + { + // spinlock waiting for logic low pin state + } +} + +// CODE GENERATOR: extern function requirement MAX11043::EOCinputValue +// Return the status of the MAX11043 EOC pin. +// +int MAX11043::EOCinputValue() +{ + // CODE GENERATOR: extern function definition for function EOCinputValue + // TODO1: CODE GENERATOR: extern function definition for gpio interface function EOCinputValue + // TODO1: CODE GENERATOR: gpio pin EOC assuming member function m_EOC_pin + // TODO1: CODE GENERATOR: gpio direction input + // m_EOC_pin.input(); // only applicable to DigitalInOut + // TODO1: CODE GENERATOR: gpio function Value + return m_EOC_pin.read(); +} + +// CODE GENERATOR: class member function definitions +//---------------------------------------- +// Menu item '!' +// Initialize device +// @return 1 on success; 0 on failure +uint8_t MAX11043::Init(void) +{ + + //---------------------------------------- + // TODO1: AC79 MAX11043 AIN0-AIN1 reference voltage, in Volts + VRef_xxxxxx = 2.500; + + //---------------------------------------- + // shadow of register ctrl CMD_r000_1001_dddd_dddd_CTRL + ctrl = 0x01; + + //---------------------------------------- + // set by Configure_PGA gain index register pga CMD_r000_1110_xxdd_xddd_PGA + pgaGain = 1; + + //---------------------------------------- + // init (based on old EV kit GUI) + #warning "Not Implemented Yet: MAX11043::Init init..." + // bool bOpResult = false; + // String FWVersionString = "00"; + // bool bDemoMode = true; + // int scan_resolution = 0; + // int scan_channels = 0; + // int scan_bits = 0; + // int sampleRateFactore = 0; + // double sampleRate = 0; + // unsigned long banks_requested = 0; + // bool bScanMode = 0; + + //---------------------------------------- + // Device ID Validation + #warning "Not Implemented Yet: MAX11043::Init Device ID Validation..." + // const uint32_t part_id_expect = 0x000F02; + // uint32_t part_id_readback; + // RegRead(xxxxxxxxxxxxCMD_r001_0001_xxxx_xxxx_xxxx_xxxx_xxxx_xddd_PART_ID, &part_id_readback); + // if (part_id_readback != part_id_expect) return 0; + + //---------------------------------------- + // write8 0x00 PD = 0x03 (Reset Registers; enter Standby mode) + // RegWrite(xxxxxxxxxxxCMD_r000_0000_xxxx_xxdd_PD, PD_11_Reset); + + //---------------------------------------- + // write8 0x00 PD = 0x00 (NOP) + // RegWrite(xxxxxxxxxxxxCMD_r000_0000_xxxx_xxdd_PD, PD_00_Normal); + + //---------------------------------------- + // success + return 1; +} + +//---------------------------------------- +// Write a MAX11043 register. +// +// CMD_1aaa_aaaa_REGISTER_READ bit is cleared 0 indicating a write operation. +// +// MAX11043 register length can be determined by function RegSize. +// +// For 8-bit register size: +// +// SPI 16-bit transfer +// +// SPI MOSI = 0aaa_aaaa_dddd_dddd +// +// SPI MISO = xxxx_xxxx_xxxx_xxxx +// +// For 16-bit register size: +// +// SPI 24-bit or 32-bit transfer +// +// SPI MOSI = 0aaa_aaaa_dddd_dddd_dddd_dddd +// +// SPI MISO = xxxx_xxxx_xxxx_xxxx_xxxx_xxxx +// +// For 24-bit register size: +// +// SPI 32-bit transfer +// +// SPI MOSI = 0aaa_aaaa_dddd_dddd_dddd_dddd_dddd_dddd +// +// SPI MISO = xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx +// +// @return 1 on success; 0 on failure +uint8_t MAX11043::RegWrite(MAX11043_CMD_enum_t commandByte, uint32_t regData) +{ + + //---------------------------------------- + // switch based on register address szie RegSize(commandByte) + //commandByte = (MAX11043_CMD_enum_t)((commandByte &~ CMD_0aaa_aa10_RdAddr_ReadAnyRegister) & 0xFF); + switch(RegSize(commandByte)) + { + case 8: // 8-bit register size + { + // SPI 16-bit transfer + // SPI MOSI = 0aaa_aaaa_dddd_dddd + // SPI MISO = xxxx_xxxx_xxxx_xxxx + int16_t mosiData16 = ((int16_t)commandByte << 8) | ((int16_t)regData & 0xFF); + SPIoutputCS(0); + SPIwrite16bits(mosiData16); + SPIoutputCS(1); + } + break; + case 16: // 16-bit register size + #warning "Not Verified Yet: MAX11043::RegWrite 16-bit SPIreadWrite32bits" + { + // SPI 24-bit or 32-bit transfer + // SPI MOSI = 0aaa_aaaa_dddd_dddd_dddd_dddd + // SPI MISO = xxxx_xxxx_xxxx_xxxx_xxxx_xxxx + // SPI MOSI = 0aaa_aaaa_dddd_dddd_dddd_dddd_0000_0000 + // SPI MISO = xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx + int32_t mosiData32 = ((int32_t)commandByte << 24) | (((int32_t)regData & 0xFFFF) << 8); + SPIoutputCS(0); + SPIreadWrite32bits(mosiData32); + SPIoutputCS(1); + } + break; + case 24: // 24-bit register size + { + // SPI 32-bit transfer + // SPI MOSI = 0aaa_aaaa_dddd_dddd_dddd_dddd_dddd_dddd + // SPI MISO = xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx + int32_t mosiData32 = ((int32_t)commandByte << 24) | ((int32_t)regData & 0x00FFFFFF); + SPIoutputCS(0); + SPIreadWrite32bits(mosiData32); + SPIoutputCS(1); + } + break; + } + + //---------------------------------------- + // success + return 1; +} + +//---------------------------------------- +// Read an 8-bit MAX11043 register +// +// CMD_1aaa_aaaa_REGISTER_READ bit is set 1 indicating a read operation. +// +// MAX11043 register length can be determined by function RegSize. +// +// For 8-bit register size: +// +// SPI 16-bit transfer +// +// SPI MOSI = 1aaa_aaaa_0000_0000 +// +// SPI MISO = xxxx_xxxx_dddd_dddd +// +// For 16-bit register size: +// +// SPI 24-bit or 32-bit transfer +// +// SPI MOSI = 1aaa_aaaa_0000_0000_0000_0000 +// +// SPI MISO = xxxx_xxxx_dddd_dddd_dddd_dddd +// +// For 24-bit register size: +// +// SPI 32-bit transfer +// +// SPI MOSI = 1aaa_aaaa_0000_0000_0000_0000_0000_0000 +// +// SPI MISO = xxxx_xxxx_dddd_dddd_dddd_dddd_dddd_dddd +// +// +// @return 1 on success; 0 on failure +uint8_t MAX11043::RegRead(MAX11043_CMD_enum_t commandByte, uint32_t* ptrRegData) +{ + + //---------------------------------------- + // switch based on register address szie RegSize(regAddress) + //commandByte = (MAX11043_CMD_enum_t)((commandByte &~ CMD_0aaa_aa10_RdAddr_ReadAnyRegister) & 0xFF); + switch(RegSize(commandByte)) + { + case 8: // 8-bit register size + { + // SPI 16-bit transfer + // SPI MOSI = 1aaa_aaaa_0000_0000 + // SPI MISO = xxxx_xxxx_dddd_dddd + int16_t mosiData16 = ((CMD_0aaa_aa10_RdAddr_ReadAnyRegister | (int16_t)commandByte) << 8) | ((int16_t)0); + SPIoutputCS(0); + int16_t misoData16 = SPIreadWrite16bits(mosiData16); + SPIoutputCS(1); + (*ptrRegData) = (misoData16 & 0x00FF); + } + break; + case 16: // 16-bit register size + #warning "Not Verified Yet: MAX11043::RegRead 16-bit SPIreadWrite32bits" + { + // SPI 24-bit or 32-bit transfer + // SPI MOSI = 1aaa_aaaa_0000_0000_0000_0000 + // SPI MISO = xxxx_xxxx_dddd_dddd_dddd_dddd + // SPI MOSI = 1aaa_aaaa_0000_0000_0000_0000_0000_0000 + // SPI MISO = xxxx_xxxx_dddd_dddd_dddd_dddd_xxxx_xxxx + int32_t mosiData32 = ((CMD_0aaa_aa10_RdAddr_ReadAnyRegister | (int32_t)commandByte) << 24); + SPIoutputCS(0); + int32_t misoData32 = SPIreadWrite32bits(mosiData32); + SPIoutputCS(1); + (*ptrRegData) = ((misoData32 >> 8) & 0x00FFFF); + } + break; + case 24: // 24-bit register size + { + // SPI 32-bit transfer + // SPI MOSI = 1aaa_aaaa_0000_0000_0000_0000_0000_0000 + // SPI MISO = xxxx_xxxx_dddd_dddd_dddd_dddd_dddd_dddd + int32_t mosiData32 = ((CMD_0aaa_aa10_RdAddr_ReadAnyRegister | (int32_t)commandByte) << 24); + SPIoutputCS(0); + int32_t misoData32 = SPIreadWrite32bits(mosiData32); + SPIoutputCS(1); + (*ptrRegData) = (misoData32 & 0x00FFFFFF); + } + break; + } + + //---------------------------------------- + // success + return 1; +} + +//---------------------------------------- +// Return the size of a MAX11043 register +// +// @return 8 for 8-bit, 16 for 16-bit, 24 for 24-bit, else 0 for undefined register size +uint8_t MAX11043::RegSize(MAX11043_CMD_enum_t commandByte) +{ + + //---------------------------------------- + // switch based on register address value regAddress + // commandByte = (MAX11043_CMD_enum_t)((commandByte &~ CMD_0aaa_aa10_RdAddr_ReadAnyRegister) & 0xFF); + switch(commandByte) + { + default: + case CMD_0aaa_aa00_WrAddr_WriteAnyRegister: + case CMD_0aaa_aa10_RdAddr_ReadAnyRegister: + case CMD_1111_1111_NoOperationMOSIidleHigh: + return 0; // undefined register size + case CMD_0001_1110_d8_Rd07_Status: + case CMD_0101_0100_d8_Wr15_FilterCAddress: + case CMD_0101_0110_d8_Rd15_FilterCAddress: + case CMD_0110_0000_d8_Wr18_FlashMode: + case CMD_0110_0010_d8_Rd18_FlashMode: + return 8; // 8-bit register size + case CMD_0010_0000_d16_Wr08_Configuration: + case CMD_0010_0010_d16_Rd08_Configuration: + case CMD_0010_0100_d16_Wr09_DAC: + case CMD_0010_0110_d16_Rd09_DAC: + case CMD_0010_1000_d16_Wr0A_DACStep: + case CMD_0010_1010_d16_Rd0A_DACStep: + case CMD_0010_1100_d16_Wr0B_DACHDACL: + case CMD_0010_1110_d16_Rd0B_DACHDACL: + case CMD_0011_0000_d16_Wr0C_ConfigA: + case CMD_0011_0010_d16_Rd0C_ConfigA: + case CMD_0011_0100_d16_Wr0D_ConfigB: + case CMD_0011_0110_d16_Rd0D_ConfigB: + case CMD_0011_1000_d16_Wr0E_ConfigC: + case CMD_0011_1010_d16_Rd0E_ConfigC: + case CMD_0011_1100_d16_Wr0F_ConfigD: + case CMD_0011_1110_d16_Rd0F_ConfigD: + case CMD_0100_0000_d16_Wr10_Reference: + case CMD_0100_0010_d16_Rd10_Reference: + case CMD_0100_0100_d16_Wr11_AGain: + case CMD_0100_0110_d16_Rd11_AGain: + case CMD_0100_1000_d16_Wr12_BGain: + case CMD_0100_1010_d16_Rd12_BGain: + case CMD_0100_1100_d16_Wr13_CGain: + case CMD_0100_1110_d16_Rd13_CGain: + case CMD_0101_0000_d16_Wr14_DGain: + case CMD_0101_0010_d16_Rd14_DGain: + case CMD_0110_0100_d16_Wr19_FlashAddr: + case CMD_0110_0110_d16_Rd19_FlashAddr: + case CMD_0110_1000_d16_Wr1A_FlashDataIn: + case CMD_0110_1010_d16_Rd1A_FlashDataIn: + case CMD_0110_1110_d16_Rd1B_FlashDataOut: + return 16; // 16-bit register size + case CMD_0000_0010_d24_Rd00_ADCa: + case CMD_0000_0110_d24_Rd01_ADCb: + case CMD_0000_1010_d24_Rd02_ADCc: + case CMD_0000_1110_d24_Rd03_ADCd: + return 24; // 24-bit register size + case CMD_0001_0010_d24_d24_Rd04_ADCab: + case CMD_0001_0110_d24_d24_Rd05_ADCcd: + return 48; // 24-bit register size + case CMD_0001_1010_d24_d24_d24_d24_Rd06_ADCabcd: + return 96; // 24-bit register size + case CMD_0101_1000_d32_Wr16_FilterCDataOut: + case CMD_0101_1010_d32_Rd16_FilterCDataOut: + case CMD_0101_1100_d32_Wr17_FilterCDataIn: + case CMD_0101_1110_d32_Rd17_FilterCDataIn: + return 32; // 32-bit register size + } +} + +//---------------------------------------- +// Return the address field of a MAX11043 register +// +// @return register address field as given in datasheet +uint8_t MAX11043::RegAddrOfCommand(MAX11043_CMD_enum_t commandByte) +{ + + //---------------------------------------- + // extract register address value from command byte + return (uint8_t)((commandByte &~ 0x83) >> 2); // CMD_0aaa_aa10_RdAddr_ReadAnyRegister +} + +//---------------------------------------- +// Test whether a command byte is a register read command +// +// @return true if command byte is a register read command +uint8_t MAX11043::IsRegReadCommand(MAX11043_CMD_enum_t commandByte) +{ + + //---------------------------------------- + // Test whether a command byte is a register read command + return (commandByte &~ 0x02) ? 1 : 0; // CMD_0aaa_aa10_RdAddr_ReadAnyRegister +} + +//---------------------------------------- +// Return the name of a MAX11043 register +// +// @return null-terminated constant C string containing register name or empty string +const char* MAX11043::RegName(MAX11043_CMD_enum_t commandByte) +{ + + //---------------------------------------- + // switch based on register address value regAddress + // commandByte = (MAX11043_CMD_enum_t)((commandByte &~ CMD_0aaa_aa10_RdAddr_ReadAnyRegister) & 0xFF); + switch(commandByte) + { + default: + return ""; // undefined register + // case CMD_0aaa_aa00_WrAddr_WriteAnyRegister: return "_______"; + // case CMD_0aaa_aa10_RdAddr_ReadAnyRegister: return "_______"; + // case CMD_1111_1111_NoOperationMOSIidleHigh: return "_______"; + case CMD_0000_0010_d24_Rd00_ADCa: return "ADCa"; + case CMD_0000_0110_d24_Rd01_ADCb: return "ADCb"; + case CMD_0000_1010_d24_Rd02_ADCc: return "ADCc"; + case CMD_0000_1110_d24_Rd03_ADCd: return "ADCd"; + case CMD_0001_0010_d24_d24_Rd04_ADCab: return "ADCab"; + case CMD_0001_0110_d24_d24_Rd05_ADCcd: return "ADCcd"; + case CMD_0001_1010_d24_d24_d24_d24_Rd06_ADCabcd: return "ADCabcd"; + case CMD_0001_1110_d8_Rd07_Status: return "Status"; + case CMD_0010_0000_d16_Wr08_Configuration: return "Configuration"; + case CMD_0010_0010_d16_Rd08_Configuration: return "Configuration"; + case CMD_0010_0100_d16_Wr09_DAC: return "DAC"; + case CMD_0010_0110_d16_Rd09_DAC: return "DAC"; + case CMD_0010_1000_d16_Wr0A_DACStep: return "DACStep"; + case CMD_0010_1010_d16_Rd0A_DACStep: return "DACStep"; + case CMD_0010_1100_d16_Wr0B_DACHDACL: return "DACHDACL"; + case CMD_0010_1110_d16_Rd0B_DACHDACL: return "DACHDACL"; + case CMD_0011_0000_d16_Wr0C_ConfigA: return "ConfigA"; + case CMD_0011_0010_d16_Rd0C_ConfigA: return "ConfigA"; + case CMD_0011_0100_d16_Wr0D_ConfigB: return "ConfigB"; + case CMD_0011_0110_d16_Rd0D_ConfigB: return "ConfigB"; + case CMD_0011_1000_d16_Wr0E_ConfigC: return "ConfigC"; + case CMD_0011_1010_d16_Rd0E_ConfigC: return "ConfigC"; + case CMD_0011_1100_d16_Wr0F_ConfigD: return "ConfigD"; + case CMD_0011_1110_d16_Rd0F_ConfigD: return "ConfigD"; + case CMD_0100_0000_d16_Wr10_Reference: return "Reference"; + case CMD_0100_0010_d16_Rd10_Reference: return "Reference"; + case CMD_0100_0100_d16_Wr11_AGain: return "AGain"; + case CMD_0100_0110_d16_Rd11_AGain: return "AGain"; + case CMD_0100_1000_d16_Wr12_BGain: return "BGain"; + case CMD_0100_1010_d16_Rd12_BGain: return "BGain"; + case CMD_0100_1100_d16_Wr13_CGain: return "CGain"; + case CMD_0100_1110_d16_Rd13_CGain: return "CGain"; + case CMD_0101_0000_d16_Wr14_DGain: return "DGain"; + case CMD_0101_0010_d16_Rd14_DGain: return "DGain"; + case CMD_0101_0100_d8_Wr15_FilterCAddress: return "FilterCAddress"; + case CMD_0101_0110_d8_Rd15_FilterCAddress: return "FilterCAddress"; + case CMD_0101_1000_d32_Wr16_FilterCDataOut: return "FilterCDataOut"; + case CMD_0101_1010_d32_Rd16_FilterCDataOut: return "FilterCDataOut"; + case CMD_0101_1100_d32_Wr17_FilterCDataIn: return "FilterCDataIn"; + case CMD_0101_1110_d32_Rd17_FilterCDataIn: return "FilterCDataIn"; + case CMD_0110_0000_d8_Wr18_FlashMode: return "FlashMode"; + case CMD_0110_0010_d8_Rd18_FlashMode: return "FlashMode"; + case CMD_0110_0100_d16_Wr19_FlashAddr: return "FlashAddr"; + case CMD_0110_0110_d16_Rd19_FlashAddr: return "FlashAddr"; + case CMD_0110_1000_d16_Wr1A_FlashDataIn: return "FlashDataIn"; + case CMD_0110_1010_d16_Rd1A_FlashDataIn: return "FlashDataIn"; + case CMD_0110_1110_d16_Rd1B_FlashDataOut: return "FlashDataOut"; + } +} + + +// End of file
--- a/MAX11043/MAX11043.h Tue Feb 11 01:16:34 2020 +0000 +++ b/MAX11043/MAX11043.h Tue Feb 11 09:01:20 2020 +0000 @@ -1,832 +1,831 @@ -// /******************************************************************************* -// * Copyright (C) 2020 Maxim Integrated Products, Inc., All Rights Reserved. -// * -// * Permission is hereby granted, free of charge, to any person obtaining a -// * copy of this software and associated documentation files (the "Software"), -// * to deal in the Software without restriction, including without limitation -// * the rights to use, copy, modify, merge, publish, distribute, sublicense, -// * and/or sell copies of the Software, and to permit persons to whom the -// * Software is furnished to do so, subject to the following conditions: -// * -// * The above copyright notice and this permission notice shall be included -// * in all copies or substantial portions of the Software. -// * -// * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -// * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES -// * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -// * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// * OTHER DEALINGS IN THE SOFTWARE. -// * -// * Except as contained in this notice, the name of Maxim Integrated -// * Products, Inc. shall not be used except as stated in the Maxim Integrated -// * Products, Inc. Branding Policy. -// * -// * The mere transfer of this software does not imply any licenses -// * of trade secrets, proprietary technology, copyrights, patents, -// * trademarks, maskwork rights, or any other form of intellectual -// * property whatsoever. Maxim Integrated Products, Inc. retains all -// * ownership rights. -// ******************************************************************************* -// */ -// ********************************************************************* -// @file MAX11043.h -// ********************************************************************* -// Header file -// DO NOT EDIT; except areas designated "CUSTOMIZE". Automatically generated file. -// generated by XMLSystemOfDevicesToMBED.py -// System Name = ExampleSystem -// System Description = Device driver example -// Device Name = MAX11043 -// Device Description = 200ksps, Low-Power, Serial SPI 24-Bit, 4-Channel, Differential/Single-Ended Input, Simultaneous-Sampling SD ADC -// Device DeviceBriefDescription = 24-bit 200ksps Delta-Sigma ADC -// Device Manufacturer = Maxim Integrated -// Device PartNumber = MAX11043ATL+ -// Device RegValue_Width = DataWidth16bit_HL -// -// ADC MaxOutputDataRate = 200ksps -// ADC NumChannels = 4 -// ADC ResolutionBits = 24 -// -// SPI CS = ActiveLow -// SPI FrameStart = CS -// SPI CPOL = 0 -// SPI CPHA = 0 -// SPI MOSI and MISO Data are both stable on Rising edge of SCLK -// SPI SCLK Idle Low -// SPI SCLKMaxMHz = 40 -// SPI SCLKMinMHz = 0 -// - - -// Prevent multiple declaration -#ifndef __MAX11043_H__ -#define __MAX11043_H__ - -// standard include for target platform -- Platform_Include_Boilerplate -#include "mbed.h" -// Platforms: -// - MAX32625MBED -// - supports mbed-os-5.11, requires USBDevice library -// - add https://developer.mbed.org/teams/MaximIntegrated/code/USBDevice/ -// - remove max32630fthr library (if present) -// - remove MAX32620FTHR library (if present) -// - MAX32600MBED -// - remove max32630fthr library (if present) -// - remove MAX32620FTHR library (if present) -// - Windows 10 note: Don't connect HDK until you are ready to load new firmware into the board. -// - NUCLEO_F446RE -// - remove USBDevice library -// - remove max32630fthr library (if present) -// - remove MAX32620FTHR library (if present) -// - NUCLEO_F401RE -// - remove USBDevice library -// - remove max32630fthr library (if present) -// - remove MAX32620FTHR library (if present) -// - MAX32630FTHR -// - #include "max32630fthr.h" -// - add http://os.mbed.org/teams/MaximIntegrated/code/max32630fthr/ -// - remove MAX32620FTHR library (if present) -// - MAX32620FTHR -// - #include "MAX32620FTHR.h" -// - remove max32630fthr library (if present) -// - add https://os.mbed.com/teams/MaximIntegrated/code/MAX32620FTHR/ -// - not tested yet -// - MAX32625PICO -// - remove max32630fthr library (if present) -// - remove MAX32620FTHR library (if present) -// - not tested yet -// -// end Platform_Include_Boilerplate - -// CODE GENERATOR: conditional defines -// CODE GENERATOR: class declaration and docstrings -/** - * @brief MAX11043 200ksps, Low-Power, Serial SPI 24-Bit, 4-Channel, Differential/Single-Ended Input, Simultaneous-Sampling SD ADC - * - * - * - * Datasheet: https://www.maximintegrated.com/MAX11043 - * - * - * - * //---------- CODE GENERATOR: helloCppCodeList - * @code - * // CODE GENERATOR: example code includes - * - * // example code includes - * // standard include for target platform -- Platform_Include_Boilerplate - * #include "mbed.h" - * // Platforms: - * // - MAX32625MBED - * // - supports mbed-os-5.11, requires USBDevice library - * // - add https://developer.mbed.org/teams/MaximIntegrated/code/USBDevice/ - * // - remove max32630fthr library (if present) - * // - remove MAX32620FTHR library (if present) - * // - MAX32600MBED - * // - remove max32630fthr library (if present) - * // - remove MAX32620FTHR library (if present) - * // - Windows 10 note: Don't connect HDK until you are ready to load new firmware into the board. - * // - NUCLEO_F446RE - * // - remove USBDevice library - * // - remove max32630fthr library (if present) - * // - remove MAX32620FTHR library (if present) - * // - NUCLEO_F401RE - * // - remove USBDevice library - * // - remove max32630fthr library (if present) - * // - remove MAX32620FTHR library (if present) - * // - MAX32630FTHR - * // - #include "max32630fthr.h" - * // - add http://os.mbed.org/teams/MaximIntegrated/code/max32630fthr/ - * // - remove MAX32620FTHR library (if present) - * // - MAX32620FTHR - * // - #include "MAX32620FTHR.h" - * // - remove max32630fthr library (if present) - * // - add https://os.mbed.com/teams/MaximIntegrated/code/MAX32620FTHR/ - * // - not tested yet - * // - MAX32625PICO - * // - remove max32630fthr library (if present) - * // - remove MAX32620FTHR library (if present) - * // - not tested yet - * // - * // end Platform_Include_Boilerplate - * #include "MAX11043.h" - * - * // example code board support - * //MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3); - * //DigitalOut rLED(LED1); - * //DigitalOut gLED(LED2); - * //DigitalOut bLED(LED3); - * // - * // Arduino "shield" connector port definitions (MAX32625MBED shown) - * #if defined(TARGET_MAX32625MBED) - * #define A0 AIN_0 - * #define A1 AIN_1 - * #define A2 AIN_2 - * #define A3 AIN_3 - * #define D0 P0_0 - * #define D1 P0_1 - * #define D2 P0_2 - * #define D3 P0_3 - * #define D4 P0_4 - * #define D5 P0_5 - * #define D6 P0_6 - * #define D7 P0_7 - * #define D8 P1_4 - * #define D9 P1_5 - * #define D10 P1_3 - * #define D11 P1_1 - * #define D12 P1_2 - * #define D13 P1_0 - * #endif - * - * // example code declare SPI interface - * #if defined(TARGET_MAX32625MBED) - * SPI spi(SPI1_MOSI, SPI1_MISO, SPI1_SCK); // mosi, miso, sclk spi1 TARGET_MAX32625MBED: P1_1 P1_2 P1_0 Arduino 10-pin header D11 D12 D13 - * DigitalOut spi_cs(SPI1_SS); // TARGET_MAX32625MBED: P1_3 Arduino 10-pin header D10 - * #elif defined(TARGET_MAX32600MBED) - * SPI spi(SPI2_MOSI, SPI2_MISO, SPI2_SCK); // mosi, miso, sclk spi1 TARGET_MAX32600MBED: Arduino 10-pin header D11 D12 D13 - * DigitalOut spi_cs(SPI2_SS); // Generic: Arduino 10-pin header D10 - * #else - * SPI spi(D11, D12, D13); // mosi, miso, sclk spi1 TARGET_MAX32600MBED: Arduino 10-pin header D11 D12 D13 - * DigitalOut spi_cs(D10); // Generic: Arduino 10-pin header D10 - * #endif - * - * // example code declare GPIO interface pins - * DigitalOut CONVRUN_pin(D9); // Digital Configuration Input to MAX11043 device - * DigitalOut SHDN_pin(D8); // Digital Configuration Input to MAX11043 device - * DigitalOut DACSTEP_pin(D7); // Digital Configuration Input to MAX11043 device - * DigitalOut UP_slash_DWNb_pin(D6); // Digital Configuration Input to MAX11043 device - * DigitalIn EOC_pin(D2); // Digital Event Output from MAX11043 device - * // example code declare device instance - * MAX11043 g_MAX11043_device(spi, spi_cs, CONVRUN_pin, SHDN_pin, DACSTEP_pin, UP_slash_DWNb_pin, EOC_pin, MAX11043::MAX11043_IC); - * - * // CODE GENERATOR: example code for ADC: serial port declaration - * //-------------------------------------------------- - * // Declare the Serial driver - * // default baud rate settings are 9600 8N1 - * // install device driver from http://developer.mbed.org/media/downloads/drivers/mbedWinSerial_16466.exe - * // see docs https://docs.mbed.com/docs/mbed-os-handbook/en/5.5/getting_started/what_need/ - * #if defined(TARGET_MAX32630) - * #include "USBSerial.h" - * // Hardware serial port over DAPLink - * // The default baud rate for the DapLink UART is 9600 - * //Serial DAPLINKserial(P2_1, P2_0); // tx, rx - * // #define HAS_DAPLINK_SERIAL 1 - * // Virtual serial port over USB - * // The baud rate does not affect the virtual USBSerial UART. - * USBSerial serial; - * //-------------------------------------------------- - * #elif defined(TARGET_MAX32625MBED) - * #include "USBSerial.h" - * // Hardware serial port over DAPLink - * // The default baud rate for the DapLink UART is 9600 - * //Serial DAPLINKserial(P2_1, P2_0); // tx, rx - * // #define HAS_DAPLINK_SERIAL 1 - * // Virtual serial port over USB - * // The baud rate does not affect the virtual USBSerial UART. - * USBSerial serial; - * //-------------------------------------------------- - * #elif defined(TARGET_MAX32600) - * #include "USBSerial.h" - * // Hardware serial port over DAPLink - * // The default baud rate for the DapLink UART is 9600 - * Serial DAPLINKserial(P1_1, P1_0); // tx, rx - * #define HAS_DAPLINK_SERIAL 1 - * // Virtual serial port over USB - * // The baud rate does not affect the virtual USBSerial UART. - * USBSerial serial; - * //-------------------------------------------------- - * #elif defined(TARGET_NUCLEO_F446RE) || defined(TARGET_NUCLEO_F401RE) - * Serial serial(SERIAL_TX, SERIAL_RX); // tx, rx - * //-------------------------------------------------- - * #else - * #if defined(SERIAL_TX) - * #warning "target not previously tested; guess serial pins are SERIAL_TX, SERIAL_RX..." - * Serial serial(SERIAL_TX, SERIAL_RX); // tx, rx - * #elif defined(USBTX) - * #warning "target not previously tested; guess serial pins are USBTX, USBRX..." - * Serial serial(USBTX, USBRX); // tx, rx - * #elif defined(UART_TX) - * #warning "target not previously tested; guess serial pins are UART_TX, UART_RX..." - * Serial serial(UART_TX, UART_RX); // tx, rx - * #else - * #warning "target not previously tested; need to define serial pins..." - * #endif - * #endif - * // - * #include "CmdLine.h" - * CmdLine cmdLine(serial, "serial"); - * - * // example code main function - * int main() - * { - * // CODE GENERATOR: example code: member function Init - * g_MAX11043_device.Init(); - * - * while (1) - * { - * // CODE GENERATOR: example code: has no member function REF - * // CODE GENERATOR: example code for ADC: repeat-forever convert and print conversion result, one record per line - * // CODE GENERATOR: ResolutionBits = 24 - * // CODE GENERATOR: FScode = None - * // CODE GENERATOR: NumChannels = 4 - * while(1) { // this code repeats forever - * // this code repeats forever - * // CODE GENERATOR: example code: has no member function ScanStandardExternalClock - * // CODE GENERATOR: example code: has no member function ReadAINcode - * // wait(3.0); - * // CODE GENERATOR: print conversion result - * // Use Arduino Serial Plotter to view output: Tools | Serial Plotter - * cmdLine.serial().printf("%d", g_MAX11043_device.AINcode[0]); - * for (int index = 1; index <= channelId_0_3; index++) { - * cmdLine.serial().printf(",%d", g_MAX11043_device.AINcode[index]); - * } - * cmdLine.serial().printf("\r\n"); - * - * } // this code repeats forever - * } - * } - * @endcode - * //---------- CODE GENERATOR: end helloCppCodeList - */ -class MAX11043 { -public: -// CODE GENERATOR: TypedefEnum EnumItem declarations -// CODE GENERATOR: TypedefEnum MAX11043_CMD_enum_t - //---------------------------------------- - /// Register Addresses - /// - /// Naming convention is CMD_bitstream_WrAddr_FunctionName - /// - first byte format is 0aaa_aar0 - /// - 0 = bitstream required 0 bit - /// - aaa_aa = bitstream 5-bit register address field - /// - r = bitstream read/write bit (1=read, 0=write) - /// - WrAddr = Write operation to address Addr - /// - RdAddr = Read operation from address Addr - /// - d8 = 8-bit register data field - /// - d16 = 16-bit register data field - /// - d24 = 24-bit register data field - /// - d32 = 32-bit register data field - /// - x = don't care - typedef enum MAX11043_CMD_enum_t { - CMD_0aaa_aa00_WrAddr_WriteAnyRegister = 0x00, //!< 8'b00000000 - CMD_0000_0010_d24_Rd00_ADCa = 0x02, //!< 8'b00000010 - CMD_0000_0110_d24_Rd01_ADCb = 0x06, //!< 8'b00000110 - CMD_0000_1010_d24_Rd02_ADCc = 0x0a, //!< 8'b00001010 - CMD_0000_1110_d24_Rd03_ADCd = 0x0e, //!< 8'b00001110 - CMD_0001_0010_d24_d24_Rd04_ADCab = 0x12, //!< 8'b00010010 - CMD_0001_0110_d24_d24_Rd05_ADCcd = 0x16, //!< 8'b00010110 - CMD_0001_1010_d24_d24_d24_d24_Rd06_ADCabcd = 0x1a, //!< 8'b00011010 - CMD_0001_1110_d8_Rd07_Status = 0x1e, //!< 8'b00011110 - CMD_0010_0000_d16_Wr08_Configuration = 0x20, //!< 8'b00100000 - CMD_0010_0010_d16_Rd08_Configuration = 0x22, //!< 8'b00100010 - CMD_0010_0100_d16_Wr09_DAC = 0x24, //!< 8'b00100100 - CMD_0010_0110_d16_Rd09_DAC = 0x26, //!< 8'b00100110 - CMD_0010_1000_d16_Wr0A_DACStep = 0x28, //!< 8'b00101000 - CMD_0010_1010_d16_Rd0A_DACStep = 0x2a, //!< 8'b00101010 - CMD_0010_1100_d16_Wr0B_DACHDACL = 0x2c, //!< 8'b00101100 - CMD_0010_1110_d16_Rd0B_DACHDACL = 0x2e, //!< 8'b00101110 - CMD_0011_0000_d16_Wr0C_ConfigA = 0x30, //!< 8'b00110000 - CMD_0011_0010_d16_Rd0C_ConfigA = 0x32, //!< 8'b00110010 - CMD_0011_0100_d16_Wr0D_ConfigB = 0x34, //!< 8'b00110100 - CMD_0011_0110_d16_Rd0D_ConfigB = 0x36, //!< 8'b00110110 - CMD_0011_1000_d16_Wr0E_ConfigC = 0x38, //!< 8'b00111000 - CMD_0011_1010_d16_Rd0E_ConfigC = 0x3a, //!< 8'b00111010 - CMD_0011_1100_d16_Wr0F_ConfigD = 0x3c, //!< 8'b00111100 - CMD_0011_1110_d16_Rd0F_ConfigD = 0x3e, //!< 8'b00111110 - CMD_0100_0000_d16_Wr10_Reference = 0x40, //!< 8'b01000000 - CMD_0100_0010_d16_Rd10_Reference = 0x42, //!< 8'b01000010 - CMD_0100_0100_d16_Wr11_AGain = 0x44, //!< 8'b01000100 - CMD_0100_0110_d16_Rd11_AGain = 0x46, //!< 8'b01000110 - CMD_0100_1000_d16_Wr12_BGain = 0x48, //!< 8'b01001000 - CMD_0100_1010_d16_Rd12_BGain = 0x4a, //!< 8'b01001010 - CMD_0100_1100_d16_Wr13_CGain = 0x4c, //!< 8'b01001100 - CMD_0100_1110_d16_Rd13_CGain = 0x4e, //!< 8'b01001110 - CMD_0101_0000_d16_Wr14_DGain = 0x50, //!< 8'b01010000 - CMD_0101_0010_d16_Rd14_DGain = 0x52, //!< 8'b01010010 - CMD_0101_0100_d8_Wr15_FilterCAddress = 0x54, //!< 8'b01010100 - CMD_0101_0110_d8_Rd15_FilterCAddress = 0x56, //!< 8'b01010110 - CMD_0101_1000_d32_Wr16_FilterCDataOut = 0x58, //!< 8'b01011000 - CMD_0101_1010_d32_Rd16_FilterCDataOut = 0x5a, //!< 8'b01011010 - CMD_0101_1100_d32_Wr17_FilterCDataIn = 0x5c, //!< 8'b01011100 - CMD_0101_1110_d32_Rd17_FilterCDataIn = 0x5e, //!< 8'b01011110 - CMD_0110_0000_d8_Wr18_FlashMode = 0x60, //!< 8'b01100000 - CMD_0110_0010_d8_Rd18_FlashMode = 0x62, //!< 8'b01100010 - CMD_0110_0100_d16_Wr19_FlashAddr = 0x64, //!< 8'b01100100 - CMD_0110_0110_d16_Rd19_FlashAddr = 0x66, //!< 8'b01100110 - CMD_0110_1000_d16_Wr1A_FlashDataIn = 0x68, //!< 8'b01101000 - CMD_0110_1010_d16_Rd1A_FlashDataIn = 0x6a, //!< 8'b01101010 - CMD_0110_1110_d16_Rd1B_FlashDataOut = 0x6e, //!< 8'b01101110 - CMD_0aaa_aa10_RdAddr_ReadAnyRegister = 0x80, //!< 8'b10000000 - CMD_1111_1111_NoOperationMOSIidleHigh = 0xff, //!< 8'b11111111 - } MAX11043_CMD_enum_t; - -// CODE GENERATOR: TypedefEnum MAX11043_STATUS_enum_t - //---------------------------------------- - /// CMD_0001_1110_d8_Rd_Status - /// regAddr=07h - /// Status: x x FlashBusy BOOT OFLGA OFLGB OFLGC OFLGD - typedef enum MAX11043_STATUS_enum_t { - STATUS_xxxx_xxx1_OverflowFlagOFLGD = 0x01, //!< 8'b00000001 - STATUS_xxxx_xx1x_OverflowFlagOFLGC = 0x02, //!< 8'b00000010 - STATUS_xxxx_x1xx_OverflowFlagOFLGB = 0x04, //!< 8'b00000100 - STATUS_xxxx_1xxx_OverflowFlagOFLGA = 0x08, //!< 8'b00001000 - STATUS_xxx1_xxxx_PowerOnResetBOOT = 0x10, //!< 8'b00010000 - STATUS_xx1x_xxxx_FlashBusy = 0x20, //!< 8'b00100000 - STATUS_x1xx_xxxx_RESERVED = 0x40, //!< 8'b01000000 - STATUS_1xxx_xxxx_RESERVED = 0x80, //!< 8'b10000000 - } MAX11043_STATUS_enum_t; - -// CODE GENERATOR: TypedefEnum MAX11043_CONFIG_enum_t - //---------------------------------------- - /// CMD_0010_0000_d16_Wr_Configuration - /// regAddr=08h - /// Config: EXTCLK CLKDIV1 CLKDIV0 PD PDA PDB PDC PDD PDDAC PDOSC 24BIT SCHANA SCHANB SCHANC SCHAND DECSEL - typedef enum MAX11043_CONFIG_enum_t { - CONFIG_xxxx_xxxx_xxxx_xxx1_DECSEL12 = 0x0001, //!< 16'b0000000000000001 - CONFIG_xxxx_xxxx_xxxx_xx1x_SCHAND = 0x0002, //!< 16'b0000000000000010 - CONFIG_xxxx_xxxx_xxxx_x1xx_SCHANC = 0x0004, //!< 16'b0000000000000100 - CONFIG_xxxx_xxxx_xxxx_1xxx_SCHANB = 0x0008, //!< 16'b0000000000001000 - CONFIG_xxxx_xxxx_xxx1_xxxx_SCHANA = 0x0010, //!< 16'b0000000000010000 - CONFIG_xxxx_xxxx_xx1x_xxxx_24BIT = 0x0020, //!< 16'b0000000000100000 - CONFIG_xxxx_xxxx_x1xx_xxxx_PDOSC = 0x0040, //!< 16'b0000000001000000 - CONFIG_xxxx_xxxx_1xxx_xxxx_PDDAC = 0x0080, //!< 16'b0000000010000000 - CONFIG_xxxx_xxx1_xxxx_xxxx_PDD = 0x0100, //!< 16'b0000000100000000 - CONFIG_xxxx_xx1x_xxxx_xxxx_PDC = 0x0200, //!< 16'b0000001000000000 - CONFIG_xxxx_x1xx_xxxx_xxxx_PDB = 0x0400, //!< 16'b0000010000000000 - CONFIG_xxxx_1xxx_xxxx_xxxx_PDA = 0x0800, //!< 16'b0000100000000000 - CONFIG_xxx1_xxxx_xxxx_xxxx_PD = 0x1000, //!< 16'b0001000000000000 - CONFIG_xx1x_xxxx_xxxx_xxxx_CLKDIV0 = 0x2000, //!< 16'b0010000000000000 - CONFIG_x1xx_xxxx_xxxx_xxxx_CLKDIV1 = 0x4000, //!< 16'b0100000000000000 - CONFIG_1xxx_xxxx_xxxx_xxxx_EXTCLK = 0x8000, //!< 16'b1000000000000000 - } MAX11043_CONFIG_enum_t; - -// CODE GENERATOR: TypedefEnum MAX11043_CONFIGABCD_enum_t - //---------------------------------------- - /// CMD_0011_0000_d16_Wr_CONFIGa - /// CMD_0011_0100_d16_Wr_CONFIGb - /// CMD_0011_1000_d16_Wr_CONFIGc - /// CMD_0011_1100_d16_Wr_CONFIGd - /// regAddr=0Ch - /// regAddr=0Dh - /// regAddr=0Eh - /// regAddr=0Fh - /// ConfigABCD: x x x BDAC[3:0] DIFF EQ MODG[1:0] PDPGA FILT PGAG ENBIASP ENBIASN - typedef enum MAX11043_CONFIGABCD_enum_t { - CONFIGABCD_xxxx_xxxx_xxxx_xxx1_ENBIASN = 0x0001, //!< 16'b0000000000000001 - CONFIGABCD_xxxx_xxxx_xxxx_xx1x_ENBIASP = 0x0002, //!< 16'b0000000000000010 - CONFIGABCD_xxxx_xxxx_xxxx_x1xx_PGAG16 = 0x0004, //!< 16'b0000000000000100 - CONFIGABCD_xxxx_xxxx_xxxx_1xxx_FILTLP = 0x0008, //!< 16'b0000000000001000 - CONFIGABCD_xxxx_xxxx_xxx1_xxxx_PDPGA = 0x0010, //!< 16'b0000000000010000 - CONFIGABCD_xxxx_xxxx_xx1x_xxxx_MODG0 = 0x0020, //!< 16'b0000000000100000 - CONFIGABCD_xxxx_xxxx_x1xx_xxxx_MODG1 = 0x0040, //!< 16'b0000000001000000 - CONFIGABCD_xxxx_xxxx_1xxx_xxxx_EQ = 0x0080, //!< 16'b0000000010000000 - CONFIGABCD_xxxx_xxx1_xxxx_xxxx_DIFF = 0x0100, //!< 16'b0000000100000000 - CONFIGABCD_xxxx_xx1x_xxxx_xxxx_BDAC0 = 0x0200, //!< 16'b0000001000000000 - CONFIGABCD_xxxx_x1xx_xxxx_xxxx_BDAC1 = 0x0400, //!< 16'b0000010000000000 - CONFIGABCD_xxxx_1xxx_xxxx_xxxx_BDAC2 = 0x0800, //!< 16'b0000100000000000 - CONFIGABCD_xxx1_xxxx_xxxx_xxxx_BDAC3 = 0x1000, //!< 16'b0001000000000000 - CONFIGABCD_xx1x_xxxx_xxxx_xxxx_RESERVED = 0x2000, //!< 16'b0010000000000000 - CONFIGABCD_x1xx_xxxx_xxxx_xxxx_RESERVED = 0x4000, //!< 16'b0100000000000000 - CONFIGABCD_1xxx_xxxx_xxxx_xxxx_RESERVED = 0x8000, //!< 16'b1000000000000000 - } MAX11043_CONFIGABCD_enum_t; - -// CODE GENERATOR: TypedefEnum MAX11043_BDAC_enum_t - //---------------------------------------- - /// CMD_0011_0000_d16_Wr_CONFIGa - /// CMD_0011_0100_d16_Wr_CONFIGb - /// CMD_0011_1000_d16_Wr_CONFIGc - /// CMD_0011_1100_d16_Wr_CONFIGd - /// CONFIGABCD_xxx1_xxxx_xxxx_xxxx_BDAC3 - /// CONFIGABCD_xxxx_1xxx_xxxx_xxxx_BDAC2 - /// CONFIGABCD_xxxx_x1xx_xxxx_xxxx_BDAC1 - /// CONFIGABCD_xxxx_xx1x_xxxx_xxxx_BDAC0 - /// Sets the input bias voltage for AC-coupled signals when ENBIAS_ is set to 1. - /// regAddr=0Ch - /// regAddr=0Dh - /// regAddr=0Eh - /// regAddr=0Fh - /// ConfigABCD: x x x BDAC[3:0] DIFF EQ MODG[1:0] PDPGA FILT PGAG ENBIASP ENBIASN - typedef enum MAX11043_BDAC_enum_t { - BDAC_0000_033pctAVDD = 0x00, //!< 8'b00000000 - BDAC_0001_035pctAVDD = 0x01, //!< 8'b00000001 - BDAC_0010_038pctAVDD = 0x02, //!< 8'b00000010 - BDAC_0011_040pctAVDD = 0x03, //!< 8'b00000011 - BDAC_0100_042pctAVDD = 0x04, //!< 8'b00000100 - BDAC_0101_044pctAVDD = 0x05, //!< 8'b00000101 - BDAC_0110_046pctAVDD = 0x06, //!< 8'b00000110 - BDAC_0111_048pctAVDD = 0x07, //!< 8'b00000111 - BDAC_1000_050pctAVDD = 0x08, //!< 8'b00001000 - BDAC_1001_052pctAVDD = 0x09, //!< 8'b00001001 - BDAC_1010_054pctAVDD = 0x0a, //!< 8'b00001010 - BDAC_1011_056pctAVDD = 0x0b, //!< 8'b00001011 - BDAC_1100_058pctAVDD = 0x0c, //!< 8'b00001100 - BDAC_1101_060pctAVDD = 0x0d, //!< 8'b00001101 - BDAC_1110_062pctAVDD = 0x0e, //!< 8'b00001110 - BDAC_1111_065pctAVDD = 0x0f, //!< 8'b00001111 - } MAX11043_BDAC_enum_t; - -// CODE GENERATOR: TypedefEnum MAX11043_REFERENCE_enum_t - //---------------------------------------- - /// CMD_0100_0000_d16_Wr_Reference - /// regAddr=10h - /// ReferenceDelay: 0 0 0 PURGE[4:0] EXTREF EXBUFA EXBUFB EXBUFC EXBUFD EXBUFDAC EXBUFDACH EXBUFDACL - typedef enum MAX11043_REFERENCE_enum_t { - REFERENCE_xxxx_xxxx_xxxx_xxx1_EXBUFDACL = 0x0001, //!< 16'b0000000000000001 - REFERENCE_xxxx_xxxx_xxxx_xx1x_EXBUFDACH = 0x0002, //!< 16'b0000000000000010 - REFERENCE_xxxx_xxxx_xxxx_x1xx_EXBUFDAC = 0x0004, //!< 16'b0000000000000100 - REFERENCE_xxxx_xxxx_xxxx_1xxx_EXBUFD = 0x0008, //!< 16'b0000000000001000 - REFERENCE_xxxx_xxxx_xxx1_xxxx_EXBUFC = 0x0010, //!< 16'b0000000000010000 - REFERENCE_xxxx_xxxx_xx1x_xxxx_EXBUFB = 0x0020, //!< 16'b0000000000100000 - REFERENCE_xxxx_xxxx_x1xx_xxxx_EXBUFA = 0x0040, //!< 16'b0000000001000000 - REFERENCE_xxxx_xxxx_1xxx_xxxx_EXTREF = 0x0080, //!< 16'b0000000010000000 - REFERENCE_xxxx_xxx1_xxxx_xxxx_PURGE0 = 0x0100, //!< 16'b0000000100000000 - REFERENCE_xxxx_xx1x_xxxx_xxxx_PURGE1 = 0x0200, //!< 16'b0000001000000000 - REFERENCE_xxxx_x1xx_xxxx_xxxx_PURGE2 = 0x0400, //!< 16'b0000010000000000 - REFERENCE_xxxx_1xxx_xxxx_xxxx_PURGE3 = 0x0800, //!< 16'b0000100000000000 - REFERENCE_xxx1_xxxx_xxxx_xxxx_PURGE4 = 0x1000, //!< 16'b0001000000000000 - REFERENCE_xx1x_xxxx_xxxx_xxxx_RESERVED = 0x2000, //!< 16'b0010000000000000 - REFERENCE_x1xx_xxxx_xxxx_xxxx_RESERVED = 0x4000, //!< 16'b0100000000000000 - REFERENCE_1xxx_xxxx_xxxx_xxxx_RESERVED = 0x8000, //!< 16'b1000000000000000 - } MAX11043_REFERENCE_enum_t; - -// TODO1: CODE GENERATOR: ic_variant -- IC's supported with this driver - /** - * @brief IC's supported with this driver - * @details MAX11043 - */ - typedef enum - { - MAX11043_IC = 0, - //MAX11043_IC = 1 - } MAX11043_ic_t; - -// TODO1: CODE GENERATOR: class constructor declaration - /**********************************************************//** - * @brief Constructor for MAX11043 Class. - * - * @details Requires an existing SPI object as well as a DigitalOut object. - * The DigitalOut object is used for a chip enable signal - * - * On Entry: - * @param[in] spi - pointer to existing SPI object - * @param[in] cs_pin - pointer to a DigitalOut pin object - * CODE GENERATOR: class constructor docstrings gpio InputPin pins - * @param[in] CONVRUN_pin - pointer to a DigitalOut pin object - * @param[in] SHDN_pin - pointer to a DigitalOut pin object - * @param[in] DACSTEP_pin - pointer to a DigitalOut pin object - * @param[in] UP_slash_DWNb_pin - pointer to a DigitalOut pin object - * CODE GENERATOR: class constructor docstrings gpio OutputPin pins - * @param[in] EOC_pin - pointer to a DigitalIn pin object - * @param[in] ic_variant - which type of MAX11043 is used - * - * On Exit: - * - * @return None - **************************************************************/ - MAX11043(SPI &spi, DigitalOut &cs_pin, // SPI interface - // CODE GENERATOR: class constructor declaration gpio InputPin pins - DigitalOut &CONVRUN_pin, // Digital Configuration Input to MAX11043 device - DigitalOut &SHDN_pin, // Digital Configuration Input to MAX11043 device - DigitalOut &DACSTEP_pin, // Digital Configuration Input to MAX11043 device - DigitalOut &UP_slash_DWNb_pin, // Digital Configuration Input to MAX11043 device - // CODE GENERATOR: class constructor declaration gpio OutputPin pins - DigitalIn &EOC_pin, // Digital Event Output from MAX11043 device - MAX11043_ic_t ic_variant); - -// CODE GENERATOR: class destructor declaration - /************************************************************ - * @brief Default destructor for MAX11043 Class. - * - * @details Destroys SPI object if owner - * - * On Entry: - * - * On Exit: - * - * @return None - **************************************************************/ - ~MAX11043(); - - // CODE GENERATOR: Declare SPI diagnostic function pointer void onSPIprint() - /// Function pointer void f(size_t byteCount, uint8_t mosiData[], uint8_t misoData[]) - Callback<void(size_t, uint8_t*, uint8_t*)> onSPIprint; //!< optional @ref onSPIprint SPI diagnostic function - - // CODE GENERATOR: spi_frequency setter declaration - /// set SPI SCLK frequency - void spi_frequency(int spi_sclk_Hz); - - // CODE GENERATOR: spi_frequency getter declaration and definition - /// get SPI SCLK frequency - int get_spi_frequency() const { return m_SPI_SCLK_Hz; } - - // CODE GENERATOR: spi_dataMode getter declaration and definition - /// get SPI mode - int get_spi_dataMode() const { return m_SPI_dataMode; } - -//---------------------------------------- -// CODE GENERATOR: omit typedef enum MAX11043_device_t, class members instead of global device object -public: - - /// TODO1: AC79 MAX11043 AIN0-AIN1 reference voltage, in Volts - double VRef_xxxxxx; - - /// TODO1: AC79 MAX11043 shadow of register ctrl CMD_r000_1001_dddd_dddd_CTRL - uint32_t ctrl; - - /// TODO1: AC79 MAX11043 read-only pga gain 1, 2, 4, 8, 16, 32, 64, or 128 set by Configure_PGA gain index register pga CMD_r000_1110_xxdd_xddd_PGA - uint8_t pgaGain; - - /// TODO1: AC79 MAX11043 shadow of register status CMD_r011_1000_dddd_dddd_dddd_dddd_dxxx_dddd_STATUS - uint32_t status; - - /// TODO1: AC79 MAX11043 shadow of register data0 CMD_r011_0000_dddd_dddd_dddd_dddd_dddd_dddd_DATA0 - uint32_t data0; - - /// TODO1: AC79 MAX11043 Each channel's most recent value in LSBs. - /// Updated by Measure_Voltage function. - /// Use VoltageOfCode function to convert LSBs to physical voltage. - /// (Valid index range AINP_SEL_0000_AIN0 to AINP_SEL_1010_AVDD) - /// - uint32_t AINcode[11]; - -// CODE GENERATOR: omit global g_MAX11043_device - -// CODE GENERATOR: extern function declarations -// CODE GENERATOR: extern function declaration SPIoutputCS -//---------------------------------------- -// Assert SPI Chip Select -// SPI chip-select for MAX11043 -// - void SPIoutputCS(int isLogicHigh); - -// CODE GENERATOR: extern function declaration SPIwrite16bits -//---------------------------------------- -// SPI write 16 bits -// SPI interface to MAX11043 shift 16 bits mosiData into MAX11043 DIN -// - void SPIwrite16bits(int16_t mosiData16); - -// CODE GENERATOR: extern function declaration SPIreadWrite16bits -//---------------------------------------- -// SPI read and write 16 bits -// SPI interface to MAX11043 shift 16 bits mosiData16 into MAX11043 DIN -// while simultaneously capturing 16 bits miso data from MAX11043 DOUT -// - int16_t SPIreadWrite16bits(int16_t mosiData16); - -// CODE GENERATOR: extern function declaration SPIreadWrite32bits -//---------------------------------------- -// SPI read and write 32 bits -// SPI interface to MAX11043 shift 32 bits mosiData into MAX11043 DIN -// while simultaneously capturing 32 bits miso data from MAX11043 DOUT -// - int32_t SPIreadWrite32bits(int32_t mosiData32); - -// CODE GENERATOR: extern function declaration SHDNoutputValue -//---------------------------------------- -// Assert MAX11043 SHDN pin : High = _____, Low = _____. -// - void SHDNoutputValue(int isLogicHigh); - -// CODE GENERATOR: extern function declaration CONVRUNoutputValue -//---------------------------------------- -// Assert MAX11043 CONVRUN pin : High = _____, Low = _____. -// - void CONVRUNoutputValue(int isLogicHigh); - -// CODE GENERATOR: extern function declaration DACSTEPoutputValue -//---------------------------------------- -// Assert MAX11043 DACSTEP pin : High = _____, Low = _____. -// - void DACSTEPoutputValue(int isLogicHigh); - -// CODE GENERATOR: extern function declaration UP_slash_DWNboutputValue -//---------------------------------------- -// Assert MAX11043 UP_slash_DWNb pin : High = _____, Low = _____. -// - void UP_slash_DWNboutputValue(int isLogicHigh); - -// CODE GENERATOR: extern function declaration EOCinputWaitUntilLow -//---------------------------------------- -// Wait for MAX11043 EOC pin low, indicating end of conversion. -// Required when using any of the InternalClock modes. -// - void EOCinputWaitUntilLow(); - -// CODE GENERATOR: extern function declaration EOCinputValue -//---------------------------------------- -// Return the status of the MAX11043 EOC pin. -// - int EOCinputValue(); - -// CODE GENERATOR: class member data -private: -// CODE GENERATOR: class member data for SPI interface - // SPI object - SPI &m_spi; - int m_SPI_SCLK_Hz; - int m_SPI_dataMode; - int m_SPI_cs_state; - - // Selector pin object - DigitalOut &m_cs_pin; - -// CODE GENERATOR: class member data for gpio InputPin pins -// InputPin Name = CONVRUN -// InputPin Description = CONVRUN (digital input). Convert Run. Drive high to start continuous conversions on all 4 channels. The device is idle when -// CONVRUN is low. -// InputPin Function = Configuration - DigitalOut &m_CONVRUN_pin; -// -// InputPin Name = SHDN -// InputPin Description = Shutdown (digital input). Active-High Shutdown Input. Drive high to shut down the MAX11043. -// InputPin Function = Configuration - DigitalOut &m_SHDN_pin; -// -// InputPin Name = DACSTEP -// InputPin Description = DACSTEP (digital input). DAC Step Input. Drive high to move the DAC output in the direction of UP/DWN on the next rising -// edge of the system clock. -// InputPin Function = Configuration - DigitalOut &m_DACSTEP_pin; -// -// InputPin Name = UP/DWN# -// InputPin Description = UP/DWN# (digital input). DAC Step Direction Select. Drive high to step up, drive low to step down when DACSTEP is toggled. -// InputPin Function = Configuration - DigitalOut &m_UP_slash_DWNb_pin; -// -// CODE GENERATOR: class member data for gpio OutputPin pins -// OutputPin Name = EOC -// OutputPin Description = End of Conversion Output. Active-Low End-of-Conversion Indicator. EOC asserts low to indicate that new data is ready. -// OutputPin Function = Event - DigitalIn &m_EOC_pin; -// - - // Identifies which IC variant is being used - MAX11043_ic_t m_ic_variant; - -public: - -// CODE GENERATOR: class member function declarations - //---------------------------------------- - /// Menu item '!' - /// Initialize device - /// @return 1 on success; 0 on failure - uint8_t Init(void); - -// CODE GENERATOR: looks like this is a register access function because 'regAdd' -// CODE GENERATOR: looks like this is a 'write' register access function -// CODE GENERATOR: looks like this is a register access function because 'regAdd' -// CODE GENERATOR: looks like this is a 'write' register access function: omit this function from test menu - //---------------------------------------- - /// Write a MAX11043 register. - /// - /// CMD_1aaa_aaaa_REGISTER_READ bit is cleared 0 indicating a write operation. - /// - /// MAX11043 register length can be determined by function RegSize. - /// - /// For 8-bit register size: - /// - /// SPI 16-bit transfer - /// - /// SPI MOSI = 0aaa_aaaa_dddd_dddd - /// - /// SPI MISO = xxxx_xxxx_xxxx_xxxx - /// - /// For 16-bit register size: - /// - /// SPI 24-bit or 32-bit transfer - /// - /// SPI MOSI = 0aaa_aaaa_dddd_dddd_dddd_dddd - /// - /// SPI MISO = xxxx_xxxx_xxxx_xxxx_xxxx_xxxx - /// - /// For 24-bit register size: - /// - /// SPI 32-bit transfer - /// - /// SPI MOSI = 0aaa_aaaa_dddd_dddd_dddd_dddd_dddd_dddd - /// - /// SPI MISO = xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx - /// - /// @return 1 on success; 0 on failure - uint8_t RegWrite(MAX11043_CMD_enum_t commandByte, uint32_t regData); - -// CODE GENERATOR: looks like this is a register access function because 'regAdd' -// CODE GENERATOR: looks like this is a 'read' register access function -// CODE GENERATOR: looks like this is a register access function because 'regAdd' -// CODE GENERATOR: looks like this is a 'read' register access function: omit this function from test menu - //---------------------------------------- - /// Read an 8-bit MAX11043 register - /// - /// CMD_1aaa_aaaa_REGISTER_READ bit is set 1 indicating a read operation. - /// - /// MAX11043 register length can be determined by function RegSize. - /// - /// For 8-bit register size: - /// - /// SPI 16-bit transfer - /// - /// SPI MOSI = 1aaa_aaaa_0000_0000 - /// - /// SPI MISO = xxxx_xxxx_dddd_dddd - /// - /// For 16-bit register size: - /// - /// SPI 24-bit or 32-bit transfer - /// - /// SPI MOSI = 1aaa_aaaa_0000_0000_0000_0000 - /// - /// SPI MISO = xxxx_xxxx_dddd_dddd_dddd_dddd - /// - /// For 24-bit register size: - /// - /// SPI 32-bit transfer - /// - /// SPI MOSI = 1aaa_aaaa_0000_0000_0000_0000_0000_0000 - /// - /// SPI MISO = xxxx_xxxx_dddd_dddd_dddd_dddd_dddd_dddd - /// - /// - /// @return 1 on success; 0 on failure - uint8_t RegRead(MAX11043_CMD_enum_t commandByte, uint32_t* ptrRegData); - -// CODE GENERATOR: looks like this is a register access function because 'regAdd' -// CODE GENERATOR: looks like this is a 'size' register access function - //---------------------------------------- - /// Return the size of a MAX11043 register - /// - /// @return 8 for 8-bit, 16 for 16-bit, 24 for 24-bit, else 0 for undefined register size - uint8_t RegSize(MAX11043_CMD_enum_t commandByte); - -// CODE GENERATOR: looks like this is a register access function because 'regAdd' - //---------------------------------------- - /// Return the address field of a MAX11043 register - /// - /// @return register address field as given in datasheet - uint8_t RegAddrOfCommand(MAX11043_CMD_enum_t commandByte); - -// CODE GENERATOR: looks like this is a register access function because 'regAdd' -// CODE GENERATOR: looks like this is a 'read' register access function - //---------------------------------------- - /// Test whether a command byte is a register read command - /// - /// @return true if command byte is a register read command - uint8_t IsRegReadCommand(MAX11043_CMD_enum_t commandByte); - -// CODE GENERATOR: looks like this is a register access function because 'regAdd' -// CODE GENERATOR: looks like this is a 'name' register access function - //---------------------------------------- - /// Return the name of a MAX11043 register - /// - /// @return null-terminated constant C string containing register name or empty string - const char* RegName(MAX11043_CMD_enum_t commandByte); - -}; // end of class MAX11043 - -#endif // __MAX11043_H__ - -// End of file +// /******************************************************************************* +// * Copyright (C) 2020 Maxim Integrated Products, Inc., All Rights Reserved. +// * +// * Permission is hereby granted, free of charge, to any person obtaining a +// * copy of this software and associated documentation files (the "Software"), +// * to deal in the Software without restriction, including without limitation +// * the rights to use, copy, modify, merge, publish, distribute, sublicense, +// * and/or sell copies of the Software, and to permit persons to whom the +// * Software is furnished to do so, subject to the following conditions: +// * +// * The above copyright notice and this permission notice shall be included +// * in all copies or substantial portions of the Software. +// * +// * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES +// * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// * OTHER DEALINGS IN THE SOFTWARE. +// * +// * Except as contained in this notice, the name of Maxim Integrated +// * Products, Inc. shall not be used except as stated in the Maxim Integrated +// * Products, Inc. Branding Policy. +// * +// * The mere transfer of this software does not imply any licenses +// * of trade secrets, proprietary technology, copyrights, patents, +// * trademarks, maskwork rights, or any other form of intellectual +// * property whatsoever. Maxim Integrated Products, Inc. retains all +// * ownership rights. +// ******************************************************************************* +// */ +// ********************************************************************* +// @file MAX11043.h +// ********************************************************************* +// Header file +// DO NOT EDIT; except areas designated "CUSTOMIZE". Automatically generated file. +// generated by XMLSystemOfDevicesToMBED.py +// System Name = ExampleSystem +// System Description = Device driver example +// Device Name = MAX11043 +// Device Description = 200ksps, Low-Power, Serial SPI 24-Bit, 4-Channel, Differential/Single-Ended Input, Simultaneous-Sampling SD ADC +// Device DeviceBriefDescription = 24-bit 200ksps Delta-Sigma ADC +// Device Manufacturer = Maxim Integrated +// Device PartNumber = MAX11043ATL+ +// Device RegValue_Width = DataWidth16bit_HL +// +// ADC MaxOutputDataRate = 200ksps +// ADC NumChannels = 4 +// ADC ResolutionBits = 24 +// +// SPI CS = ActiveLow +// SPI FrameStart = CS +// SPI CPOL = 0 +// SPI CPHA = 0 +// SPI MOSI and MISO Data are both stable on Rising edge of SCLK +// SPI SCLK Idle Low +// SPI SCLKMaxMHz = 40 +// SPI SCLKMinMHz = 0 +// + + +// Prevent multiple declaration +#ifndef __MAX11043_H__ +#define __MAX11043_H__ + +// standard include for target platform -- Platform_Include_Boilerplate +#include "mbed.h" +// Platforms: +// - MAX32625MBED +// - supports mbed-os-5.11, requires USBDevice library +// - add https://developer.mbed.org/teams/MaximIntegrated/code/USBDevice/ +// - remove max32630fthr library (if present) +// - remove MAX32620FTHR library (if present) +// - MAX32600MBED +// - remove max32630fthr library (if present) +// - remove MAX32620FTHR library (if present) +// - Windows 10 note: Don't connect HDK until you are ready to load new firmware into the board. +// - NUCLEO_F446RE +// - remove USBDevice library +// - remove max32630fthr library (if present) +// - remove MAX32620FTHR library (if present) +// - NUCLEO_F401RE +// - remove USBDevice library +// - remove max32630fthr library (if present) +// - remove MAX32620FTHR library (if present) +// - MAX32630FTHR +// - #include "max32630fthr.h" +// - add http://os.mbed.org/teams/MaximIntegrated/code/max32630fthr/ +// - remove MAX32620FTHR library (if present) +// - MAX32620FTHR +// - #include "MAX32620FTHR.h" +// - remove max32630fthr library (if present) +// - add https://os.mbed.com/teams/MaximIntegrated/code/MAX32620FTHR/ +// - not tested yet +// - MAX32625PICO +// - remove max32630fthr library (if present) +// - remove MAX32620FTHR library (if present) +// - not tested yet +// +// end Platform_Include_Boilerplate + +// CODE GENERATOR: conditional defines +// CODE GENERATOR: class declaration and docstrings +/** + * @brief MAX11043 200ksps, Low-Power, Serial SPI 24-Bit, 4-Channel, Differential/Single-Ended Input, Simultaneous-Sampling SD ADC + * + * + * + * Datasheet: https://www.maximintegrated.com/MAX11043 + * + * + * + * //---------- CODE GENERATOR: helloCppCodeList + * @code + * // CODE GENERATOR: example code includes + * + * // example code includes + * // standard include for target platform -- Platform_Include_Boilerplate + * #include "mbed.h" + * // Platforms: + * // - MAX32625MBED + * // - supports mbed-os-5.11, requires USBDevice library + * // - add https://developer.mbed.org/teams/MaximIntegrated/code/USBDevice/ + * // - remove max32630fthr library (if present) + * // - remove MAX32620FTHR library (if present) + * // - MAX32600MBED + * // - remove max32630fthr library (if present) + * // - remove MAX32620FTHR library (if present) + * // - Windows 10 note: Don't connect HDK until you are ready to load new firmware into the board. + * // - NUCLEO_F446RE + * // - remove USBDevice library + * // - remove max32630fthr library (if present) + * // - remove MAX32620FTHR library (if present) + * // - NUCLEO_F401RE + * // - remove USBDevice library + * // - remove max32630fthr library (if present) + * // - remove MAX32620FTHR library (if present) + * // - MAX32630FTHR + * // - #include "max32630fthr.h" + * // - add http://os.mbed.org/teams/MaximIntegrated/code/max32630fthr/ + * // - remove MAX32620FTHR library (if present) + * // - MAX32620FTHR + * // - #include "MAX32620FTHR.h" + * // - remove max32630fthr library (if present) + * // - add https://os.mbed.com/teams/MaximIntegrated/code/MAX32620FTHR/ + * // - not tested yet + * // - MAX32625PICO + * // - remove max32630fthr library (if present) + * // - remove MAX32620FTHR library (if present) + * // - not tested yet + * // + * // end Platform_Include_Boilerplate + * #include "MAX11043.h" + * + * // example code board support + * //MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3); + * //DigitalOut rLED(LED1); + * //DigitalOut gLED(LED2); + * //DigitalOut bLED(LED3); + * // + * // Arduino "shield" connector port definitions (MAX32625MBED shown) + * #if defined(TARGET_MAX32625MBED) + * #define A0 AIN_0 + * #define A1 AIN_1 + * #define A2 AIN_2 + * #define A3 AIN_3 + * #define D0 P0_0 + * #define D1 P0_1 + * #define D2 P0_2 + * #define D3 P0_3 + * #define D4 P0_4 + * #define D5 P0_5 + * #define D6 P0_6 + * #define D7 P0_7 + * #define D8 P1_4 + * #define D9 P1_5 + * #define D10 P1_3 + * #define D11 P1_1 + * #define D12 P1_2 + * #define D13 P1_0 + * #endif + * + * // example code declare SPI interface + * #if defined(TARGET_MAX32625MBED) + * SPI spi(SPI1_MOSI, SPI1_MISO, SPI1_SCK); // mosi, miso, sclk spi1 TARGET_MAX32625MBED: P1_1 P1_2 P1_0 Arduino 10-pin header D11 D12 D13 + * DigitalOut spi_cs(SPI1_SS); // TARGET_MAX32625MBED: P1_3 Arduino 10-pin header D10 + * #elif defined(TARGET_MAX32600MBED) + * SPI spi(SPI2_MOSI, SPI2_MISO, SPI2_SCK); // mosi, miso, sclk spi1 TARGET_MAX32600MBED: Arduino 10-pin header D11 D12 D13 + * DigitalOut spi_cs(SPI2_SS); // Generic: Arduino 10-pin header D10 + * #else + * SPI spi(D11, D12, D13); // mosi, miso, sclk spi1 TARGET_MAX32600MBED: Arduino 10-pin header D11 D12 D13 + * DigitalOut spi_cs(D10); // Generic: Arduino 10-pin header D10 + * #endif + * + * // example code declare GPIO interface pins + * DigitalOut CONVRUN_pin(D9); // Digital Configuration Input to MAX11043 device + * DigitalOut SHDN_pin(D8); // Digital Configuration Input to MAX11043 device + * DigitalOut DACSTEP_pin(D7); // Digital Configuration Input to MAX11043 device + * DigitalOut UP_slash_DWNb_pin(D6); // Digital Configuration Input to MAX11043 device + * DigitalIn EOC_pin(D2); // Digital Event Output from MAX11043 device + * // example code declare device instance + * MAX11043 g_MAX11043_device(spi, spi_cs, CONVRUN_pin, SHDN_pin, DACSTEP_pin, UP_slash_DWNb_pin, EOC_pin, MAX11043::MAX11043_IC); + * + * // CODE GENERATOR: example code for ADC: serial port declaration + * //-------------------------------------------------- + * // Declare the Serial driver + * // default baud rate settings are 9600 8N1 + * // install device driver from http://developer.mbed.org/media/downloads/drivers/mbedWinSerial_16466.exe + * // see docs https://docs.mbed.com/docs/mbed-os-handbook/en/5.5/getting_started/what_need/ + * #if defined(TARGET_MAX32630) + * #include "USBSerial.h" + * // Hardware serial port over DAPLink + * // The default baud rate for the DapLink UART is 9600 + * //Serial DAPLINKserial(P2_1, P2_0); // tx, rx + * // #define HAS_DAPLINK_SERIAL 1 + * // Virtual serial port over USB + * // The baud rate does not affect the virtual USBSerial UART. + * USBSerial serial; + * //-------------------------------------------------- + * #elif defined(TARGET_MAX32625MBED) + * #include "USBSerial.h" + * // Hardware serial port over DAPLink + * // The default baud rate for the DapLink UART is 9600 + * //Serial DAPLINKserial(P2_1, P2_0); // tx, rx + * // #define HAS_DAPLINK_SERIAL 1 + * // Virtual serial port over USB + * // The baud rate does not affect the virtual USBSerial UART. + * USBSerial serial; + * //-------------------------------------------------- + * #elif defined(TARGET_MAX32600) + * #include "USBSerial.h" + * // Hardware serial port over DAPLink + * // The default baud rate for the DapLink UART is 9600 + * Serial DAPLINKserial(P1_1, P1_0); // tx, rx + * #define HAS_DAPLINK_SERIAL 1 + * // Virtual serial port over USB + * // The baud rate does not affect the virtual USBSerial UART. + * USBSerial serial; + * //-------------------------------------------------- + * #elif defined(TARGET_NUCLEO_F446RE) || defined(TARGET_NUCLEO_F401RE) + * Serial serial(SERIAL_TX, SERIAL_RX); // tx, rx + * //-------------------------------------------------- + * #else + * #if defined(SERIAL_TX) + * #warning "target not previously tested; guess serial pins are SERIAL_TX, SERIAL_RX..." + * Serial serial(SERIAL_TX, SERIAL_RX); // tx, rx + * #elif defined(USBTX) + * #warning "target not previously tested; guess serial pins are USBTX, USBRX..." + * Serial serial(USBTX, USBRX); // tx, rx + * #elif defined(UART_TX) + * #warning "target not previously tested; guess serial pins are UART_TX, UART_RX..." + * Serial serial(UART_TX, UART_RX); // tx, rx + * #else + * #warning "target not previously tested; need to define serial pins..." + * #endif + * #endif + * // + * #include "CmdLine.h" + * CmdLine cmdLine(serial, "serial"); + * + * // example code main function + * int main() + * { + * // CODE GENERATOR: example code: member function Init + * g_MAX11043_device.Init(); + * + * while (1) + * { + * // CODE GENERATOR: example code: has no member function REF + * // CODE GENERATOR: example code for ADC: repeat-forever convert and print conversion result, one record per line + * // CODE GENERATOR: ResolutionBits = 24 + * // CODE GENERATOR: FScode = None + * // CODE GENERATOR: NumChannels = 4 + * while(1) { // this code repeats forever + * // this code repeats forever + * // CODE GENERATOR: example code: has no member function ScanStandardExternalClock + * // CODE GENERATOR: example code: has no member function ReadAINcode + * // wait(3.0); + * // CODE GENERATOR: print conversion result + * // Use Arduino Serial Plotter to view output: Tools | Serial Plotter + * cmdLine.serial().printf("%d", g_MAX11043_device.AINcode[0]); + * for (int index = 1; index <= channelId_0_3; index++) { + * cmdLine.serial().printf(",%d", g_MAX11043_device.AINcode[index]); + * } + * cmdLine.serial().printf("\r\n"); + * + * } // this code repeats forever + * } + * } + * @endcode + * //---------- CODE GENERATOR: end helloCppCodeList + */ +class MAX11043 { +public: +// CODE GENERATOR: TypedefEnum EnumItem declarations +// CODE GENERATOR: TypedefEnum MAX11043_CMD_enum_t + //---------------------------------------- + /// Register Addresses + /// + /// Naming convention is CMD_bitstream_WrAddr_FunctionName + /// - first byte format is 0aaa_aar0 + /// - 0 = bitstream required 0 bit + /// - aaa_aa = bitstream 5-bit register address field + /// - r = bitstream read/write bit (1=read, 0=write) + /// - WrAddr = Write operation to address Addr + /// - RdAddr = Read operation from address Addr + /// - d8 = 8-bit register data field + /// - d16 = 16-bit register data field + /// - d24 = 24-bit register data field + /// - d32 = 32-bit register data field + /// - x = don't care + typedef enum MAX11043_CMD_enum_t { + CMD_0aaa_aa00_WrAddr_WriteAnyRegister = 0x00, //!< 8'b00000000 + CMD_0000_0010_d24_Rd00_ADCa = 0x02, //!< 8'b00000010 + CMD_0000_0110_d24_Rd01_ADCb = 0x06, //!< 8'b00000110 + CMD_0000_1010_d24_Rd02_ADCc = 0x0a, //!< 8'b00001010 + CMD_0000_1110_d24_Rd03_ADCd = 0x0e, //!< 8'b00001110 + CMD_0001_0010_d24_d24_Rd04_ADCab = 0x12, //!< 8'b00010010 + CMD_0001_0110_d24_d24_Rd05_ADCcd = 0x16, //!< 8'b00010110 + CMD_0001_1010_d24_d24_d24_d24_Rd06_ADCabcd = 0x1a, //!< 8'b00011010 + CMD_0001_1110_d8_Rd07_Status = 0x1e, //!< 8'b00011110 + CMD_0010_0000_d16_Wr08_Configuration = 0x20, //!< 8'b00100000 + CMD_0010_0010_d16_Rd08_Configuration = 0x22, //!< 8'b00100010 + CMD_0010_0100_d16_Wr09_DAC = 0x24, //!< 8'b00100100 + CMD_0010_0110_d16_Rd09_DAC = 0x26, //!< 8'b00100110 + CMD_0010_1000_d16_Wr0A_DACStep = 0x28, //!< 8'b00101000 + CMD_0010_1010_d16_Rd0A_DACStep = 0x2a, //!< 8'b00101010 + CMD_0010_1100_d16_Wr0B_DACHDACL = 0x2c, //!< 8'b00101100 + CMD_0010_1110_d16_Rd0B_DACHDACL = 0x2e, //!< 8'b00101110 + CMD_0011_0000_d16_Wr0C_ConfigA = 0x30, //!< 8'b00110000 + CMD_0011_0010_d16_Rd0C_ConfigA = 0x32, //!< 8'b00110010 + CMD_0011_0100_d16_Wr0D_ConfigB = 0x34, //!< 8'b00110100 + CMD_0011_0110_d16_Rd0D_ConfigB = 0x36, //!< 8'b00110110 + CMD_0011_1000_d16_Wr0E_ConfigC = 0x38, //!< 8'b00111000 + CMD_0011_1010_d16_Rd0E_ConfigC = 0x3a, //!< 8'b00111010 + CMD_0011_1100_d16_Wr0F_ConfigD = 0x3c, //!< 8'b00111100 + CMD_0011_1110_d16_Rd0F_ConfigD = 0x3e, //!< 8'b00111110 + CMD_0100_0000_d16_Wr10_Reference = 0x40, //!< 8'b01000000 + CMD_0100_0010_d16_Rd10_Reference = 0x42, //!< 8'b01000010 + CMD_0100_0100_d16_Wr11_AGain = 0x44, //!< 8'b01000100 + CMD_0100_0110_d16_Rd11_AGain = 0x46, //!< 8'b01000110 + CMD_0100_1000_d16_Wr12_BGain = 0x48, //!< 8'b01001000 + CMD_0100_1010_d16_Rd12_BGain = 0x4a, //!< 8'b01001010 + CMD_0100_1100_d16_Wr13_CGain = 0x4c, //!< 8'b01001100 + CMD_0100_1110_d16_Rd13_CGain = 0x4e, //!< 8'b01001110 + CMD_0101_0000_d16_Wr14_DGain = 0x50, //!< 8'b01010000 + CMD_0101_0010_d16_Rd14_DGain = 0x52, //!< 8'b01010010 + CMD_0101_0100_d8_Wr15_FilterCAddress = 0x54, //!< 8'b01010100 + CMD_0101_0110_d8_Rd15_FilterCAddress = 0x56, //!< 8'b01010110 + CMD_0101_1000_d32_Wr16_FilterCDataOut = 0x58, //!< 8'b01011000 + CMD_0101_1010_d32_Rd16_FilterCDataOut = 0x5a, //!< 8'b01011010 + CMD_0101_1100_d32_Wr17_FilterCDataIn = 0x5c, //!< 8'b01011100 + CMD_0101_1110_d32_Rd17_FilterCDataIn = 0x5e, //!< 8'b01011110 + CMD_0110_0000_d8_Wr18_FlashMode = 0x60, //!< 8'b01100000 + CMD_0110_0010_d8_Rd18_FlashMode = 0x62, //!< 8'b01100010 + CMD_0110_0100_d16_Wr19_FlashAddr = 0x64, //!< 8'b01100100 + CMD_0110_0110_d16_Rd19_FlashAddr = 0x66, //!< 8'b01100110 + CMD_0110_1000_d16_Wr1A_FlashDataIn = 0x68, //!< 8'b01101000 + CMD_0110_1010_d16_Rd1A_FlashDataIn = 0x6a, //!< 8'b01101010 + CMD_0110_1110_d16_Rd1B_FlashDataOut = 0x6e, //!< 8'b01101110 + CMD_0aaa_aa10_RdAddr_ReadAnyRegister = 0x80, //!< 8'b10000000 + CMD_1111_1111_NoOperationMOSIidleHigh = 0xff, //!< 8'b11111111 + } MAX11043_CMD_enum_t; + +// CODE GENERATOR: TypedefEnum MAX11043_STATUS_enum_t + //---------------------------------------- + /// CMD_0001_1110_d8_Rd_Status + /// regAddr=07h + /// Status: x x FlashBusy BOOT OFLGA OFLGB OFLGC OFLGD + typedef enum MAX11043_STATUS_enum_t { + STATUS_xxxx_xxx1_OverflowFlagOFLGD = 0x01, //!< 8'b00000001 + STATUS_xxxx_xx1x_OverflowFlagOFLGC = 0x02, //!< 8'b00000010 + STATUS_xxxx_x1xx_OverflowFlagOFLGB = 0x04, //!< 8'b00000100 + STATUS_xxxx_1xxx_OverflowFlagOFLGA = 0x08, //!< 8'b00001000 + STATUS_xxx1_xxxx_PowerOnResetBOOT = 0x10, //!< 8'b00010000 + STATUS_xx1x_xxxx_FlashBusy = 0x20, //!< 8'b00100000 + STATUS_x1xx_xxxx_RESERVED = 0x40, //!< 8'b01000000 + STATUS_1xxx_xxxx_RESERVED = 0x80, //!< 8'b10000000 + } MAX11043_STATUS_enum_t; + +// CODE GENERATOR: TypedefEnum MAX11043_CONFIG_enum_t + //---------------------------------------- + /// CMD_0010_0000_d16_Wr_Configuration + /// regAddr=08h + /// Config: EXTCLK CLKDIV1 CLKDIV0 PD PDA PDB PDC PDD PDDAC PDOSC 24BIT SCHANA SCHANB SCHANC SCHAND DECSEL + typedef enum MAX11043_CONFIG_enum_t { + CONFIG_xxxx_xxxx_xxxx_xxx1_DECSEL12 = 0x0001, //!< 16'b0000000000000001 + CONFIG_xxxx_xxxx_xxxx_xx1x_SCHAND = 0x0002, //!< 16'b0000000000000010 + CONFIG_xxxx_xxxx_xxxx_x1xx_SCHANC = 0x0004, //!< 16'b0000000000000100 + CONFIG_xxxx_xxxx_xxxx_1xxx_SCHANB = 0x0008, //!< 16'b0000000000001000 + CONFIG_xxxx_xxxx_xxx1_xxxx_SCHANA = 0x0010, //!< 16'b0000000000010000 + CONFIG_xxxx_xxxx_xx1x_xxxx_24BIT = 0x0020, //!< 16'b0000000000100000 + CONFIG_xxxx_xxxx_x1xx_xxxx_PDOSC = 0x0040, //!< 16'b0000000001000000 + CONFIG_xxxx_xxxx_1xxx_xxxx_PDDAC = 0x0080, //!< 16'b0000000010000000 + CONFIG_xxxx_xxx1_xxxx_xxxx_PDD = 0x0100, //!< 16'b0000000100000000 + CONFIG_xxxx_xx1x_xxxx_xxxx_PDC = 0x0200, //!< 16'b0000001000000000 + CONFIG_xxxx_x1xx_xxxx_xxxx_PDB = 0x0400, //!< 16'b0000010000000000 + CONFIG_xxxx_1xxx_xxxx_xxxx_PDA = 0x0800, //!< 16'b0000100000000000 + CONFIG_xxx1_xxxx_xxxx_xxxx_PD = 0x1000, //!< 16'b0001000000000000 + CONFIG_xx1x_xxxx_xxxx_xxxx_CLKDIV0 = 0x2000, //!< 16'b0010000000000000 + CONFIG_x1xx_xxxx_xxxx_xxxx_CLKDIV1 = 0x4000, //!< 16'b0100000000000000 + CONFIG_1xxx_xxxx_xxxx_xxxx_EXTCLK = 0x8000, //!< 16'b1000000000000000 + } MAX11043_CONFIG_enum_t; +// CODE GENERATOR: TypedefEnum MAX11043_CONFIGABCD_enum_t + //---------------------------------------- + /// CMD_0011_0000_d16_Wr_CONFIGa + /// CMD_0011_0100_d16_Wr_CONFIGb + /// CMD_0011_1000_d16_Wr_CONFIGc + /// CMD_0011_1100_d16_Wr_CONFIGd + /// regAddr=0Ch + /// regAddr=0Dh + /// regAddr=0Eh + /// regAddr=0Fh + /// ConfigABCD: x x x BDAC[3:0] DIFF EQ MODG[1:0] PDPGA FILT PGAG ENBIASP ENBIASN + typedef enum MAX11043_CONFIGABCD_enum_t { + CONFIGABCD_xxxx_xxxx_xxxx_xxx1_ENBIASN = 0x0001, //!< 16'b0000000000000001 + CONFIGABCD_xxxx_xxxx_xxxx_xx1x_ENBIASP = 0x0002, //!< 16'b0000000000000010 + CONFIGABCD_xxxx_xxxx_xxxx_x1xx_PGAG16 = 0x0004, //!< 16'b0000000000000100 + CONFIGABCD_xxxx_xxxx_xxxx_1xxx_FILTLP = 0x0008, //!< 16'b0000000000001000 + CONFIGABCD_xxxx_xxxx_xxx1_xxxx_PDPGA = 0x0010, //!< 16'b0000000000010000 + CONFIGABCD_xxxx_xxxx_xx1x_xxxx_MODG0 = 0x0020, //!< 16'b0000000000100000 + CONFIGABCD_xxxx_xxxx_x1xx_xxxx_MODG1 = 0x0040, //!< 16'b0000000001000000 + CONFIGABCD_xxxx_xxxx_1xxx_xxxx_EQ = 0x0080, //!< 16'b0000000010000000 + CONFIGABCD_xxxx_xxx1_xxxx_xxxx_DIFF = 0x0100, //!< 16'b0000000100000000 + CONFIGABCD_xxxx_xx1x_xxxx_xxxx_BDAC0 = 0x0200, //!< 16'b0000001000000000 + CONFIGABCD_xxxx_x1xx_xxxx_xxxx_BDAC1 = 0x0400, //!< 16'b0000010000000000 + CONFIGABCD_xxxx_1xxx_xxxx_xxxx_BDAC2 = 0x0800, //!< 16'b0000100000000000 + CONFIGABCD_xxx1_xxxx_xxxx_xxxx_BDAC3 = 0x1000, //!< 16'b0001000000000000 + CONFIGABCD_xx1x_xxxx_xxxx_xxxx_RESERVED = 0x2000, //!< 16'b0010000000000000 + CONFIGABCD_x1xx_xxxx_xxxx_xxxx_RESERVED = 0x4000, //!< 16'b0100000000000000 + CONFIGABCD_1xxx_xxxx_xxxx_xxxx_RESERVED = 0x8000, //!< 16'b1000000000000000 + } MAX11043_CONFIGABCD_enum_t; + +// CODE GENERATOR: TypedefEnum MAX11043_BDAC_enum_t + //---------------------------------------- + /// CMD_0011_0000_d16_Wr_CONFIGa + /// CMD_0011_0100_d16_Wr_CONFIGb + /// CMD_0011_1000_d16_Wr_CONFIGc + /// CMD_0011_1100_d16_Wr_CONFIGd + /// CONFIGABCD_xxx1_xxxx_xxxx_xxxx_BDAC3 + /// CONFIGABCD_xxxx_1xxx_xxxx_xxxx_BDAC2 + /// CONFIGABCD_xxxx_x1xx_xxxx_xxxx_BDAC1 + /// CONFIGABCD_xxxx_xx1x_xxxx_xxxx_BDAC0 + /// Sets the input bias voltage for AC-coupled signals when ENBIAS_ is set to 1. + /// regAddr=0Ch + /// regAddr=0Dh + /// regAddr=0Eh + /// regAddr=0Fh + /// ConfigABCD: x x x BDAC[3:0] DIFF EQ MODG[1:0] PDPGA FILT PGAG ENBIASP ENBIASN + typedef enum MAX11043_BDAC_enum_t { + BDAC_0000_033pctAVDD = 0x00, //!< 8'b00000000 + BDAC_0001_035pctAVDD = 0x01, //!< 8'b00000001 + BDAC_0010_038pctAVDD = 0x02, //!< 8'b00000010 + BDAC_0011_040pctAVDD = 0x03, //!< 8'b00000011 + BDAC_0100_042pctAVDD = 0x04, //!< 8'b00000100 + BDAC_0101_044pctAVDD = 0x05, //!< 8'b00000101 + BDAC_0110_046pctAVDD = 0x06, //!< 8'b00000110 + BDAC_0111_048pctAVDD = 0x07, //!< 8'b00000111 + BDAC_1000_050pctAVDD = 0x08, //!< 8'b00001000 + BDAC_1001_052pctAVDD = 0x09, //!< 8'b00001001 + BDAC_1010_054pctAVDD = 0x0a, //!< 8'b00001010 + BDAC_1011_056pctAVDD = 0x0b, //!< 8'b00001011 + BDAC_1100_058pctAVDD = 0x0c, //!< 8'b00001100 + BDAC_1101_060pctAVDD = 0x0d, //!< 8'b00001101 + BDAC_1110_062pctAVDD = 0x0e, //!< 8'b00001110 + BDAC_1111_065pctAVDD = 0x0f, //!< 8'b00001111 + } MAX11043_BDAC_enum_t; + +// CODE GENERATOR: TypedefEnum MAX11043_REFERENCE_enum_t + //---------------------------------------- + /// CMD_0100_0000_d16_Wr_Reference + /// regAddr=10h + /// ReferenceDelay: 0 0 0 PURGE[4:0] EXTREF EXBUFA EXBUFB EXBUFC EXBUFD EXBUFDAC EXBUFDACH EXBUFDACL + typedef enum MAX11043_REFERENCE_enum_t { + REFERENCE_xxxx_xxxx_xxxx_xxx1_EXBUFDACL = 0x0001, //!< 16'b0000000000000001 + REFERENCE_xxxx_xxxx_xxxx_xx1x_EXBUFDACH = 0x0002, //!< 16'b0000000000000010 + REFERENCE_xxxx_xxxx_xxxx_x1xx_EXBUFDAC = 0x0004, //!< 16'b0000000000000100 + REFERENCE_xxxx_xxxx_xxxx_1xxx_EXBUFD = 0x0008, //!< 16'b0000000000001000 + REFERENCE_xxxx_xxxx_xxx1_xxxx_EXBUFC = 0x0010, //!< 16'b0000000000010000 + REFERENCE_xxxx_xxxx_xx1x_xxxx_EXBUFB = 0x0020, //!< 16'b0000000000100000 + REFERENCE_xxxx_xxxx_x1xx_xxxx_EXBUFA = 0x0040, //!< 16'b0000000001000000 + REFERENCE_xxxx_xxxx_1xxx_xxxx_EXTREF = 0x0080, //!< 16'b0000000010000000 + REFERENCE_xxxx_xxx1_xxxx_xxxx_PURGE0 = 0x0100, //!< 16'b0000000100000000 + REFERENCE_xxxx_xx1x_xxxx_xxxx_PURGE1 = 0x0200, //!< 16'b0000001000000000 + REFERENCE_xxxx_x1xx_xxxx_xxxx_PURGE2 = 0x0400, //!< 16'b0000010000000000 + REFERENCE_xxxx_1xxx_xxxx_xxxx_PURGE3 = 0x0800, //!< 16'b0000100000000000 + REFERENCE_xxx1_xxxx_xxxx_xxxx_PURGE4 = 0x1000, //!< 16'b0001000000000000 + REFERENCE_xx1x_xxxx_xxxx_xxxx_RESERVED = 0x2000, //!< 16'b0010000000000000 + REFERENCE_x1xx_xxxx_xxxx_xxxx_RESERVED = 0x4000, //!< 16'b0100000000000000 + REFERENCE_1xxx_xxxx_xxxx_xxxx_RESERVED = 0x8000, //!< 16'b1000000000000000 + } MAX11043_REFERENCE_enum_t; + +// TODO1: CODE GENERATOR: ic_variant -- IC's supported with this driver + /** + * @brief IC's supported with this driver + * @details MAX11043 + */ + typedef enum + { + MAX11043_IC = 0, + //MAX11043_IC = 1 + } MAX11043_ic_t; + +// TODO1: CODE GENERATOR: class constructor declaration + /**********************************************************//** + * @brief Constructor for MAX11043 Class. + * + * @details Requires an existing SPI object as well as a DigitalOut object. + * The DigitalOut object is used for a chip enable signal + * + * On Entry: + * @param[in] spi - pointer to existing SPI object + * @param[in] cs_pin - pointer to a DigitalOut pin object + * CODE GENERATOR: class constructor docstrings gpio InputPin pins + * @param[in] CONVRUN_pin - pointer to a DigitalOut pin object + * @param[in] SHDN_pin - pointer to a DigitalOut pin object + * @param[in] DACSTEP_pin - pointer to a DigitalOut pin object + * @param[in] UP_slash_DWNb_pin - pointer to a DigitalOut pin object + * CODE GENERATOR: class constructor docstrings gpio OutputPin pins + * @param[in] EOC_pin - pointer to a DigitalIn pin object + * @param[in] ic_variant - which type of MAX11043 is used + * + * On Exit: + * + * @return None + **************************************************************/ + MAX11043(SPI &spi, DigitalOut &cs_pin, // SPI interface + // CODE GENERATOR: class constructor declaration gpio InputPin pins + DigitalOut &CONVRUN_pin, // Digital Configuration Input to MAX11043 device + DigitalOut &SHDN_pin, // Digital Configuration Input to MAX11043 device + DigitalOut &DACSTEP_pin, // Digital Configuration Input to MAX11043 device + DigitalOut &UP_slash_DWNb_pin, // Digital Configuration Input to MAX11043 device + // CODE GENERATOR: class constructor declaration gpio OutputPin pins + DigitalIn &EOC_pin, // Digital Event Output from MAX11043 device + MAX11043_ic_t ic_variant); + +// CODE GENERATOR: class destructor declaration + /************************************************************ + * @brief Default destructor for MAX11043 Class. + * + * @details Destroys SPI object if owner + * + * On Entry: + * + * On Exit: + * + * @return None + **************************************************************/ + ~MAX11043(); + + // CODE GENERATOR: Declare SPI diagnostic function pointer void onSPIprint() + /// Function pointer void f(size_t byteCount, uint8_t mosiData[], uint8_t misoData[]) + Callback<void(size_t, uint8_t*, uint8_t*)> onSPIprint; //!< optional @ref onSPIprint SPI diagnostic function + + // CODE GENERATOR: spi_frequency setter declaration + /// set SPI SCLK frequency + void spi_frequency(int spi_sclk_Hz); + + // CODE GENERATOR: spi_frequency getter declaration and definition + /// get SPI SCLK frequency + int get_spi_frequency() const { return m_SPI_SCLK_Hz; } + + // CODE GENERATOR: spi_dataMode getter declaration and definition + /// get SPI mode + int get_spi_dataMode() const { return m_SPI_dataMode; } + +//---------------------------------------- +// CODE GENERATOR: omit typedef enum MAX11043_device_t, class members instead of global device object +public: + + /// TODO1: AC79 MAX11043 AIN0-AIN1 reference voltage, in Volts + double VRef_xxxxxx; + + /// TODO1: AC79 MAX11043 shadow of register ctrl CMD_r000_1001_dddd_dddd_CTRL + uint32_t ctrl; + + /// TODO1: AC79 MAX11043 read-only pga gain 1, 2, 4, 8, 16, 32, 64, or 128 set by Configure_PGA gain index register pga CMD_r000_1110_xxdd_xddd_PGA + uint8_t pgaGain; + + /// TODO1: AC79 MAX11043 shadow of register status CMD_r011_1000_dddd_dddd_dddd_dddd_dxxx_dddd_STATUS + uint32_t status; + + /// TODO1: AC79 MAX11043 shadow of register data0 CMD_r011_0000_dddd_dddd_dddd_dddd_dddd_dddd_DATA0 + uint32_t data0; + + /// TODO1: AC79 MAX11043 Each channel's most recent value in LSBs. + /// Updated by Measure_Voltage function. + /// Use VoltageOfCode function to convert LSBs to physical voltage. + /// (Valid index range AINP_SEL_0000_AIN0 to AINP_SEL_1010_AVDD) + /// + uint32_t AINcode[11]; + +// CODE GENERATOR: omit global g_MAX11043_device + +// CODE GENERATOR: extern function declarations +// CODE GENERATOR: extern function declaration SPIoutputCS +//---------------------------------------- +// Assert SPI Chip Select +// SPI chip-select for MAX11043 +// + void SPIoutputCS(int isLogicHigh); + +// CODE GENERATOR: extern function declaration SPIwrite16bits +//---------------------------------------- +// SPI write 16 bits +// SPI interface to MAX11043 shift 16 bits mosiData into MAX11043 DIN +// + void SPIwrite16bits(int16_t mosiData16); + +// CODE GENERATOR: extern function declaration SPIreadWrite16bits +//---------------------------------------- +// SPI read and write 16 bits +// SPI interface to MAX11043 shift 16 bits mosiData16 into MAX11043 DIN +// while simultaneously capturing 16 bits miso data from MAX11043 DOUT +// + int16_t SPIreadWrite16bits(int16_t mosiData16); + +// CODE GENERATOR: extern function declaration SPIreadWrite32bits +//---------------------------------------- +// SPI read and write 32 bits +// SPI interface to MAX11043 shift 32 bits mosiData into MAX11043 DIN +// while simultaneously capturing 32 bits miso data from MAX11043 DOUT +// + int32_t SPIreadWrite32bits(int32_t mosiData32); + +// CODE GENERATOR: extern function declaration SHDNoutputValue +//---------------------------------------- +// Assert MAX11043 SHDN pin : High = _____, Low = _____. +// + void SHDNoutputValue(int isLogicHigh); + +// CODE GENERATOR: extern function declaration CONVRUNoutputValue +//---------------------------------------- +// Assert MAX11043 CONVRUN pin : High = _____, Low = _____. +// + void CONVRUNoutputValue(int isLogicHigh); + +// CODE GENERATOR: extern function declaration DACSTEPoutputValue +//---------------------------------------- +// Assert MAX11043 DACSTEP pin : High = _____, Low = _____. +// + void DACSTEPoutputValue(int isLogicHigh); + +// CODE GENERATOR: extern function declaration UP_slash_DWNboutputValue +//---------------------------------------- +// Assert MAX11043 UP_slash_DWNb pin : High = _____, Low = _____. +// + void UP_slash_DWNboutputValue(int isLogicHigh); + +// CODE GENERATOR: extern function declaration EOCinputWaitUntilLow +//---------------------------------------- +// Wait for MAX11043 EOC pin low, indicating end of conversion. +// Required when using any of the InternalClock modes. +// + void EOCinputWaitUntilLow(); + +// CODE GENERATOR: extern function declaration EOCinputValue +//---------------------------------------- +// Return the status of the MAX11043 EOC pin. +// + int EOCinputValue(); + +// CODE GENERATOR: class member data +private: +// CODE GENERATOR: class member data for SPI interface + // SPI object + SPI &m_spi; + int m_SPI_SCLK_Hz; + int m_SPI_dataMode; + int m_SPI_cs_state; + + // Selector pin object + DigitalOut &m_cs_pin; + +// CODE GENERATOR: class member data for gpio InputPin pins +// InputPin Name = CONVRUN +// InputPin Description = CONVRUN (digital input). Convert Run. Drive high to start continuous conversions on all 4 channels. The device is idle when +// CONVRUN is low. +// InputPin Function = Configuration + DigitalOut &m_CONVRUN_pin; +// +// InputPin Name = SHDN +// InputPin Description = Shutdown (digital input). Active-High Shutdown Input. Drive high to shut down the MAX11043. +// InputPin Function = Configuration + DigitalOut &m_SHDN_pin; +// +// InputPin Name = DACSTEP +// InputPin Description = DACSTEP (digital input). DAC Step Input. Drive high to move the DAC output in the direction of UP/DWN on the next rising +// edge of the system clock. +// InputPin Function = Configuration + DigitalOut &m_DACSTEP_pin; +// +// InputPin Name = UP/DWN# +// InputPin Description = UP/DWN# (digital input). DAC Step Direction Select. Drive high to step up, drive low to step down when DACSTEP is toggled. +// InputPin Function = Configuration + DigitalOut &m_UP_slash_DWNb_pin; +// +// CODE GENERATOR: class member data for gpio OutputPin pins +// OutputPin Name = EOC +// OutputPin Description = End of Conversion Output. Active-Low End-of-Conversion Indicator. EOC asserts low to indicate that new data is ready. +// OutputPin Function = Event + DigitalIn &m_EOC_pin; +// + + // Identifies which IC variant is being used + MAX11043_ic_t m_ic_variant; + +public: + +// CODE GENERATOR: class member function declarations + //---------------------------------------- + /// Menu item '!' + /// Initialize device + /// @return 1 on success; 0 on failure + uint8_t Init(void); + +// CODE GENERATOR: looks like this is a register access function because 'regAdd' +// CODE GENERATOR: looks like this is a 'write' register access function +// CODE GENERATOR: looks like this is a register access function because 'regAdd' +// CODE GENERATOR: looks like this is a 'write' register access function: omit this function from test menu + //---------------------------------------- + /// Write a MAX11043 register. + /// + /// CMD_1aaa_aaaa_REGISTER_READ bit is cleared 0 indicating a write operation. + /// + /// MAX11043 register length can be determined by function RegSize. + /// + /// For 8-bit register size: + /// + /// SPI 16-bit transfer + /// + /// SPI MOSI = 0aaa_aaaa_dddd_dddd + /// + /// SPI MISO = xxxx_xxxx_xxxx_xxxx + /// + /// For 16-bit register size: + /// + /// SPI 24-bit or 32-bit transfer + /// + /// SPI MOSI = 0aaa_aaaa_dddd_dddd_dddd_dddd + /// + /// SPI MISO = xxxx_xxxx_xxxx_xxxx_xxxx_xxxx + /// + /// For 24-bit register size: + /// + /// SPI 32-bit transfer + /// + /// SPI MOSI = 0aaa_aaaa_dddd_dddd_dddd_dddd_dddd_dddd + /// + /// SPI MISO = xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx + /// + /// @return 1 on success; 0 on failure + uint8_t RegWrite(MAX11043_CMD_enum_t commandByte, uint32_t regData); + +// CODE GENERATOR: looks like this is a register access function because 'regAdd' +// CODE GENERATOR: looks like this is a 'read' register access function +// CODE GENERATOR: looks like this is a register access function because 'regAdd' +// CODE GENERATOR: looks like this is a 'read' register access function: omit this function from test menu + //---------------------------------------- + /// Read an 8-bit MAX11043 register + /// + /// CMD_1aaa_aaaa_REGISTER_READ bit is set 1 indicating a read operation. + /// + /// MAX11043 register length can be determined by function RegSize. + /// + /// For 8-bit register size: + /// + /// SPI 16-bit transfer + /// + /// SPI MOSI = 1aaa_aaaa_0000_0000 + /// + /// SPI MISO = xxxx_xxxx_dddd_dddd + /// + /// For 16-bit register size: + /// + /// SPI 24-bit or 32-bit transfer + /// + /// SPI MOSI = 1aaa_aaaa_0000_0000_0000_0000 + /// + /// SPI MISO = xxxx_xxxx_dddd_dddd_dddd_dddd + /// + /// For 24-bit register size: + /// + /// SPI 32-bit transfer + /// + /// SPI MOSI = 1aaa_aaaa_0000_0000_0000_0000_0000_0000 + /// + /// SPI MISO = xxxx_xxxx_dddd_dddd_dddd_dddd_dddd_dddd + /// + /// + /// @return 1 on success; 0 on failure + uint8_t RegRead(MAX11043_CMD_enum_t commandByte, uint32_t* ptrRegData); + +// CODE GENERATOR: looks like this is a register access function because 'regAdd' +// CODE GENERATOR: looks like this is a 'size' register access function + //---------------------------------------- + /// Return the size of a MAX11043 register + /// + /// @return 8 for 8-bit, 16 for 16-bit, 24 for 24-bit, else 0 for undefined register size + uint8_t RegSize(MAX11043_CMD_enum_t commandByte); + +// CODE GENERATOR: looks like this is a register access function because 'regAdd' + //---------------------------------------- + /// Return the address field of a MAX11043 register + /// + /// @return register address field as given in datasheet + uint8_t RegAddrOfCommand(MAX11043_CMD_enum_t commandByte); + +// CODE GENERATOR: looks like this is a register access function because 'regAdd' +// CODE GENERATOR: looks like this is a 'read' register access function + //---------------------------------------- + /// Test whether a command byte is a register read command + /// + /// @return true if command byte is a register read command + uint8_t IsRegReadCommand(MAX11043_CMD_enum_t commandByte); + +// CODE GENERATOR: looks like this is a register access function because 'regAdd' +// CODE GENERATOR: looks like this is a 'name' register access function + //---------------------------------------- + /// Return the name of a MAX11043 register + /// + /// @return null-terminated constant C string containing register name or empty string + const char* RegName(MAX11043_CMD_enum_t commandByte); + +}; // end of class MAX11043 + +#endif // __MAX11043_H__ + +// End of file
--- a/Test_Main_MAX11043.cpp Tue Feb 11 01:16:34 2020 +0000 +++ b/Test_Main_MAX11043.cpp Tue Feb 11 09:01:20 2020 +0000 @@ -1,2165 +1,2257 @@ -// /******************************************************************************* -// * Copyright (C) 2020 Maxim Integrated Products, Inc., All Rights Reserved. -// * -// * Permission is hereby granted, free of charge, to any person obtaining a -// * copy of this software and associated documentation files (the "Software"), -// * to deal in the Software without restriction, including without limitation -// * the rights to use, copy, modify, merge, publish, distribute, sublicense, -// * and/or sell copies of the Software, and to permit persons to whom the -// * Software is furnished to do so, subject to the following conditions: -// * -// * The above copyright notice and this permission notice shall be included -// * in all copies or substantial portions of the Software. -// * -// * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -// * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES -// * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -// * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// * OTHER DEALINGS IN THE SOFTWARE. -// * -// * Except as contained in this notice, the name of Maxim Integrated -// * Products, Inc. shall not be used except as stated in the Maxim Integrated -// * Products, Inc. Branding Policy. -// * -// * The mere transfer of this software does not imply any licenses -// * of trade secrets, proprietary technology, copyrights, patents, -// * trademarks, maskwork rights, or any other form of intellectual -// * property whatsoever. Maxim Integrated Products, Inc. retains all -// * ownership rights. -// ******************************************************************************* -// */ -//---------- CODE GENERATOR: testMainCppCodeList -// CODE GENERATOR: example code includes - -// example code includes -// standard include for target platform -- Platform_Include_Boilerplate -#include "mbed.h" -// Platforms: -// - MAX32625MBED -// - supports mbed-os-5.11, requires USBDevice library -// - add https://developer.mbed.org/teams/MaximIntegrated/code/USBDevice/ -// - remove max32630fthr library (if present) -// - remove MAX32620FTHR library (if present) -// - MAX32600MBED -// - remove max32630fthr library (if present) -// - remove MAX32620FTHR library (if present) -// - Windows 10 note: Don't connect HDK until you are ready to load new firmware into the board. -// - NUCLEO_F446RE -// - remove USBDevice library -// - remove max32630fthr library (if present) -// - remove MAX32620FTHR library (if present) -// - NUCLEO_F401RE -// - remove USBDevice library -// - remove max32630fthr library (if present) -// - remove MAX32620FTHR library (if present) -// - MAX32630FTHR -// - #include "max32630fthr.h" -// - add http://os.mbed.org/teams/MaximIntegrated/code/max32630fthr/ -// - remove MAX32620FTHR library (if present) -// - MAX32620FTHR -// - #include "MAX32620FTHR.h" -// - remove max32630fthr library (if present) -// - add https://os.mbed.com/teams/MaximIntegrated/code/MAX32620FTHR/ -// - not tested yet -// - MAX32625PICO -// - remove max32630fthr library (if present) -// - remove MAX32620FTHR library (if present) -// - not tested yet -// -// end Platform_Include_Boilerplate -#include "MAX11043.h" -#include "CmdLine.h" -#include "MaximTinyTester.h" - -// optional: serial port -// note: some platforms such as Nucleo-F446RE do not support the USBSerial library. -// In those cases, remove the USBDevice lib from the project and rebuild. -#if defined(TARGET_MAX32625MBED) -#include "USBSerial.h" -USBSerial serial; // virtual serial port over USB (DEV connector) -#elif defined(TARGET_MAX32630MBED) -#include "USBSerial.h" -USBSerial serial; // virtual serial port over USB (DEV connector) -#else -//#include "USBSerial.h" -Serial serial(USBTX, USBRX); // tx, rx -#endif - -void on_immediate_0x21(); // Unicode (U+0021) ! EXCLAMATION MARK -void on_immediate_0x7b(); // Unicode (U+007B) { LEFT CURLY BRACKET -void on_immediate_0x7d(); // Unicode (U+007D) } RIGHT CURLY BRACKET - -#include "CmdLine.h" - -# if HAS_DAPLINK_SERIAL -CmdLine cmdLine_DAPLINKserial(DAPLINKserial, "DAPLINK"); -# endif // HAS_DAPLINK_SERIAL -CmdLine cmdLine_serial(serial, "serial"); - - -//-------------------------------------------------- - - -#if defined(TARGET) -// TARGET_NAME macros from targets/TARGET_Maxim/TARGET_MAX32625/device/mxc_device.h -// Create a string definition for the TARGET -#define STRING_ARG(arg) #arg -#define STRING_NAME(name) STRING_ARG(name) -#define TARGET_NAME STRING_NAME(TARGET) -#elif defined(TARGET_MAX32600) -#define TARGET_NAME "MAX32600" -#elif defined(TARGET_LPC1768) -#define TARGET_NAME "LPC1768" -#elif defined(TARGET_NUCLEO_F446RE) -#define TARGET_NAME "NUCLEO_F446RE" -#elif defined(TARGET_NUCLEO_F401RE) -#define TARGET_NAME "NUCLEO_F401RE" -#else -#error TARGET NOT DEFINED -#endif -#if defined(TARGET_MAX32630) -//-------------------------------------------------- -// TARGET=MAX32630FTHR ARM Cortex-M4F 96MHz 2048kB Flash 512kB SRAM -// +-------------[microUSB]-------------+ -// | J1 MAX32630FTHR J2 | -// ______ | [ ] RST GND [ ] | -// ______ | [ ] 3V3 BAT+[ ] | -// ______ | [ ] 1V8 reset SW1 | -// ______ | [ ] GND J4 J3 | -// analogIn0/4 | [a] AIN_0 1.2Vfs (bat) SYS [ ] | switched BAT+ -// analogIn1/5 | [a] AIN_1 1.2Vfs PWR [ ] | external pwr btn -// analogIn2 | [a] AIN_2 1.2Vfs +5V VBUS [ ] | USB +5V power -// analogIn3 | [a] AIN_3 1.2Vfs 1-WIRE P4_0 [d] | D0 dig9 -// (I2C2.SDA) | [d] P5_7 SDA2 SRN P5_6 [d] | D1 dig8 -// (I2C2.SCL) | [d] P6_0 SCL2 SDIO3 P5_5 [d] | D2 dig7 -// D13/SCLK | [s] P5_0 SCLK SDIO2 P5_4 [d] | D3 dig6 -// D11/MOSI | [s] P5_1 MOSI SSEL P5_3 [d] | D4 dig5 -// D12/MISO | [s] P5_2 MISO RTS P3_3 [d] | D5 dig4 -// D10/CS | [s] P3_0 RX CTS P3_2 [d] | D6 dig3 -// D9 dig0 | [d] P3_1 TX SCL P3_5 [d] | D7 dig2 -// ______ | [ ] GND SDA P3_4 [d] | D8 dig1 -// | | -// | XIP Flash MAX14690N | -// | XIP_SCLK P1_0 SDA2 P5_7 | -// | XIP_MOSI P1_1 SCL2 P6_0 | -// | XIP_MISO P1_2 PMIC_INIT P3_7 | -// | XIP_SSEL P1_3 MPC P2_7 | -// | XIP_DIO2 P1_4 MON AIN_0 | -// | XIP_DIO3 P1_5 | -// | | -// | PAN1326B MicroSD LED | -// | BT_RX P0_0 SD_SCLK P0_4 r P2_4 | -// | BT_TX P0_1 SD_MOSI P0_5 g P2_5 | -// | BT_CTS P0_2 SD_MISO P0_6 b P2_6 | -// | BT_RTS P0_3 SD_SSEL P0_7 | -// | BT_RST P1_6 DETECT P2_2 | -// | BT_CLK P1_7 SW2 P2_3 | -// +------------------------------------+ -// MAX32630FTHR board has MAX14690 PMIC on I2C bus (P5_7 SDA, P6_0 SCL) at slave address 0101_000r 0x50 (or 0x28 for 7 MSbit address). -// MAX32630FTHR board has BMI160 accelerometer on I2C bus (P5_7 SDA, P6_0 SCL) at slave address 1101_000r 0xD0 (or 0x68 for 7 MSbit address). -// AIN_0 = AIN0 pin fullscale is 1.2V -// AIN_1 = AIN1 pin fullscale is 1.2V -// AIN_2 = AIN2 pin fullscale is 1.2V -// AIN_3 = AIN3 pin fullscale is 1.2V -// AIN_4 = AIN0 / 5.0 fullscale is 6.0V -// AIN_5 = AIN1 / 5.0 fullscale is 6.0V -// AIN_6 = VDDB / 4.0 fullscale is 4.8V -// AIN_7 = VDD18 fullscale is 1.2V -// AIN_8 = VDD12 fullscale is 1.2V -// AIN_9 = VRTC / 2.0 fullscale is 2.4V -// AIN_10 = x undefined? -// AIN_11 = VDDIO / 4.0 fullscale is 4.8V -// AIN_12 = VDDIOH / 4.0 fullscale is 4.8V -// - #include "max32630fthr.h" -MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3); -#define analogIn4_IS_HIGH_RANGE_OF_analogIn0 1 -// MAX32630FTHR board supports only internal VREF = 1.200V at bypass capacitor C15 -const float ADC_FULL_SCALE_VOLTAGE = 1.200; -// Arduino connector -#ifndef A0 -#define A0 AIN_0 -#endif -#ifndef A1 -#define A1 AIN_1 -#endif -#ifndef A2 -#define A2 AIN_2 -#endif -#ifndef A3 -#define A3 AIN_3 -#endif -#ifndef D0 -#define D0 P4_0 -#endif -#ifndef D1 -#define D1 P5_6 -#endif -#ifndef D2 -#define D2 P5_5 -#endif -#ifndef D3 -#define D3 P5_4 -#endif -#ifndef D4 -#define D4 P5_3 -#endif -#ifndef D5 -#define D5 P3_3 -#endif -#ifndef D6 -#define D6 P3_2 -#endif -#ifndef D7 -#define D7 P3_5 -#endif -#ifndef D8 -#define D8 P3_4 -#endif -#ifndef D9 -#define D9 P3_1 -#endif -#ifndef D10 -#define D10 P3_0 -#endif -#ifndef D11 -#define D11 P5_1 -#endif -#ifndef D12 -#define D12 P5_2 -#endif -#ifndef D13 -#define D13 P5_0 -#endif -//-------------------------------------------------- -#elif defined(TARGET_MAX32625MBED) -//-------------------------------------------------- -// TARGET=MAX32625MBED ARM Cortex-M4F 96MHz 512kB Flash 160kB SRAM -// +-------------------------------------+ -// | MAX32625MBED Arduino UNO header | -// | | -// | A5/SCL[ ] | P1_7 dig15 -// | A4/SDA[ ] | P1_6 dig14 -// | AREF=N/C[ ] | -// | GND[ ] | -// | [ ]N/C SCK/13[ ] | P1_0 dig13 -// | [ ]IOREF=3V3 MISO/12[ ] | P1_2 dig12 -// | [ ]RST MOSI/11[ ]~| P1_1 dig11 -// | [ ]3V3 CS/10[ ]~| P1_3 dig10 -// | [ ]5V0 9[ ]~| P1_5 dig9 -// | [ ]GND 8[ ] | P1_4 dig8 -// | [ ]GND | -// | [ ]Vin 7[ ] | P0_7 dig7 -// | 6[ ]~| P0_6 dig6 -// AIN_0 | [ ]A0 5[ ]~| P0_5 dig5 -// AIN_1 | [ ]A1 4[ ] | P0_4 dig4 -// AIN_2 | [ ]A2 INT1/3[ ]~| P0_3 dig3 -// AIN_3 | [ ]A3 INT0/2[ ] | P0_2 dig2 -// dig16 P3_4 | [ ]A4/SDA RST SCK MISO TX>1[ ] | P0_1 dig1 -// dig17 P3_5 | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | P0_0 dig0 -// | [ ] [ ] [ ] | -// | UNO_R3 GND MOSI 5V ____________/ -// \_______________________/ -// -// +------------------------+ -// | | -// | MicroSD LED | -// | SD_SCLK P2_4 r P3_0 | -// | SD_MOSI P2_5 g P3_1 | -// | SD_MISO P2_6 b P3_2 | -// | SD_SSEL P2_7 y P3_3 | -// | | -// | DAPLINK BUTTONS | -// | TX P2_1 SW3 P2_3 | -// | RX P2_0 SW2 P2_2 | -// +------------------------+ -// -// AIN_0 = AIN0 pin fullscale is 1.2V -// AIN_1 = AIN1 pin fullscale is 1.2V -// AIN_2 = AIN2 pin fullscale is 1.2V -// AIN_3 = AIN3 pin fullscale is 1.2V -// AIN_4 = AIN0 / 5.0 fullscale is 6.0V -// AIN_5 = AIN1 / 5.0 fullscale is 6.0V -// AIN_6 = VDDB / 4.0 fullscale is 4.8V -// AIN_7 = VDD18 fullscale is 1.2V -// AIN_8 = VDD12 fullscale is 1.2V -// AIN_9 = VRTC / 2.0 fullscale is 2.4V -// AIN_10 = x undefined? -// AIN_11 = VDDIO / 4.0 fullscale is 4.8V -// AIN_12 = VDDIOH / 4.0 fullscale is 4.8V -// -//#include "max32625mbed.h" // ? -//MAX32625MBED mbed(MAX32625MBED::VIO_3V3); // ? -#define analogIn4_IS_HIGH_RANGE_OF_analogIn0 1 -// MAX32630FTHR board supports only internal VREF = 1.200V at bypass capacitor C15 -const float ADC_FULL_SCALE_VOLTAGE = 1.200; // TODO: ADC_FULL_SCALE_VOLTAGE Pico? -// Arduino connector -#ifndef A0 -#define A0 AIN_0 -#endif -#ifndef A1 -#define A1 AIN_1 -#endif -#ifndef A2 -#define A2 AIN_2 -#endif -#ifndef A3 -#define A3 AIN_3 -#endif -#ifndef D0 -#define D0 P0_0 -#endif -#ifndef D1 -#define D1 P0_1 -#endif -#ifndef D2 -#define D2 P0_2 -#endif -#ifndef D3 -#define D3 P0_3 -#endif -#ifndef D4 -#define D4 P0_4 -#endif -#ifndef D5 -#define D5 P0_5 -#endif -#ifndef D6 -#define D6 P0_6 -#endif -#ifndef D7 -#define D7 P0_7 -#endif -#ifndef D8 -#define D8 P1_4 -#endif -#ifndef D9 -#define D9 P1_5 -#endif -#ifndef D10 -#define D10 P1_3 -#endif -#ifndef D11 -#define D11 P1_1 -#endif -#ifndef D12 -#define D12 P1_2 -#endif -#ifndef D13 -#define D13 P1_0 -#endif -//-------------------------------------------------- -#elif defined(TARGET_MAX32600) -// target MAX32600 -// -#define analogIn4_IS_HIGH_RANGE_OF_analogIn0 0 -const float ADC_FULL_SCALE_VOLTAGE = 1.500; -// -//-------------------------------------------------- -#elif defined(TARGET_MAX32620FTHR) -#warning "TARGET_MAX32620FTHR not previously tested; need to define pins..." -#include "MAX32620FTHR.h" -// Initialize I/O voltages on MAX32620FTHR board -MAX32620FTHR fthr(MAX32620FTHR::VIO_3V3); -//#define USE_LEDS 0 ? -#define analogIn4_IS_HIGH_RANGE_OF_analogIn0 1 -#warning "TARGET_MAX32620FTHR not previously tested; need to verify ADC_FULL_SCALE_VOLTAGE..." -const float ADC_FULL_SCALE_VOLTAGE = 1.200; -// -//-------------------------------------------------- -#elif defined(TARGET_MAX32625PICO) -#warning "TARGET_MAX32625PICO not previously tested; need to define pins..." -//#define USE_LEDS 0 ? -#define analogIn4_IS_HIGH_RANGE_OF_analogIn0 1 -#warning "TARGET_MAX32625PICO not previously tested; need to verify ADC_FULL_SCALE_VOLTAGE..." -const float ADC_FULL_SCALE_VOLTAGE = 1.200; -// -//-------------------------------------------------- -#elif defined(TARGET_NUCLEO_F446RE) || defined(TARGET_NUCLEO_F401RE) -// TODO1: target NUCLEO_F446RE -// -// USER_BUTTON PC13 -// LED1 is shared with SPI_SCK on NUCLEO_F446RE PA_5, so don't use LED1. -#define USE_LEDS 0 -// SPI spi(SPI_MOSI, SPI_MISO, SPI_SCK); -// Serial serial(SERIAL_TX, SERIAL_RX); -#define analogIn4_IS_HIGH_RANGE_OF_analogIn0 0 -const float ADC_FULL_SCALE_VOLTAGE = 3.300; // TODO: ADC_FULL_SCALE_VOLTAGE Pico? -// -//-------------------------------------------------- -#elif defined(TARGET_LPC1768) -//-------------------------------------------------- -// TARGET=LPC1768 ARM Cortex-M3 100 MHz 512kB flash 64kB SRAM -// +-------------[microUSB]-------------+ -// ______ | [ ] GND +3.3V VOUT [ ] | ______ -// ______ | [ ] 4.5V<VIN<9.0V +5.0V VU [ ] | ______ -// ______ | [ ] VB USB.IF- [ ] | ______ -// ______ | [ ] nR USB.IF+ [ ] | ______ -// digitalInOut0 | [ ] p5 MOSI ETHERNET.RD- [ ] | ______ -// digitalInOut1 | [ ] p6 MISO ETHERNET.RD+ [ ] | ______ -// digitalInOut2 | [ ] p7 SCLK ETHERNET.TD- [ ] | ______ -// digitalInOut3 | [ ] p8 ETHERNET.TD+ [ ] | ______ -// digitalInOut4 | [ ] p9 TX SDA USB.D- [ ] | ______ -// digitalInOut5 | [ ] p10 RX SCL USB.D+ [ ] | ______ -// digitalInOut6 | [ ] p11 MOSI CAN-RD p30 [ ] | digitalInOut13 -// digitalInOut7 | [ ] p12 MISO CAN-TD p29 [ ] | digitalInOut12 -// digitalInOut8 | [ ] p13 TX SCLK SDA TX p28 [ ] | digitalInOut11 -// digitalInOut9 | [ ] p14 RX SCL RX p27 [ ] | digitalInOut10 -// analogIn0 | [ ] p15 AIN0 3.3Vfs PWM1 p26 [ ] | pwmDriver1 -// analogIn1 | [ ] p16 AIN1 3.3Vfs PWM2 p25 [ ] | pwmDriver2 -// analogIn2 | [ ] p17 AIN2 3.3Vfs PWM3 p24 [ ] | pwmDriver3 -// analogIn3 | [ ] p18 AIN3 AOUT PWM4 p23 [ ] | pwmDriver4 -// analogIn4 | [ ] p19 AIN4 3.3Vfs PWM5 p22 [ ] | pwmDriver5 -// analogIn5 | [ ] p20 AIN5 3.3Vfs PWM6 p21 [ ] | pwmDriver6 -// +------------------------------------+ -// AIN6 = P0.3 = TGT_SBL_RXD? -// AIN7 = P0.2 = TGT_SBL_TXD? -// -//-------------------------------------------------- -// LPC1768 board uses VREF = 3.300V +A3,3V thru L1 to bypass capacitor C14 -#define analogIn4_IS_HIGH_RANGE_OF_analogIn0 0 -const float ADC_FULL_SCALE_VOLTAGE = 3.300; -#else // not defined(TARGET_LPC1768 etc.) -//-------------------------------------------------- -// unknown target -//-------------------------------------------------- -#endif // target definition - - - -// uncrustify-0.66.1 *INDENT-OFF* -//-------------------------------------------------- -// Declare the AnalogIn driver -// Optional analogIn support. If there is only one it should be analogIn1. -// A) analog input -#if defined(TARGET_MAX32630) - #define HAS_analogIn0 1 - #define HAS_analogIn1 1 - #define HAS_analogIn2 1 - #define HAS_analogIn3 1 - #define HAS_analogIn4 1 - #define HAS_analogIn5 1 - #define HAS_analogIn6 1 - #define HAS_analogIn7 1 - #define HAS_analogIn8 1 - #define HAS_analogIn9 1 -// #define HAS_analogIn10 0 -// #define HAS_analogIn11 0 -// #define HAS_analogIn12 0 -// #define HAS_analogIn13 0 -// #define HAS_analogIn14 0 -// #define HAS_analogIn15 0 -#if HAS_analogIn0 - AnalogIn analogIn0(AIN_0); // TARGET_MAX32630 J1.5 AIN_0 = AIN0 pin fullscale is 1.2V -#endif -#if HAS_analogIn1 - AnalogIn analogIn1(AIN_1); // TARGET_MAX32630 J1.6 AIN_1 = AIN1 pin fullscale is 1.2V -#endif -#if HAS_analogIn2 - AnalogIn analogIn2(AIN_2); // TARGET_MAX32630 J1.7 AIN_2 = AIN2 pin fullscale is 1.2V -#endif -#if HAS_analogIn3 - AnalogIn analogIn3(AIN_3); // TARGET_MAX32630 J1.8 AIN_3 = AIN3 pin fullscale is 1.2V -#endif -#if HAS_analogIn4 - AnalogIn analogIn4(AIN_4); // TARGET_MAX32630 J1.5 AIN_4 = AIN0 / 5.0 fullscale is 6.0V -#endif -#if HAS_analogIn5 - AnalogIn analogIn5(AIN_5); // TARGET_MAX32630 J1.6 AIN_5 = AIN1 / 5.0 fullscale is 6.0V -#endif -#if HAS_analogIn6 - AnalogIn analogIn6(AIN_6); // TARGET_MAX32630 AIN_6 = VDDB / 4.0 fullscale is 4.8V -#endif -#if HAS_analogIn7 - AnalogIn analogIn7(AIN_7); // TARGET_MAX32630 AIN_7 = VDD18 fullscale is 1.2V -#endif -#if HAS_analogIn8 - AnalogIn analogIn8(AIN_8); // TARGET_MAX32630 AIN_8 = VDD12 fullscale is 1.2V -#endif -#if HAS_analogIn9 - AnalogIn analogIn9(AIN_9); // TARGET_MAX32630 AIN_9 = VRTC / 2.0 fullscale is 2.4V -#endif -#if HAS_analogIn10 - AnalogIn analogIn10(____); // TARGET_MAX32630 AIN_10 = x undefined? -#endif -#if HAS_analogIn11 - AnalogIn analogIn11(____); // TARGET_MAX32630 AIN_11 = VDDIO / 4.0 fullscale is 4.8V -#endif -#if HAS_analogIn12 - AnalogIn analogIn12(____); // TARGET_MAX32630 AIN_12 = VDDIOH / 4.0 fullscale is 4.8V -#endif -#if HAS_analogIn13 - AnalogIn analogIn13(____); -#endif -#if HAS_analogIn14 - AnalogIn analogIn14(____); -#endif -#if HAS_analogIn15 - AnalogIn analogIn15(____); -#endif -//-------------------------------------------------- -#elif defined(TARGET_MAX32625MBED) - #define HAS_analogIn0 1 - #define HAS_analogIn1 1 - #define HAS_analogIn2 1 - #define HAS_analogIn3 1 - #define HAS_analogIn4 1 - #define HAS_analogIn5 1 -#if HAS_analogIn0 - AnalogIn analogIn0(AIN_0); // TARGET_MAX32630 J1.5 AIN_0 = AIN0 pin fullscale is 1.2V -#endif -#if HAS_analogIn1 - AnalogIn analogIn1(AIN_1); // TARGET_MAX32630 J1.6 AIN_1 = AIN1 pin fullscale is 1.2V -#endif -#if HAS_analogIn2 - AnalogIn analogIn2(AIN_2); // TARGET_MAX32630 J1.7 AIN_2 = AIN2 pin fullscale is 1.2V -#endif -#if HAS_analogIn3 - AnalogIn analogIn3(AIN_3); // TARGET_MAX32630 J1.8 AIN_3 = AIN3 pin fullscale is 1.2V -#endif -#if HAS_analogIn4 - AnalogIn analogIn4(AIN_4); // TARGET_MAX32630 J1.5 AIN_4 = AIN0 / 5.0 fullscale is 6.0V -#endif -#if HAS_analogIn5 - AnalogIn analogIn5(AIN_5); // TARGET_MAX32630 J1.6 AIN_5 = AIN1 / 5.0 fullscale is 6.0V -#endif -//-------------------------------------------------- -#elif defined(TARGET_MAX32620FTHR) -#warning "TARGET_MAX32620FTHR not previously tested; need to verify analogIn0..." - #define HAS_analogIn0 1 - #define HAS_analogIn1 1 - #define HAS_analogIn2 1 - #define HAS_analogIn3 1 - #define HAS_analogIn4 1 - #define HAS_analogIn5 1 - #define HAS_analogIn6 1 - #define HAS_analogIn7 1 - #define HAS_analogIn8 1 - #define HAS_analogIn9 1 -// #define HAS_analogIn10 0 -// #define HAS_analogIn11 0 -// #define HAS_analogIn12 0 -// #define HAS_analogIn13 0 -// #define HAS_analogIn14 0 -// #define HAS_analogIn15 0 -#if HAS_analogIn0 - AnalogIn analogIn0(AIN_0); // TARGET_MAX32620FTHR J1.5 AIN_0 = AIN0 pin fullscale is 1.2V -#endif -#if HAS_analogIn1 - AnalogIn analogIn1(AIN_1); // TARGET_MAX32620FTHR J1.6 AIN_1 = AIN1 pin fullscale is 1.2V -#endif -#if HAS_analogIn2 - AnalogIn analogIn2(AIN_2); // TARGET_MAX32620FTHR J1.7 AIN_2 = AIN2 pin fullscale is 1.2V -#endif -#if HAS_analogIn3 - AnalogIn analogIn3(AIN_3); // TARGET_MAX32620FTHR J1.8 AIN_3 = AIN3 pin fullscale is 1.2V -#endif -#if HAS_analogIn4 - AnalogIn analogIn4(AIN_4); // TARGET_MAX32620FTHR J1.5 AIN_4 = AIN0 / 5.0 fullscale is 6.0V -#endif -#if HAS_analogIn5 - AnalogIn analogIn5(AIN_5); // TARGET_MAX32620FTHR J1.6 AIN_5 = AIN1 / 5.0 fullscale is 6.0V -#endif -#if HAS_analogIn6 - AnalogIn analogIn6(AIN_6); // TARGET_MAX32620FTHR AIN_6 = VDDB / 4.0 fullscale is 4.8V -#endif -#if HAS_analogIn7 - AnalogIn analogIn7(AIN_7); // TARGET_MAX32620FTHR AIN_7 = VDD18 fullscale is 1.2V -#endif -#if HAS_analogIn8 - AnalogIn analogIn8(AIN_8); // TARGET_MAX32620FTHR AIN_8 = VDD12 fullscale is 1.2V -#endif -#if HAS_analogIn9 - AnalogIn analogIn9(AIN_9); // TARGET_MAX32620FTHR AIN_9 = VRTC / 2.0 fullscale is 2.4V -#endif -#if HAS_analogIn10 - AnalogIn analogIn10(____); // TARGET_MAX32620FTHR AIN_10 = x undefined? -#endif -#if HAS_analogIn11 - AnalogIn analogIn11(____); // TARGET_MAX32620FTHR AIN_11 = VDDIO / 4.0 fullscale is 4.8V -#endif -#if HAS_analogIn12 - AnalogIn analogIn12(____); // TARGET_MAX32620FTHR AIN_12 = VDDIOH / 4.0 fullscale is 4.8V -#endif -#if HAS_analogIn13 - AnalogIn analogIn13(____); -#endif -#if HAS_analogIn14 - AnalogIn analogIn14(____); -#endif -#if HAS_analogIn15 - AnalogIn analogIn15(____); -#endif -//-------------------------------------------------- -#elif defined(TARGET_MAX32625PICO) -#warning "TARGET_MAX32625PICO not previously tested; need to verify analogIn0..." - #define HAS_analogIn0 1 - #define HAS_analogIn1 1 - #define HAS_analogIn2 1 - #define HAS_analogIn3 1 - #define HAS_analogIn4 1 - #define HAS_analogIn5 1 -#if HAS_analogIn0 - AnalogIn analogIn0(AIN_0); // TARGET_MAX32630 J1.5 AIN_0 = AIN0 pin fullscale is 1.2V -#endif -#if HAS_analogIn1 - AnalogIn analogIn1(AIN_1); // TARGET_MAX32630 J1.6 AIN_1 = AIN1 pin fullscale is 1.2V -#endif -#if HAS_analogIn2 - AnalogIn analogIn2(AIN_2); // TARGET_MAX32630 J1.7 AIN_2 = AIN2 pin fullscale is 1.2V -#endif -#if HAS_analogIn3 - AnalogIn analogIn3(AIN_3); // TARGET_MAX32630 J1.8 AIN_3 = AIN3 pin fullscale is 1.2V -#endif -#if HAS_analogIn4 - AnalogIn analogIn4(AIN_4); // TARGET_MAX32630 J1.5 AIN_4 = AIN0 / 5.0 fullscale is 6.0V -#endif -#if HAS_analogIn5 - AnalogIn analogIn5(AIN_5); // TARGET_MAX32630 J1.6 AIN_5 = AIN1 / 5.0 fullscale is 6.0V -#endif -//-------------------------------------------------- -#elif defined(TARGET_MAX32600) - #define HAS_analogIn0 1 - #define HAS_analogIn1 1 - #define HAS_analogIn2 1 - #define HAS_analogIn3 1 - #define HAS_analogIn4 1 - #define HAS_analogIn5 1 -#if HAS_analogIn0 - AnalogIn analogIn0(A0); -#endif -#if HAS_analogIn1 - AnalogIn analogIn1(A1); -#endif -#if HAS_analogIn2 - AnalogIn analogIn2(A2); -#endif -#if HAS_analogIn3 - AnalogIn analogIn3(A3); -#endif -#if HAS_analogIn4 - AnalogIn analogIn4(A4); -#endif -#if HAS_analogIn5 - AnalogIn analogIn5(A5); -#endif -//-------------------------------------------------- -#elif defined(TARGET_NUCLEO_F446RE) - #define HAS_analogIn0 1 - #define HAS_analogIn1 1 - #define HAS_analogIn2 1 - #define HAS_analogIn3 1 - #define HAS_analogIn4 1 - #define HAS_analogIn5 1 -#if HAS_analogIn0 - AnalogIn analogIn0(A0); -#endif -#if HAS_analogIn1 - AnalogIn analogIn1(A1); -#endif -#if HAS_analogIn2 - AnalogIn analogIn2(A2); -#endif -#if HAS_analogIn3 - AnalogIn analogIn3(A3); -#endif -#if HAS_analogIn4 - AnalogIn analogIn4(A4); -#endif -#if HAS_analogIn5 - AnalogIn analogIn5(A5); -#endif -//-------------------------------------------------- -#elif defined(TARGET_NUCLEO_F401RE) - #define HAS_analogIn0 1 - #define HAS_analogIn1 1 - #define HAS_analogIn2 1 - #define HAS_analogIn3 1 - #define HAS_analogIn4 1 - #define HAS_analogIn5 1 -#if HAS_analogIn0 - AnalogIn analogIn0(A0); -#endif -#if HAS_analogIn1 - AnalogIn analogIn1(A1); -#endif -#if HAS_analogIn2 - AnalogIn analogIn2(A2); -#endif -#if HAS_analogIn3 - AnalogIn analogIn3(A3); -#endif -#if HAS_analogIn4 - AnalogIn analogIn4(A4); -#endif -#if HAS_analogIn5 - AnalogIn analogIn5(A5); -#endif -//-------------------------------------------------- -// TODO1: TARGET=MAX32625MBED ARM Cortex-M4F 96MHz 512kB Flash 160kB SRAM -#elif defined(TARGET_LPC1768) - #define HAS_analogIn0 1 - #define HAS_analogIn1 1 - #define HAS_analogIn2 1 - #define HAS_analogIn3 1 - #define HAS_analogIn4 1 - #define HAS_analogIn5 1 -// #define HAS_analogIn6 1 -// #define HAS_analogIn7 1 -// #define HAS_analogIn8 1 -// #define HAS_analogIn9 1 -// #define HAS_analogIn10 1 -// #define HAS_analogIn11 1 -// #define HAS_analogIn12 1 -// #define HAS_analogIn13 1 -// #define HAS_analogIn14 1 -// #define HAS_analogIn15 1 -#if HAS_analogIn0 - AnalogIn analogIn0(p15); // TARGET_LPC1768 P0.23/AD0.0/I2SRX_CLK/CAP3.0 -#endif -#if HAS_analogIn1 - AnalogIn analogIn1(p16); // TARGET_LPC1768 P0.24/AD0.1/I2SRX_WS/CAP3.1 -#endif -#if HAS_analogIn2 - AnalogIn analogIn2(p17); // TARGET_LPC1768 P0.25/AD0.2/I2SRX_SDA/TXD3 -#endif -#if HAS_analogIn3 - AnalogIn analogIn3(p18); // TARGET_LPC1768 P0.26/AD0.3/AOUT/RXD3 -#endif -#if HAS_analogIn4 - AnalogIn analogIn4(p19); // TARGET_LPC1768 P1.30/VBUS/AD0.4 -#endif -#if HAS_analogIn5 - AnalogIn analogIn5(p20); // TARGET_LPC1768 P1.31/SCK1/AD0.5 -#endif -#if HAS_analogIn6 - AnalogIn analogIn6(____); -#endif -#if HAS_analogIn7 - AnalogIn analogIn7(____); -#endif -#if HAS_analogIn8 - AnalogIn analogIn8(____); -#endif -#if HAS_analogIn9 - AnalogIn analogIn9(____); -#endif -#if HAS_analogIn10 - AnalogIn analogIn10(____); -#endif -#if HAS_analogIn11 - AnalogIn analogIn11(____); -#endif -#if HAS_analogIn12 - AnalogIn analogIn12(____); -#endif -#if HAS_analogIn13 - AnalogIn analogIn13(____); -#endif -#if HAS_analogIn14 - AnalogIn analogIn14(____); -#endif -#if HAS_analogIn15 - AnalogIn analogIn15(____); -#endif -#else - // unknown target -#endif -// uncrustify-0.66.1 *INDENT-ON* -#if HAS_analogIn0 || HAS_analogIn1 \ - || HAS_analogIn2 || HAS_analogIn3 \ - || HAS_analogIn4 || HAS_analogIn5 \ - || HAS_analogIn6 || HAS_analogIn7 \ - || HAS_analogIn8 || HAS_analogIn9 \ - || HAS_analogIn10 || HAS_analogIn11 \ - || HAS_analogIn12 || HAS_analogIn13 \ - || HAS_analogIn14 || HAS_analogIn15 -#define HAS_analogIns 1 -#endif - - - -// AnalogIn pin resource: search index -#if HAS_analogIns -AnalogIn& find_analogInPin(int cPinIndex) -{ - switch (cPinIndex) - { - default: // default to the first defined analogIn pin -#if HAS_analogIn0 - case '0': case 0x00: return analogIn0; -#endif -#if HAS_analogIn1 - case '1': case 0x01: return analogIn1; -#endif -#if HAS_analogIn2 - case '2': case 0x02: return analogIn2; -#endif -#if HAS_analogIn3 - case '3': case 0x03: return analogIn3; -#endif -#if HAS_analogIn4 - case '4': case 0x04: return analogIn4; -#endif -#if HAS_analogIn5 - case '5': case 0x05: return analogIn5; -#endif -#if HAS_analogIn6 - case '6': case 0x06: return analogIn6; -#endif -#if HAS_analogIn7 - case '7': case 0x07: return analogIn7; -#endif -#if HAS_analogIn8 - case '8': case 0x08: return analogIn8; -#endif -#if HAS_analogIn9 - case '9': case 0x09: return analogIn9; -#endif -#if HAS_analogIn10 - case 'a': case 0x0a: return analogIn10; -#endif -#if HAS_analogIn11 - case 'b': case 0x0b: return analogIn11; -#endif -#if HAS_analogIn12 - case 'c': case 0x0c: return analogIn12; -#endif -#if HAS_analogIn13 - case 'd': case 0x0d: return analogIn13; -#endif -#if HAS_analogIn14 - case 'e': case 0x0e: return analogIn14; -#endif -#if HAS_analogIn15 - case 'f': case 0x0f: return analogIn15; -#endif - } -} -#endif - -#if HAS_analogIns -const float analogInPin_fullScaleVoltage[] = { -# if defined(TARGET_MAX32630) - ADC_FULL_SCALE_VOLTAGE, // analogIn0 - ADC_FULL_SCALE_VOLTAGE, // analogIn1 - ADC_FULL_SCALE_VOLTAGE, // analogIn2 - ADC_FULL_SCALE_VOLTAGE, // analogIn3 - ADC_FULL_SCALE_VOLTAGE * 5.0f, // analogIn4 // AIN_4 = AIN0 / 5.0 fullscale is 6.0V - ADC_FULL_SCALE_VOLTAGE * 5.0f, // analogIn4 // AIN_5 = AIN1 / 5.0 fullscale is 6.0V - ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn6 // AIN_6 = VDDB / 4.0 fullscale is 4.8V - ADC_FULL_SCALE_VOLTAGE, // analogIn7 // AIN_7 = VDD18 fullscale is 1.2V - ADC_FULL_SCALE_VOLTAGE, // analogIn8 // AIN_8 = VDD12 fullscale is 1.2V - ADC_FULL_SCALE_VOLTAGE * 2.0f, // analogIn9 // AIN_9 = VRTC / 2.0 fullscale is 2.4V - ADC_FULL_SCALE_VOLTAGE, // analogIn10 // AIN_10 = x undefined? - ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn11 // AIN_11 = VDDIO / 4.0 fullscale is 4.8V - ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn12 // AIN_12 = VDDIOH / 4.0 fullscale is 4.8V - ADC_FULL_SCALE_VOLTAGE, // analogIn13 - ADC_FULL_SCALE_VOLTAGE, // analogIn14 - ADC_FULL_SCALE_VOLTAGE // analogIn15 -# elif defined(TARGET_MAX32620FTHR) -#warning "TARGET_MAX32620FTHR not previously tested; need to verify analogIn0..." - ADC_FULL_SCALE_VOLTAGE, // analogIn0 - ADC_FULL_SCALE_VOLTAGE, // analogIn1 - ADC_FULL_SCALE_VOLTAGE, // analogIn2 - ADC_FULL_SCALE_VOLTAGE, // analogIn3 - ADC_FULL_SCALE_VOLTAGE * 5.0f, // analogIn4 // AIN_4 = AIN0 / 5.0 fullscale is 6.0V - ADC_FULL_SCALE_VOLTAGE * 5.0f, // analogIn4 // AIN_5 = AIN1 / 5.0 fullscale is 6.0V - ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn6 // AIN_6 = VDDB / 4.0 fullscale is 4.8V - ADC_FULL_SCALE_VOLTAGE, // analogIn7 // AIN_7 = VDD18 fullscale is 1.2V - ADC_FULL_SCALE_VOLTAGE, // analogIn8 // AIN_8 = VDD12 fullscale is 1.2V - ADC_FULL_SCALE_VOLTAGE * 2.0f, // analogIn9 // AIN_9 = VRTC / 2.0 fullscale is 2.4V - ADC_FULL_SCALE_VOLTAGE, // analogIn10 // AIN_10 = x undefined? - ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn11 // AIN_11 = VDDIO / 4.0 fullscale is 4.8V - ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn12 // AIN_12 = VDDIOH / 4.0 fullscale is 4.8V - ADC_FULL_SCALE_VOLTAGE, // analogIn13 - ADC_FULL_SCALE_VOLTAGE, // analogIn14 - ADC_FULL_SCALE_VOLTAGE // analogIn15 -#elif defined(TARGET_MAX32625MBED) - ADC_FULL_SCALE_VOLTAGE * 1.0f, // analogIn0 // fullscale is 1.2V - ADC_FULL_SCALE_VOLTAGE * 1.0f, // analogIn1 // fullscale is 1.2V - ADC_FULL_SCALE_VOLTAGE * 1.0f, // analogIn2 // fullscale is 1.2V - ADC_FULL_SCALE_VOLTAGE * 1.0f, // analogIn3 // fullscale is 1.2V - ADC_FULL_SCALE_VOLTAGE * 5.0f, // analogIn4 // AIN_4 = AIN0 / 5.0 fullscale is 6.0V - ADC_FULL_SCALE_VOLTAGE * 5.0f, // analogIn4 // AIN_5 = AIN1 / 5.0 fullscale is 6.0V - ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn6 // AIN_6 = VDDB / 4.0 fullscale is 4.8V - ADC_FULL_SCALE_VOLTAGE, // analogIn7 // AIN_7 = VDD18 fullscale is 1.2V - ADC_FULL_SCALE_VOLTAGE, // analogIn8 // AIN_8 = VDD12 fullscale is 1.2V - ADC_FULL_SCALE_VOLTAGE * 2.0f, // analogIn9 // AIN_9 = VRTC / 2.0 fullscale is 2.4V - ADC_FULL_SCALE_VOLTAGE, // analogIn10 // AIN_10 = x undefined? - ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn11 // AIN_11 = VDDIO / 4.0 fullscale is 4.8V - ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn12 // AIN_12 = VDDIOH / 4.0 fullscale is 4.8V - ADC_FULL_SCALE_VOLTAGE, // analogIn13 - ADC_FULL_SCALE_VOLTAGE, // analogIn14 - ADC_FULL_SCALE_VOLTAGE // analogIn15 -#elif defined(TARGET_NUCLEO_F446RE) - ADC_FULL_SCALE_VOLTAGE, // analogIn0 - ADC_FULL_SCALE_VOLTAGE, // analogIn1 - ADC_FULL_SCALE_VOLTAGE, // analogIn2 - ADC_FULL_SCALE_VOLTAGE, // analogIn3 - ADC_FULL_SCALE_VOLTAGE, // analogIn4 - ADC_FULL_SCALE_VOLTAGE, // analogIn5 - ADC_FULL_SCALE_VOLTAGE, // analogIn6 - ADC_FULL_SCALE_VOLTAGE, // analogIn7 - ADC_FULL_SCALE_VOLTAGE, // analogIn8 - ADC_FULL_SCALE_VOLTAGE, // analogIn9 - ADC_FULL_SCALE_VOLTAGE, // analogIn10 - ADC_FULL_SCALE_VOLTAGE, // analogIn11 - ADC_FULL_SCALE_VOLTAGE, // analogIn12 - ADC_FULL_SCALE_VOLTAGE, // analogIn13 - ADC_FULL_SCALE_VOLTAGE, // analogIn14 - ADC_FULL_SCALE_VOLTAGE // analogIn15 -#elif defined(TARGET_NUCLEO_F401RE) - ADC_FULL_SCALE_VOLTAGE, // analogIn0 - ADC_FULL_SCALE_VOLTAGE, // analogIn1 - ADC_FULL_SCALE_VOLTAGE, // analogIn2 - ADC_FULL_SCALE_VOLTAGE, // analogIn3 - ADC_FULL_SCALE_VOLTAGE, // analogIn4 - ADC_FULL_SCALE_VOLTAGE, // analogIn5 - ADC_FULL_SCALE_VOLTAGE, // analogIn6 - ADC_FULL_SCALE_VOLTAGE, // analogIn7 - ADC_FULL_SCALE_VOLTAGE, // analogIn8 - ADC_FULL_SCALE_VOLTAGE, // analogIn9 - ADC_FULL_SCALE_VOLTAGE, // analogIn10 - ADC_FULL_SCALE_VOLTAGE, // analogIn11 - ADC_FULL_SCALE_VOLTAGE, // analogIn12 - ADC_FULL_SCALE_VOLTAGE, // analogIn13 - ADC_FULL_SCALE_VOLTAGE, // analogIn14 - ADC_FULL_SCALE_VOLTAGE // analogIn15 -//#elif defined(TARGET_LPC1768) -#else - // unknown target - ADC_FULL_SCALE_VOLTAGE, // analogIn0 - ADC_FULL_SCALE_VOLTAGE, // analogIn1 - ADC_FULL_SCALE_VOLTAGE, // analogIn2 - ADC_FULL_SCALE_VOLTAGE, // analogIn3 - ADC_FULL_SCALE_VOLTAGE, // analogIn4 - ADC_FULL_SCALE_VOLTAGE, // analogIn5 - ADC_FULL_SCALE_VOLTAGE, // analogIn6 - ADC_FULL_SCALE_VOLTAGE, // analogIn7 - ADC_FULL_SCALE_VOLTAGE, // analogIn8 - ADC_FULL_SCALE_VOLTAGE, // analogIn9 - ADC_FULL_SCALE_VOLTAGE, // analogIn10 - ADC_FULL_SCALE_VOLTAGE, // analogIn11 - ADC_FULL_SCALE_VOLTAGE, // analogIn12 - ADC_FULL_SCALE_VOLTAGE, // analogIn13 - ADC_FULL_SCALE_VOLTAGE, // analogIn14 - ADC_FULL_SCALE_VOLTAGE // analogIn15 -# endif -}; -#endif - - - - -//-------------------------------------------------- -// Option to use LEDs to show status -#ifndef USE_LEDS -#define USE_LEDS 1 -#endif -#if USE_LEDS -#if defined(TARGET_MAX32630) -# define LED_ON 0 -# define LED_OFF 1 -//-------------------------------------------------- -#elif defined(TARGET_MAX32625MBED) -# define LED_ON 0 -# define LED_OFF 1 -//-------------------------------------------------- -// TODO1: TARGET=MAX32625MBED ARM Cortex-M4F 96MHz 512kB Flash 160kB SRAM -#elif defined(TARGET_LPC1768) -# define LED_ON 1 -# define LED_OFF 0 -#else // not defined(TARGET_LPC1768 etc.) -// USE_LEDS with some platform other than MAX32630, MAX32625MBED, LPC1768 -// bugfix for MAX32600MBED LED blink pattern: check if LED_ON/LED_OFF already defined -# ifndef LED_ON -# define LED_ON 0 -# endif -# ifndef LED_OFF -# define LED_OFF 1 -# endif -//# define LED_ON 1 -//# define LED_OFF 0 -#endif // target definition -DigitalOut led1(LED1, LED_OFF); // MAX32630FTHR: LED1 = LED_RED -DigitalOut led2(LED2, LED_OFF); // MAX32630FTHR: LED2 = LED_GREEN -DigitalOut led3(LED3, LED_OFF); // MAX32630FTHR: LED3 = LED_BLUE -DigitalOut led4(LED4, LED_OFF); -#else // USE_LEDS=0 -// issue #41 support Nucleo_F446RE -// there are no LED indicators on the board, LED1 interferes with SPI; -// but we still need placeholders led1 led2 led3 led4. -// Declare DigitalOut led1 led2 led3 led4 targeting safe pins. -// PinName NC means NOT_CONNECTED; DigitalOut::is_connected() returns false -# define LED_ON 0 -# define LED_OFF 1 -DigitalOut led1(NC, LED_OFF); -DigitalOut led2(NC, LED_OFF); -DigitalOut led3(NC, LED_OFF); -DigitalOut led4(NC, LED_OFF); -#endif // USE_LEDS -#define led1_RFailLED led1 -#define led2_GPassLED led2 -#define led3_BBusyLED led3 - -//-------------------------------------------------- - - -// example code board support -//MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3); -//DigitalOut rLED(LED1); -//DigitalOut gLED(LED2); -//DigitalOut bLED(LED3); -// -// Arduino "shield" connector port definitions (MAX32625MBED shown) -#if defined(TARGET_MAX32625MBED) -#define A0 AIN_0 -#define A1 AIN_1 -#define A2 AIN_2 -#define A3 AIN_3 -#define D0 P0_0 -#define D1 P0_1 -#define D2 P0_2 -#define D3 P0_3 -#define D4 P0_4 -#define D5 P0_5 -#define D6 P0_6 -#define D7 P0_7 -#define D8 P1_4 -#define D9 P1_5 -#define D10 P1_3 -#define D11 P1_1 -#define D12 P1_2 -#define D13 P1_0 -#endif - -// example code declare SPI interface -#if defined(TARGET_MAX32625MBED) -SPI spi(SPI1_MOSI, SPI1_MISO, SPI1_SCK); // mosi, miso, sclk spi1 TARGET_MAX32625MBED: P1_1 P1_2 P1_0 Arduino 10-pin header D11 D12 D13 -DigitalOut spi_cs(SPI1_SS); // TARGET_MAX32625MBED: P1_3 Arduino 10-pin header D10 -#elif defined(TARGET_MAX32600MBED) -SPI spi(SPI2_MOSI, SPI2_MISO, SPI2_SCK); // mosi, miso, sclk spi1 TARGET_MAX32600MBED: Arduino 10-pin header D11 D12 D13 -DigitalOut spi_cs(SPI2_SS); // Generic: Arduino 10-pin header D10 -#else -SPI spi(D11, D12, D13); // mosi, miso, sclk spi1 TARGET_MAX32600MBED: Arduino 10-pin header D11 D12 D13 -DigitalOut spi_cs(D10); // Generic: Arduino 10-pin header D10 -#endif - -// example code declare GPIO interface pins -DigitalOut CONVRUN_pin(D9); // Digital Configuration Input to MAX11043 device -DigitalOut SHDN_pin(D8); // Digital Configuration Input to MAX11043 device -DigitalOut DACSTEP_pin(D7); // Digital Configuration Input to MAX11043 device -DigitalOut UP_slash_DWNb_pin(D6); // Digital Configuration Input to MAX11043 device -DigitalIn EOC_pin(D2); // Digital Event Output from MAX11043 device -// example code declare device instance -MAX11043 g_MAX11043_device(spi, spi_cs, CONVRUN_pin, SHDN_pin, DACSTEP_pin, UP_slash_DWNb_pin, EOC_pin, MAX11043::MAX11043_IC); - - -//---------------------------------------- -// Global SPI options -// - -//---------------------------------------- -// Global I2C options -// - -#define APPLICATION_ArduinoPinsMonitor 1 - -//-------------------------------------------------- -// use BUTTON1 trigger some action -#if defined(TARGET_MAX32630) -#define HAS_BUTTON1_DEMO_INTERRUPT 1 -#define HAS_BUTTON2_DEMO 0 -#define HAS_BUTTON2_DEMO_INTERRUPT 0 -#elif defined(TARGET_MAX32625PICO) -#warning "TARGET_MAX32625PICO not previously tested; need to define buttons..." -#define HAS_BUTTON1_DEMO_INTERRUPT 1 -#define HAS_BUTTON2_DEMO 0 -#define HAS_BUTTON2_DEMO_INTERRUPT 0 -#elif defined(TARGET_MAX32625) -#define HAS_BUTTON1_DEMO_INTERRUPT 1 -#define HAS_BUTTON2_DEMO_INTERRUPT 1 -#elif defined(TARGET_MAX32620FTHR) -#warning "TARGET_MAX32620FTHR not previously tested; need to define buttons..." -#define BUTTON1 SW1 -#define HAS_BUTTON1_DEMO_INTERRUPT 1 -#define HAS_BUTTON2_DEMO 0 -#define HAS_BUTTON2_DEMO_INTERRUPT 0 -#elif defined(TARGET_NUCLEO_F446RE) -#define HAS_BUTTON1_DEMO_INTERRUPT 0 -#define HAS_BUTTON2_DEMO_INTERRUPT 0 -#elif defined(TARGET_NUCLEO_F401RE) -#define HAS_BUTTON1_DEMO_INTERRUPT 0 -#define HAS_BUTTON2_DEMO_INTERRUPT 0 -#else -#warning "target not previously tested; need to define buttons..." -#endif -// -#ifndef HAS_BUTTON1_DEMO -#define HAS_BUTTON1_DEMO 0 -#endif -#ifndef HAS_BUTTON2_DEMO -#define HAS_BUTTON2_DEMO 0 -#endif -// -// avoid runtime error on button1 press [mbed-os-5.11] -// instead of using InterruptIn, use DigitalIn and poll in main while(1) -#ifndef HAS_BUTTON1_DEMO_INTERRUPT_POLLING -#define HAS_BUTTON1_DEMO_INTERRUPT_POLLING 1 -#endif -// -#ifndef HAS_BUTTON1_DEMO_INTERRUPT -#define HAS_BUTTON1_DEMO_INTERRUPT 1 -#endif -#ifndef HAS_BUTTON2_DEMO_INTERRUPT -#define HAS_BUTTON2_DEMO_INTERRUPT 1 -#endif -// -#if HAS_BUTTON1_DEMO_INTERRUPT -# if HAS_BUTTON1_DEMO_INTERRUPT_POLLING -// avoid runtime error on button1 press [mbed-os-5.11] -// instead of using InterruptIn, use DigitalIn and poll in main while(1) -DigitalIn button1(BUTTON1); -# else -InterruptIn button1(BUTTON1); -# endif -#elif HAS_BUTTON1_DEMO -DigitalIn button1(BUTTON1); -#endif -#if HAS_BUTTON2_DEMO_INTERRUPT -# if HAS_BUTTON1_DEMO_INTERRUPT_POLLING -// avoid runtime error on button1 press [mbed-os-5.11] -// instead of using InterruptIn, use DigitalIn and poll in main while(1) -DigitalIn button2(BUTTON2); -# else -InterruptIn button2(BUTTON2); -# endif -#elif HAS_BUTTON2_DEMO -DigitalIn button2(BUTTON2); -#endif - -//-------------------------------------------------- -// When user presses button BUTTON1, perform self test -#if HAS_BUTTON1_DEMO_INTERRUPT -void onButton1FallingEdge(void) -{ - void SelfTest(CmdLine & cmdLine); - SelfTest(cmdLine_serial); -} -#endif // HAS_BUTTON1_DEMO_INTERRUPT - -//-------------------------------------------------- -// When user presses button BUTTON2, perform demo configuration -#if HAS_BUTTON2_DEMO_INTERRUPT -void onButton2FallingEdge(void) -{ - // TBD demo configuration - // TODO diagnostic LED -} -#endif // HAS_BUTTON2_DEMO_INTERRUPT - -//-------------------------------------------------- -void SelfTest(CmdLine & cmdLine) -{ - //-------------------------------------------------- -#if analogIn4_IS_HIGH_RANGE_OF_analogIn0 - // Platform board uses AIN4,AIN5,.. as high range of AIN0,AIN1,.. - MaximTinyTester tinyTester(cmdLine, analogIn4, analogIn5, analogIn2, analogIn3, analogIn0, analogIn4, led1_RFailLED, led2_GPassLED, led3_BBusyLED); - tinyTester.analogInPin_fullScaleVoltage[0] = analogInPin_fullScaleVoltage[4]; // board support - tinyTester.analogInPin_fullScaleVoltage[1] = analogInPin_fullScaleVoltage[5]; // board support - tinyTester.analogInPin_fullScaleVoltage[2] = analogInPin_fullScaleVoltage[2]; // board support - tinyTester.analogInPin_fullScaleVoltage[3] = analogInPin_fullScaleVoltage[3]; // board support - tinyTester.analogInPin_fullScaleVoltage[4] = analogInPin_fullScaleVoltage[0]; // board support - tinyTester.analogInPin_fullScaleVoltage[5] = analogInPin_fullScaleVoltage[1]; // board support - // low range channels AIN0, AIN1, AIN2, AIN3 -#else // analogIn4_IS_HIGH_RANGE_OF_analogIn0 - // Platform board uses simple analog inputs - MaximTinyTester tinyTester(cmdLine, analogIn0, analogIn1, analogIn2, analogIn3, analogIn4, analogIn5, led1_RFailLED, led2_GPassLED, led3_BBusyLED); - tinyTester.analogInPin_fullScaleVoltage[0] = analogInPin_fullScaleVoltage[0]; // board support - tinyTester.analogInPin_fullScaleVoltage[1] = analogInPin_fullScaleVoltage[1]; // board support - tinyTester.analogInPin_fullScaleVoltage[2] = analogInPin_fullScaleVoltage[2]; // board support - tinyTester.analogInPin_fullScaleVoltage[3] = analogInPin_fullScaleVoltage[3]; // board support - tinyTester.analogInPin_fullScaleVoltage[4] = analogInPin_fullScaleVoltage[4]; // board support - tinyTester.analogInPin_fullScaleVoltage[5] = analogInPin_fullScaleVoltage[5]; // board support -#endif - tinyTester.clear(); - - // CODE GENERATOR: generate SelfTest based on function docstrings @test lines - - // -#if INJECT_SELFTEST_FAIL - // Test of the pass/fail report mechanism - tinyTester.FAIL(); - cmdLine.serial().print(F("injecting one false failure for test reporting")); -#endif - // - // Report number of pass and number of fail test results - tinyTester.Report_Summary(); -} - - -//-------------------------------------------------- -inline void print_command_prompt() -{ - cmdLine_serial.serial().printf("\r\n> "); - -} - - -//-------------------------------------------------- -void pinsMonitor_submenu_onEOLcommandParser(CmdLine& cmdLine) -{ - // % diagnostic commands submenu - // %Hpin -- digital output high - // %Lpin -- digital output low - // %?pin -- digital input - // %A %Apin -- analog input - // %Ppin df=xx -- pwm output - // %Wpin -- measure high pulsewidth input in usec - // %wpin -- measure low pulsewidth input in usec - // %I... -- I2C diagnostics - // %IP -- I2C probe - // %IC scl=100khz ADDR=? -- I2C configure - // %IW byte byte ... byte RD=? ADDR=0x -- write - // %IR ADDR=? RD=? -- read - // %I^ cmd=? -- i2c_smbus_read_word_data - // %S... -- SPI diagnostics - // %SC sclk=1Mhz -- SPI configure - // %SW -- write (write and read) - // %SR -- read (alias for %SW because SPI always write and read) - // A-Z,a-z,0-9 reserved for application use - // - char strPinIndex[3]; - strPinIndex[0] = cmdLine[2]; - strPinIndex[1] = cmdLine[3]; - strPinIndex[2] = '\0'; - int pinIndex = strtoul(strPinIndex, NULL, 10); // strtol(str, NULL, 10): get decimal value - //cmdLine.serial().printf(" pinIndex=%d ", pinIndex); - // - // get next character - switch (cmdLine[1]) - { -#if HAS_digitalInOuts - case 'H': case 'h': - { - // %Hpin -- digital output high -#if ARDUINO_STYLE - pinMode(pinIndex, OUTPUT); // digital pins 0, 1, 2, .. 13, analog input pins A0, A1, .. A5 - digitalWrite(pinIndex, HIGH); // digital pins 0, 1, 2, .. 13, analog input pins A0, A1, .. A5 -#else - DigitalInOut& digitalInOutPin = find_digitalInOutPin(pinIndex); - digitalInOutPin.output(); - digitalInOutPin.write(1); -#endif - cmdLine.serial().printf(" digitalInOutPin %d Output High ", pinIndex); - } - break; - case 'L': case 'l': - { - // %Lpin -- digital output low -#if ARDUINO_STYLE - pinMode(pinIndex, OUTPUT); // digital pins 0, 1, 2, .. 13, analog input pins A0, A1, .. A5 - digitalWrite(pinIndex, LOW); // digital pins 0, 1, 2, .. 13, analog input pins A0, A1, .. A5 -#else - DigitalInOut& digitalInOutPin = find_digitalInOutPin(pinIndex); - digitalInOutPin.output(); - digitalInOutPin.write(0); -#endif - cmdLine.serial().printf(" digitalInOutPin %d Output Low ", pinIndex); - } - break; - case '?': - { - // %?pin -- digital input -#if ARDUINO_STYLE - pinMode(pinIndex, INPUT); // digital pins 0, 1, 2, .. 13, analog input pins A0, A1, .. A5 -#else - DigitalInOut& digitalInOutPin = find_digitalInOutPin(pinIndex); - digitalInOutPin.input(); -#endif - serial.printf(" digitalInOutPin %d Input ", pinIndex); -#if ARDUINO_STYLE - int value = digitalRead(pinIndex); -#else - int value = digitalInOutPin.read(); -#endif - cmdLine.serial().printf("%d ", value); - } - break; -#endif - // -#if HAS_analogIns - case 'A': case 'a': - { - // %A %Apin -- analog input -#if analogIn4_IS_HIGH_RANGE_OF_analogIn0 - // Platform board uses AIN4,AIN5,.. as high range of AIN0,AIN1,.. - for (int pinIndex = 0; pinIndex < 2; pinIndex++) - { - int cPinIndex = '0' + pinIndex; - AnalogIn& analogInPin = find_analogInPin(cPinIndex); - float adc_full_scale_voltage = analogInPin_fullScaleVoltage[pinIndex]; - float normValue_0_1 = analogInPin.read(); - // - int pinIndexH = pinIndex + 4; - int cPinIndexH = '0' + pinIndexH; - AnalogIn& analogInPinH = find_analogInPin(cPinIndexH); - float adc_full_scale_voltageH = analogInPin_fullScaleVoltage[pinIndexH]; - float normValueH_0_1 = analogInPinH.read(); - // - cmdLine.serial().printf("AIN%c = %7.3f%% = %1.3fV AIN%c = %7.3f%% = %1.3fV \r\n", - cPinIndex, - normValue_0_1 * 100.0, - normValue_0_1 * adc_full_scale_voltage, - cPinIndexH, - normValueH_0_1 * 100.0, - normValueH_0_1 * adc_full_scale_voltageH - ); - } - for (int pinIndex = 2; pinIndex < 4; pinIndex++) - { - int cPinIndex = '0' + pinIndex; - AnalogIn& analogInPin = find_analogInPin(cPinIndex); - float adc_full_scale_voltage = analogInPin_fullScaleVoltage[pinIndex]; - float normValue_0_1 = analogInPin.read(); - // - cmdLine.serial().printf("AIN%c = %7.3f%% = %1.3fV\r\n", - cPinIndex, - normValue_0_1 * 100.0, - normValue_0_1 * adc_full_scale_voltage - ); - } -#else // analogIn4_IS_HIGH_RANGE_OF_analogIn0 - // Platform board uses simple analog inputs - // assume standard Arduino analog inputs A0-A5 - for (int pinIndex = 0; pinIndex < 6; pinIndex++) - { - int cPinIndex = '0' + pinIndex; - AnalogIn& analogInPin = find_analogInPin(cPinIndex); - float adc_full_scale_voltage = analogInPin_fullScaleVoltage[pinIndex]; - float normValue_0_1 = analogInPin.read(); - // - cmdLine.serial().printf("AIN%c = %7.3f%% = %1.3fV\r\n", - cPinIndex, - normValue_0_1 * 100.0, - normValue_0_1 * adc_full_scale_voltage - ); - } -#endif // analogIn4_IS_HIGH_RANGE_OF_analogIn0 - } - break; -#endif - // -#if HAS_SPI2_MAX541 - case 'D': case 'd': - { - // %D -- DAC output MAX541 (SPI2) -- need cmdLine.parse_float(voltageV) - // MAX541 max541(spi2_max541, spi2_max541_cs); - float voltageV = max541.Get_Voltage(); - // if (cmdLine[2] == '+') { - // // %D+ - // voltageV = voltageV * 1.25f; - // if (voltageV >= max541.VRef) voltageV = max541.VRef; - // SelfTest_MAX541_Voltage(cmdLine, max541, voltageV); - // } - // else if (cmdLine[2] == '-') { - // // %D- - // voltageV = voltageV * 0.75f; - // if (voltageV < 0.1f) voltageV = 0.1f; - // SelfTest_MAX541_Voltage(cmdLine, max541, voltageV); - // } - if (cmdLine.parse_float("V", voltageV)) - { - // %D V=1.234 -- set voltage - max541.Set_Voltage(voltageV); - } - else if (cmdLine.parse_float("TEST", voltageV)) - { - // %D TEST=1.234 -- set voltage and compare with AIN0 - SelfTest_MAX541_Voltage(cmdLine, max541, voltageV); - } - else if (cmdLine.parse_float("CAL", voltageV)) - { - // %D CAL=1.234 -- calibrate VRef and compare with AIN0 - - max541.Set_Code(0x8000); // we don't know the fullscale voltage yet, so set code to midscale - double max541_midscale_V = analogInPin_fullScaleVoltage[4] * analogIn4.read(); // TARGET_MAX32630 J1.5 AIN_4 = AIN0 / 5.0 fullscale is 6.0V - const int average_count = 100; - const double average_K = 0.25; - for (int count = 0; count < average_count; count++) { - double measurement_V = analogInPin_fullScaleVoltage[4] * analogIn4.read(); // TARGET_MAX32630 J1.5 AIN_4 = AIN0 / 5.0 fullscale is 6.0V - max541_midscale_V = ((1 - average_K) * max541_midscale_V) + (average_K * measurement_V); - } - max541.VRef = 2.0 * max541_midscale_V; - cmdLine.serial().printf( - "\r\n MAX541 midscale = %1.3fV, so fullscale = %1.3fV", - max541_midscale_V, max541.VRef); - // Detect whether MAX541 is really connected to MAX32625MBED.AIN0/AIN4 - voltageV = 1.0f; - SelfTest_MAX541_Voltage(cmdLine, max541, voltageV); - } - else { - // %D -- print MAX541 DAC status - cmdLine.serial().printf("MAX541 code=0x%4.4x = %1.3fV VRef=%1.3fV\r\n", - max541.Get_Code(), max541.Get_Voltage(), max541.VRef); - } - } - break; -#endif - - // -#if HAS_I2C // SUPPORT_I2C - case 'I': case 'i': - // %I... -- I2C diagnostics - // %IP -- I2C probe - // %IC scl=100khz ADDR=? -- I2C configure - // %IW byte byte ... byte RD=? ADDR=0x -- write - // %IR ADDR=? RD=? -- read - // %I^ cmd=? -- i2c_smbus_read_word_data - // get next character - // TODO: parse cmdLine arg (ADDR=\d+)? --> g_I2C_deviceAddress7 - cmdLine.parse_byte_hex("ADDR", g_I2C_deviceAddress7); - // TODO: parse cmdLine arg (RD=\d)? --> g_I2C_read_count - g_I2C_read_count = 0; // read count must be reset every command - cmdLine.parse_byte_dec("RD", g_I2C_read_count); - // TODO: parse cmdLine arg (CMD=\d)? --> g_I2C_command_regAddress - cmdLine.parse_byte_hex("CMD", g_I2C_command_regAddress); - switch (cmdLine[2]) - { - case 'P': case 'p': - { - // %IP -- I2C probe - HuntAttachedI2CDevices(cmdLine, 0x03, 0x77); - } - break; - case 'C': case 'c': - { - bool isUpdatedI2CConfig = false; - // %IC scl=100khz ADDR=? -- I2C configure - // parse cmdLine arg (SCL=\d+(kHZ|MHZ)?)? --> g_I2C_SCL_Hz - if (cmdLine.parse_frequency_Hz("SCL", g_I2C_SCL_Hz)) - { - isUpdatedI2CConfig = true; - // TODO1: validate g_I2C_SCL_Hz against system clock frequency F_CPU - if (g_I2C_SCL_Hz > limit_max_I2C_SCL_Hz) - { - g_I2C_SCL_Hz = limit_max_I2C_SCL_Hz; - } - if (g_I2C_SCL_Hz < limit_min_I2C_SCL_Hz) - { - g_I2C_SCL_Hz = limit_min_I2C_SCL_Hz; - } - } - if (isUpdatedI2CConfig) - { - // declare in narrower scope: MAX32625MBED I2C i2cMaster(...) - I2C i2cMaster(I2C0_SDA, I2C0_SCL); // sda scl TARGET_MAX32635MBED: P1_6, P1_7 Arduino 10-pin header - i2cMaster.frequency(g_I2C_SCL_Hz); - i2cMaster.start(); - i2cMaster.stop(); - i2cMaster.frequency(g_I2C_SCL_Hz); - cmdLine.serial().printf( - "\r\n %%IC ADDR=0x%2.2x=(0x%2.2x>>1) SCL=%d=%1.3fkHz -- I2C config", - g_I2C_deviceAddress7, (g_I2C_deviceAddress7 << 1), g_I2C_SCL_Hz, - (g_I2C_SCL_Hz / 1000.)); - i2cMaster.start(); - i2cMaster.stop(); - } - } - break; - case 'W': case 'w': - { - // declare in narrower scope: MAX32625MBED I2C i2cMaster(...) - I2C i2cMaster(I2C0_SDA, I2C0_SCL); // sda scl TARGET_MAX32635MBED: P1_6, P1_7 Arduino 10-pin header - i2cMaster.frequency(g_I2C_SCL_Hz); - // %IW byte byte ... byte RD=? ADDR=0x -- write - // parse cmdLine byte list --> int byteCount; int mosiData[MAX_SPI_BYTE_COUNT]; - #define MAX_I2C_BYTE_COUNT 32 - size_t byteCount = byteCount; - static char mosiData[MAX_I2C_BYTE_COUNT]; - static char misoData[MAX_I2C_BYTE_COUNT]; - if (cmdLine.parse_byteCount_byteList_hex(byteCount, mosiData, - MAX_I2C_BYTE_COUNT)) - { - // hex dump mosiData[0..byteCount-1] - cmdLine.serial().printf( - "\r\nADDR=0x%2.2x=(0x%2.2x>>1) byteCount:%d RD=%d\r\nI2C MOSI->", - g_I2C_deviceAddress7, - (g_I2C_deviceAddress7 << 1), byteCount, g_I2C_read_count); - for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) - { - cmdLine.serial().printf(" 0x%2.2X", mosiData[byteIndex]); - } - // - // TODO: i2c transfer - //const int addr7bit = 0x48; // 7 bit I2C address - //const int addr8bit = 0x48 << 1; // 8bit I2C address, 0x90 - // /* int */ i2cMaster.read (int addr8bit, char *data, int length, bool repeated=false) // Read from an I2C slave. - // /* int */ i2cMaster.read (int ack) // Read a single byte from the I2C bus. - // /* int */ i2cMaster.write (int addr8bit, const char *data, int length, bool repeated=false) // Write to an I2C slave. - // /* int */ i2cMaster.write (int data) // Write single byte out on the I2C bus. - // /* void */ i2cMaster.start (void) // Creates a start condition on the I2C bus. - // /* void */ i2cMaster.stop (void) // Creates a stop condition on the I2C bus. - // /* int */ i2cMaster.transfer (int addr8bit, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, const event_callback_t &callback, int event=I2C_EVENT_TRANSFER_COMPLETE, bool repeated=false) // Start nonblocking I2C transfer. More... - // /* void */ i2cMaster.abort_transfer () // Abort the ongoing I2C transfer. More... - const int addr8bit = g_I2C_deviceAddress7 << 1; // 8bit I2C address, 0x90 - unsigned int misoLength = 0; - bool repeated = (g_I2C_read_count > 0); - // - int writeStatus = i2cMaster.write (addr8bit, mosiData, byteCount, repeated); - switch (writeStatus) - { - case 0: cmdLine.serial().printf(" ack "); break; - case 1: cmdLine.serial().printf(" nack "); break; - default: cmdLine.serial().printf(" {writeStatus 0x%2.2X} ", - writeStatus); - } - if (repeated) - { - int readStatus = - i2cMaster.read (addr8bit, misoData, g_I2C_read_count, false); - switch (readStatus) - { - case 1: cmdLine.serial().printf(" nack "); break; - case 0: cmdLine.serial().printf(" ack "); break; - default: cmdLine.serial().printf(" {readStatus 0x%2.2X} ", - readStatus); - } - } - // - if (misoLength > 0) - { - // hex dump misoData[0..byteCount-1] - cmdLine.serial().printf(" MISO<-"); - for (unsigned int byteIndex = 0; byteIndex < g_I2C_read_count; - byteIndex++) - { - cmdLine.serial().printf(" 0x%2.2X", misoData[byteIndex]); - } - } - cmdLine.serial().printf(" "); - } - } - break; - case 'R': case 'r': - { - // declare in narrower scope: MAX32625MBED I2C i2cMaster(...) - I2C i2cMaster(I2C0_SDA, I2C0_SCL); // sda scl TARGET_MAX32635MBED: P1_6, P1_7 Arduino 10-pin header - i2cMaster.frequency(g_I2C_SCL_Hz); - // %IR ADDR=? RD=? -- read - // TODO: i2c transfer - //const int addr7bit = 0x48; // 7 bit I2C address - //const int addr8bit = 0x48 << 1; // 8bit I2C address, 0x90 - // /* int */ i2cMaster.read (int addr8bit, char *data, int length, bool repeated=false) // Read from an I2C slave. - // /* int */ i2cMaster.read (int ack) // Read a single byte from the I2C bus. - // /* int */ i2cMaster.write (int addr8bit, const char *data, int length, bool repeated=false) // Write to an I2C slave. - // /* int */ i2cMaster.write (int data) // Write single byte out on the I2C bus. - // /* void */ i2cMaster.start (void) // Creates a start condition on the I2C bus. - // /* void */ i2cMaster.stop (void) // Creates a stop condition on the I2C bus. - // /* int */ i2cMaster.transfer (int addr8bit, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, const event_callback_t &callback, int event=I2C_EVENT_TRANSFER_COMPLETE, bool repeated=false) // Start nonblocking I2C transfer. More... - // /* void */ i2cMaster.abort_transfer () // Abort the ongoing I2C transfer. More... - } - break; - case '^': - { - // declare in narrower scope: MAX32625MBED I2C i2cMaster(...) - I2C i2cMaster(I2C0_SDA, I2C0_SCL); // sda scl TARGET_MAX32635MBED: P1_6, P1_7 Arduino 10-pin header - i2cMaster.frequency(g_I2C_SCL_Hz); - // %I^ cmd=? -- i2c_smbus_read_word_data - // TODO: i2c transfer - //const int addr7bit = 0x48; // 7 bit I2C address - //const int addr8bit = 0x48 << 1; // 8bit I2C address, 0x90 - // /* int */ i2cMaster.read (int addr8bit, char *data, int length, bool repeated=false) // Read from an I2C slave. - // /* int */ i2cMaster.read (int ack) // Read a single byte from the I2C bus. - // /* int */ i2cMaster.write (int addr8bit, const char *data, int length, bool repeated=false) // Write to an I2C slave. - // /* int */ i2cMaster.write (int data) // Write single byte out on the I2C bus. - // /* void */ i2cMaster.start (void) // Creates a start condition on the I2C bus. - // /* void */ i2cMaster.stop (void) // Creates a stop condition on the I2C bus. - // /* int */ i2cMaster.transfer (int addr8bit, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, const event_callback_t &callback, int event=I2C_EVENT_TRANSFER_COMPLETE, bool repeated=false) // Start nonblocking I2C transfer. More... - // /* void */ i2cMaster.abort_transfer () // Abort the ongoing I2C transfer. More... - } - break; - } // switch(cmdLine[2]) - break; -#endif - // -#if HAS_SPI // SUPPORT_SPI - case 'S': case 's': - { - // %S... -- SPI diagnostics - // %SC sclk=1Mhz -- SPI configure - // %SW -- write (write and read) - // %SR -- read (alias for %SW because SPI always write and read) - // - // Process arguments SCLK=\d+(kHZ|MHZ) CPOL=\d CPHA=\d - bool isUpdatedSPIConfig = false; - // parse cmdLine arg (CPOL=\d)? --> g_SPI_dataMode | SPI_MODE2 - // parse cmdLine arg (CPHA=\d)? --> g_SPI_dataMode | SPI_MODE1 - if (cmdLine.parse_flag("CPOL", g_SPI_dataMode, SPI_MODE2)) - { - isUpdatedSPIConfig = true; - } - if (cmdLine.parse_flag("CPHA", g_SPI_dataMode, SPI_MODE1)) - { - isUpdatedSPIConfig = true; - } - if (cmdLine.parse_flag("CS", g_SPI_cs_state, 1)) - { - isUpdatedSPIConfig = true; - } - // parse cmdLine arg (SCLK=\d+(kHZ|MHZ)?)? --> g_SPI_SCLK_Hz - if (cmdLine.parse_frequency_Hz("SCLK", g_SPI_SCLK_Hz)) - { - isUpdatedSPIConfig = true; - // TODO1: validate g_SPI_SCLK_Hz against system clock frequency F_CPU - if (g_SPI_SCLK_Hz > limit_max_SPI_SCLK_Hz) - { - g_SPI_SCLK_Hz = limit_max_SPI_SCLK_Hz; - } - if (g_SPI_SCLK_Hz < limit_min_SPI_SCLK_Hz) - { - g_SPI_SCLK_Hz = limit_min_SPI_SCLK_Hz; - } - } - // Update SPI configuration - if (isUpdatedSPIConfig) - { - // %SC sclk=1Mhz -- SPI configure - spi_cs = g_SPI_cs_state; - spi.format(8,g_SPI_dataMode); // int bits_must_be_8, int mode=0_3 CPOL=0,CPHA=0 -#if APPLICATION_MAX5715 - g_MAX5715_device.spi_frequency(g_SPI_SCLK_Hz); -#elif APPLICATION_MAX11131 - g_MAX11131_device.spi_frequency(g_SPI_SCLK_Hz); -#elif APPLICATION_MAX5171 - g_MAX5171_device.spi_frequency(g_SPI_SCLK_Hz); -#elif APPLICATION_MAX11410 - g_MAX11410_device.spi_frequency(g_SPI_SCLK_Hz); -#elif APPLICATION_MAX12345 - g_MAX12345_device.spi_frequency(g_SPI_SCLK_Hz); -#else - spi.frequency(g_SPI_SCLK_Hz); // int SCLK_Hz=1000000 = 1MHz (initial default) -#endif - // - double ideal_divisor = ((double)SystemCoreClock) / g_SPI_SCLK_Hz; - int actual_divisor = (int)(ideal_divisor + 0.0); // frequency divisor truncate - double actual_SCLK_Hz = SystemCoreClock / actual_divisor; - // - // fixed: mbed-os-5.11: [Warning] format '%d' expects argument of type 'int', but argument 6 has type 'uint32_t {aka long unsigned int}' [-Wformat=] - cmdLine.serial().printf( - "\r\n %%SC CPOL=%d CPHA=%d CS=%d SCLK=%ld=%1.3fMHz (%1.1fMHz/%1.2f = actual %1.3fMHz) -- SPI config", - ((g_SPI_dataMode & SPI_MODE2) ? 1 : 0), - ((g_SPI_dataMode & SPI_MODE1) ? 1 : 0), - g_SPI_cs_state, - g_SPI_SCLK_Hz, - (g_SPI_SCLK_Hz / 1000000.), - ((double)(SystemCoreClock / 1000000.)), - ideal_divisor, - (actual_SCLK_Hz / 1000000.) - ); - } - // get next character - switch (cmdLine[2]) - { - case 'C': case 's': - // %SC sclk=1Mhz -- SPI configure - break; - case 'W': case 'R': case 'w': case 'r': - { - // %SW -- write (write and read) - // %SR -- read (alias for %SW because SPI always write and read) - // parse cmdLine byte list --> int byteCount; int mosiData[MAX_SPI_BYTE_COUNT]; - #define MAX_SPI_BYTE_COUNT 32 - size_t byteCount = byteCount; - static char mosiData[MAX_SPI_BYTE_COUNT]; - static char misoData[MAX_SPI_BYTE_COUNT]; - if (cmdLine.parse_byteCount_byteList_hex(byteCount, mosiData, - MAX_SPI_BYTE_COUNT)) - { - // hex dump mosiData[0..byteCount-1] - cmdLine.serial().printf("\r\nSPI"); - if (byteCount > 7) { - cmdLine.serial().printf(" byteCount:%d", byteCount); - } - cmdLine.serial().printf(" MOSI->"); - for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) - { - cmdLine.serial().printf(" 0x%2.2X", mosiData[byteIndex]); - } - spi_cs = 0; - unsigned int numBytesTransferred = - spi.write(mosiData, byteCount, misoData, byteCount); - spi_cs = 1; - // hex dump misoData[0..byteCount-1] - cmdLine.serial().printf(" MISO<-"); - for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; - byteIndex++) - { - cmdLine.serial().printf(" 0x%2.2X", misoData[byteIndex]); - } - cmdLine.serial().printf(" "); - } - } - break; - } // switch(cmdLine[2]) - } // case 'S': // %S... -- SPI diagnostics - break; -#endif - // - // A-Z,a-z,0-9 reserved for application use - } // switch(cmdLine[1]) -} // end void pinsMonitor_submenu_onEOLcommandParser(CmdLine & cmdLine) - - -//-------------------------------------------------- -void main_menu_status(CmdLine & cmdLine) -{ - cmdLine.serial().printf("\r\nMain menu"); - - cmdLine.serial().printf(" MAX11043 24-bit 200ksps Delta-Sigma ADC"); - - //cmdLine.serial().print(" %s", TARGET_NAME); - if (cmdLine.nameStr()) - { - cmdLine.serial().printf(" [%s]", cmdLine.nameStr()); - - } - cmdLine.serial().printf("\r\n ? -- help"); - -} - - -//-------------------------------------------------- -void main_menu_help(CmdLine & cmdLine) -{ - // ? -- help - //~ cmdLine.serial().print(F("\r\nMenu:")); - cmdLine.serial().printf("\r\n # -- lines beginning with # are comments"); - - cmdLine.serial().printf("\r\n . -- SelfTest"); - - //cmdLine.serial().print(F("\r\n ! -- Initial Configuration")); - // - // % standardize diagnostic commands - // %Hpin -- digital output high - // %Lpin -- digital output low - // %?pin -- digital input - // %A %Apin -- analog input - // %Ppin df=xx -- pwm output - // %Wpin -- measure high pulsewidth input in usec - // %wpin -- measure low pulsewidth input in usec - // %I... -- I2C diagnostics - // %IP -- I2C probe - // %IC scl=100khz ADDR=? -- I2C configure - // %IW ADDR=? cmd=? data,data,data -- write - // %IR ADDR=? RD=? -- read - // %I^ cmd=? -- i2c_smbus_read_word_data - // %S... -- SPI diagnostics - // %SC sclk=1Mhz -- SPI configure - // %SW -- write (write and read) - // %SR -- read (alias for %SW because SPI always write and read) - // A-Z,a-z,0-9 reserved for application use - // -#if HAS_digitalInOuts - // %Hpin -- digital output high - // %Lpin -- digital output low - // %?pin -- digital input - cmdLine.serial().printf("\r\n %%Hn {pin:"); - list_digitalInOutPins(cmdLine.serial()); - cmdLine.serial().printf("} -- High Output"); - cmdLine.serial().printf("\r\n %%Ln {pin:"); - list_digitalInOutPins(cmdLine.serial()); - cmdLine.serial().printf("} -- Low Output"); - cmdLine.serial().printf("\r\n %%?n {pin:"); - list_digitalInOutPins(cmdLine.serial()); - cmdLine.serial().printf("} -- Input"); -#endif - -#if HAS_analogIns - // Menu A) analogRead A0..7 - // %A %Apin -- analog input - // analogRead(pinIndex) // analog input pins A0, A1, A2, A3, A4, A5; float voltage = analogRead(A0) * (5.0 / 1023.0) - cmdLine.serial().printf("\r\n %%A -- analogRead"); -#endif - -#if HAS_SPI2_MAX541 - // TODO1: MAX541 max541(spi2_max541, spi2_max541_cs); - cmdLine.serial().printf("\r\n %%D -- DAC output MAX541 (SPI2)"); -#endif - -#if HAS_I2C // SUPPORT_I2C - // TODO: support I2C HAS_I2C // SUPPORT_I2C - // VERIFY: I2C utility commands SUPPORT_I2C - // VERIFY: report g_I2C_SCL_Hz = (F_CPU / ((TWBR * 2) + 16)) from last Wire_Sr.setClock(I2C_SCL_Hz); - // %I... -- I2C diagnostics - // %IP -- I2C probe - // %IC scl=100khz ADDR=? -- I2C configure - // %IW byte byte ... byte RD=? ADDR=0x -- write - // %IR ADDR=? RD=? -- read - // %I^ cmd=? -- i2c_smbus_read_word_data - //g_I2C_SCL_Hz = (F_CPU / ((TWBR * 2) + 16)); // 'F_CPU' 'TWBR' not declared in this scope - cmdLine.serial().printf("\r\n %%IC ADDR=0x%2.2x=(0x%2.2x>>1) SCL=%d=%1.3fkHz -- I2C config", - g_I2C_deviceAddress7, (g_I2C_deviceAddress7 << 1), g_I2C_SCL_Hz, - (g_I2C_SCL_Hz / 1000.)); - cmdLine.serial().printf("\r\n %%IW byte byte ... byte RD=? ADDR=0x%2.2x -- I2C write/read", - g_I2C_deviceAddress7); - // -#if SUPPORT_I2C - // Menu ^ cmd=?) i2c_smbus_read_word_data - cmdLine.serial().printf("\r\n %%I^ cmd=? -- i2c_smbus_read_word_data"); - // test low-level I2C i2c_smbus_read_word_data -#endif // SUPPORT_I2C - //cmdLine.serial().printf(" H) Hunt for attached I2C devices"); - cmdLine.serial().printf("\r\n %%IP -- I2C Probe for attached devices"); - // cmdLine.serial().printf(" s) search i2c address"); -#endif // SUPPORT_I2C - -#if HAS_SPI // SUPPORT_SPI - // TODO: support SPI HAS_SPI // SUPPORT_SPI - // SPI test command S (mosiData)+ - // %S... -- SPI diagnostics - // %SC sclk=1Mhz -- SPI configure - // %SW -- write (write and read) - // %SR -- read (alias for %SW because SPI always write and read) - // spi.format(8,0); // int bits_must_be_8, int mode=0_3 CPOL=0,CPHA=0 rising edge (initial default) - // spi.format(8,1); // int bits_must_be_8, int mode=0_3 CPOL=0,CPHA=1 falling edge (initial default) - // spi.format(8,2); // int bits_must_be_8, int mode=0_3 CPOL=1,CPHA=0 falling edge (initial default) - // spi.format(8,3); // int bits_must_be_8, int mode=0_3 CPOL=1,CPHA=1 rising edge (initial default) - // spi.frequency(1000000); // int SCLK_Hz=1000000 = 1MHz (initial default) - // mode | POL PHA - // -----+-------- - // 0 | 0 0 - // 1 | 0 1 - // 2 | 1 0 - // 3 | 1 1 - //cmdLine.serial().printf(" S) SPI mosi,mosi,...mosi hex bytes SCLK=1000000 CPOL=0 CPHA=0"); - // fixed: mbed-os-5.11: [Warning] format '%d' expects argument of type 'int', but argument 3 has type 'uint32_t {aka long unsigned int}' [-Wformat=] - cmdLine.serial().printf("\r\n %%SC SCLK=%ld=%1.3fMHz CPOL=%d CPHA=%d -- SPI config", - g_SPI_SCLK_Hz, (g_SPI_SCLK_Hz / 1000000.), - ((g_SPI_dataMode & SPI_MODE2) ? 1 : 0), - ((g_SPI_dataMode & SPI_MODE1) ? 1 : 0)); - cmdLine.serial().printf("\r\n %%SW mosi,mosi,...mosi -- SPI write hex bytes"); - // VERIFY: parse new SPI settings parse_strCommandArgs() SCLK=1000000 CPOL=0 CPHA=0 -#endif // SUPPORT_SPI - // - // Application-specific commands (help text) here - // -#if APPLICATION_ArduinoPinsMonitor - cmdLine.serial().printf("\r\n A-Z,a-z,0-9 -- reserved for application use"); // ArduinoPinsMonitor -#endif // APPLICATION_ArduinoPinsMonitor - // - - extern bool MAX11043_menu_help(CmdLine & cmdLine); // defined in Test_Menu_MAX11043.cpp\n - MAX11043_menu_help(cmdLine); -} - - - -//-------------------------------------------------- -// main menu command-line parser -// invoked by CmdLine::append(char ch) or CmdLine::idleAppendIfReadable() -void main_menu_onEOLcommandParser(CmdLine & cmdLine) -{ - // DIAGNOSTIC: print line buffer - //~ cmdLine.serial().printf("\r\nmain_menu_onEOLcommandParser: ~%s~\r\n", cmdLine.str()); - // - switch (cmdLine[0]) - { - case '?': - main_menu_status(cmdLine); - main_menu_help(cmdLine); - // print command prompt - //cmdLine.serial().printf("\r\n>"); - break; - case '\r': case '\n': // ignore blank line - case '\0': // ignore empty line - case '#': // ignore comment line - // # -- lines beginning with # are comments - main_menu_status(cmdLine); - //~ main_menu_help(cmdLine); - // print command prompt - //cmdLine.serial().printf("\r\n>"); - break; -#if ECHO_EOF_ON_EOL - case '\x04': // Unicode (U+0004) EOT END OF TRANSMISSION = CTRL+D as EOF end of file - cmdLine.serial().printf("\x04"); // immediately echo EOF for test scripting - diagnostic_led_EOF(); - break; - case '\x1a': // Unicode (U+001A) SUB SUBSTITUTE = CTRL+Z as EOF end of file - cmdLine.serial().printf("\x1a"); // immediately echo EOF for test scripting - diagnostic_led_EOF(); - break; -#endif -#if APPLICATION_ArduinoPinsMonitor - case '.': - { - // . -- SelfTest - cmdLine.serial().printf("SelfTest()"); - SelfTest(cmdLine); - } - break; - case '%': - { - pinsMonitor_submenu_onEOLcommandParser(cmdLine); - } - break; // case '%' -#endif // APPLICATION_ArduinoPinsMonitor - // - // Application-specific commands here - // alphanumeric command codes A-Z,a-z,0-9 reserved for application use - // -#if APPLICATION_ArduinoPinsMonitor -#endif // APPLICATION_ArduinoPinsMonitor - - // - // add new commands here - // - default: - extern bool MAX11043_menu_onEOLcommandParser(CmdLine & cmdLine); // defined in Test_Menu_MAX11043.cpp - if (!MAX11043_menu_onEOLcommandParser(cmdLine)) - { // not_handled_by_device_submenu - cmdLine.serial().printf("\r\n unknown command 0x%2.2x \"%s\"\r\n", cmdLine.str()[0], cmdLine.str()); - -# if HAS_DAPLINK_SERIAL - cmdLine_DAPLINKserial.serial().printf("\r\n unknown command 0x%2.2x \"%s\"\r\n", cmdLine.str()[0], cmdLine.str()); - -# endif // HAS_DAPLINK_SERIAL - } - } // switch (cmdLine[0]) -// -// print command prompt - cmdLine.serial().printf("\r\nMAX11043 > "); - -} // end void main_menu_onEOLcommandParser(CmdLine & cmdLine) - -//-------------------------------------------------- -void InitializeConfiguration() -{ - // CODE GENERATOR: example code: member function Init -# if HAS_DAPLINK_SERIAL - cmdLine_DAPLINKserial.serial().printf("\r\nMAX11043_Init()"); - -# endif - cmdLine_serial.serial().printf("\r\nMAX11043_Init()"); - - int initResult = g_MAX11043_device.Init(); // defined in #include MAX11043.h -# if HAS_DAPLINK_SERIAL - cmdLine_DAPLINKserial.serial().printf("\r\nMAX11043_Init() returned %d\r\n", initResult); - -# endif - cmdLine_serial.serial().printf("\r\nMAX11043_Init() returned %d\r\n", initResult); - -# if MAX11043_ONSPIPRINT - // Optional Diagnostic function to print SPI transactions - g_MAX11043_device.onSPIprint = onSPIprint_handler; -# endif -} - -//-------------------------------------------------- -// diagnostic rbg led GREEN -void diagnostic_led_EOF() -{ -#if USE_LEDS - led1 = LED_ON; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led RED+GREEN=YELLOW - // TODO1: mbed-os-5.11: [Warning] 'static osStatus rtos::Thread::wait(uint32_t)' is deprecated: Static methods only affecting current thread cause confusion. Replaced by ThisThread::sleep_for. [since mbed-os-5.10] [-Wdeprecated-declarations] - ThisThread::sleep_for(250); // [since mbed-os-5.10] vs Thread::wait(250); - led1 = LED_OFF; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led GREEN - ThisThread::sleep_for(250); // [since mbed-os-5.10] vs Thread::wait(250); - led1 = LED_ON; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led RED+GREEN=YELLOW - ThisThread::sleep_for(250); // [since mbed-os-5.10] vs Thread::wait(250); - led1 = LED_OFF; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led GREEN - ThisThread::sleep_for(250); // [since mbed-os-5.10] vs Thread::wait(250); -#endif // USE_LEDS -} - -//-------------------------------------------------- -// Support commands that get handled immediately w/o waiting for EOL -// handled as immediate command, do not append to buffer -void on_immediate_0x21() // Unicode (U+0021) ! EXCLAMATION MARK -{ -#if USE_LEDS - led1 = LED_OFF; led2 = LED_OFF; led3 = LED_ON; // diagnostic rbg led BLUE -#endif // USE_LEDS - InitializeConfiguration(); - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); -} - -//-------------------------------------------------- -// Support commands that get handled immediately w/o waiting for EOL -// handled as immediate command, do not append to buffer -void on_immediate_0x7b() // Unicode (U+007B) { LEFT CURLY BRACKET -{ -#if HAS_BUTTON2_DEMO_INTERRUPT - onButton2FallingEdge(); -#endif -} - -//-------------------------------------------------- -// Support commands that get handled immediately w/o waiting for EOL -// handled as immediate command, do not append to buffer -void on_immediate_0x7d() // Unicode (U+007D) } RIGHT CURLY BRACKET -{ -#if HAS_BUTTON1_DEMO_INTERRUPT - onButton1FallingEdge(); -#endif -} - -//---------------------------------------- -// example code main function -int main() -{ - // Configure serial ports - cmdLine_serial.clear(); - //~ cmdLine_serial.serial().printf("\r\n cmdLine_serial.serial().printf test\r\n"); - cmdLine_serial.onEOLcommandParser = main_menu_onEOLcommandParser; - cmdLine_serial.diagnostic_led_EOF = diagnostic_led_EOF; - /// CmdLine::set_immediate_handler(char, functionPointer_void_void_on_immediate_0x21); - cmdLine_serial.on_immediate_0x21 = on_immediate_0x21; - cmdLine_serial.on_immediate_0x7b = on_immediate_0x7b; - cmdLine_serial.on_immediate_0x7d = on_immediate_0x7d; -# if HAS_DAPLINK_SERIAL - cmdLine_DAPLINKserial.clear(); - //~ cmdLine_DAPLINKserial.serial().printf("\r\n cmdLine_DAPLINKserial.serial().printf test\r\n"); - cmdLine_DAPLINKserial.onEOLcommandParser = main_menu_onEOLcommandParser; - /// @todo CmdLine::set_immediate_handler(char, functionPointer_void_void_on_immediate_0x21); - cmdLine_DAPLINKserial.on_immediate_0x21 = on_immediate_0x21; - cmdLine_DAPLINKserial.on_immediate_0x7b = on_immediate_0x7b; - cmdLine_DAPLINKserial.on_immediate_0x7d = on_immediate_0x7d; -# endif - - - //print_banner(); - - - -#if USE_LEDS -#if defined(TARGET_MAX32630) - led1 = LED_ON; led2 = LED_OFF; led3 = LED_OFF; // diagnostic rbg led RED - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); - led1 = LED_OFF; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led GREEN - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); - led1 = LED_OFF; led2 = LED_OFF; led3 = LED_ON; // diagnostic rbg led BLUE - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); - led1 = LED_ON; led2 = LED_ON; led3 = LED_ON; // diagnostic rbg led RED+GREEN+BLUE=WHITE - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); - led1 = LED_OFF; led2 = LED_ON; led3 = LED_ON; // diagnostic rbg led GREEN+BLUE=CYAN - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); - led1 = LED_ON; led2 = LED_OFF; led3 = LED_ON; // diagnostic rbg led RED+BLUE=MAGENTA - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); - led1 = LED_ON; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led RED+GREEN=YELLOW - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); - led1 = LED_OFF; led2 = LED_OFF; led3 = LED_OFF; // diagnostic rbg led BLACK - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); -#elif defined(TARGET_MAX32625MBED) - led1 = LED_ON; led2 = LED_OFF; led3 = LED_OFF; // diagnostic rbg led RED - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); - led1 = LED_OFF; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led GREEN - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); - led1 = LED_OFF; led2 = LED_OFF; led3 = LED_ON; // diagnostic rbg led BLUE - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); - led1 = LED_ON; led2 = LED_ON; led3 = LED_ON; // diagnostic rbg led RED+GREEN+BLUE=WHITE - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); - led1 = LED_OFF; led2 = LED_ON; led3 = LED_ON; // diagnostic rbg led GREEN+BLUE=CYAN - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); - led1 = LED_ON; led2 = LED_OFF; led3 = LED_ON; // diagnostic rbg led RED+BLUE=MAGENTA - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); - led1 = LED_ON; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led RED+GREEN=YELLOW - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); - led1 = LED_OFF; led2 = LED_OFF; led3 = LED_OFF; // diagnostic rbg led BLACK - ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); -#else // not defined(TARGET_LPC1768 etc.) - led1 = LED_ON; - led2 = LED_OFF; - led3 = LED_OFF; - led4 = LED_OFF; - ThisThread::sleep_for(75); // [since mbed-os-5.10] vs Thread::wait(75); - //led1 = LED_ON; - led2 = LED_ON; - ThisThread::sleep_for(75); // [since mbed-os-5.10] vs Thread::wait(75); - led1 = LED_OFF; - //led2 = LED_ON; - led3 = LED_ON; - ThisThread::sleep_for(75); // [since mbed-os-5.10] vs Thread::wait(75); - led2 = LED_OFF; - //led3 = LED_ON; - led4 = LED_ON; - ThisThread::sleep_for(75); // [since mbed-os-5.10] vs Thread::wait(75); - led3 = LED_OFF; - led4 = LED_ON; - // -#endif // target definition -#endif - - // cmd_TE(); - -// #if USE_LEDS -// rgb_led.white(); // diagnostic rbg led RED+GREEN+BLUE=WHITE -// #endif // USE_LEDS - led1 = LED_ON; - led2 = LED_ON; - led3 = LED_ON; - - InitializeConfiguration(); - // CODE GENERATOR: example code: member function Init - g_MAX11043_device.Init(); - - // example code: serial port banner message - #if defined(TARGET_MAX32625MBED) - serial.printf("MAX32625MBED "); - #elif defined(TARGET_MAX32600MBED) - serial.printf("MAX32600MBED "); - #elif defined(TARGET_NUCLEO_F446RE) - serial.printf("NUCLEO_F446RE "); - #endif - serial.printf("MAX11043BOB\r\n"); - - - while (1) { -#if HAS_BUTTON1_DEMO_INTERRUPT_POLLING - // avoid runtime error on button1 press [mbed-os-5.11] - // instead of using InterruptIn, use DigitalIn and poll in main while(1) -# if HAS_BUTTON1_DEMO_INTERRUPT - static int button1_value_prev = 1; - static int button1_value_now = 1; - button1_value_prev = button1_value_now; - button1_value_now = button1.read(); - if ((button1_value_prev - button1_value_now) == 1) - { - // on button1 falling edge (button1 press) - onButton1FallingEdge(); - } -# endif // HAS_BUTTON1_DEMO_INTERRUPT -# if HAS_BUTTON2_DEMO_INTERRUPT - static int button2_value_prev = 1; - static int button2_value_now = 1; - button2_value_prev = button2_value_now; - button2_value_now = button2.read(); - if ((button2_value_prev - button2_value_now) == 1) - { - // on button2 falling edge (button2 press) - onButton2FallingEdge(); - } -# endif // HAS_BUTTON2_DEMO_INTERRUPT -#endif - # if HAS_DAPLINK_SERIAL - if (DAPLINKserial.readable()) { - cmdLine_DAPLINKserial.append(DAPLINKserial.getc()); - } - # endif // HAS_DAPLINK_SERIAL - if (serial.readable()) { - int c = serial.getc(); - cmdLine_serial.append(c); -#if IGNORE_AT_COMMANDS -# if HAS_DAPLINK_SERIAL - cmdLine_DAPLINKserial.serial().printf("%c", c); -# endif // HAS_DAPLINK_SERIAL -#endif // IGNORE_AT_COMMANDS - // - } - } // while(1) -} -//---------- CODE GENERATOR: end testMainCppCodeList +// /******************************************************************************* +// * Copyright (C) 2020 Maxim Integrated Products, Inc., All Rights Reserved. +// * +// * Permission is hereby granted, free of charge, to any person obtaining a +// * copy of this software and associated documentation files (the "Software"), +// * to deal in the Software without restriction, including without limitation +// * the rights to use, copy, modify, merge, publish, distribute, sublicense, +// * and/or sell copies of the Software, and to permit persons to whom the +// * Software is furnished to do so, subject to the following conditions: +// * +// * The above copyright notice and this permission notice shall be included +// * in all copies or substantial portions of the Software. +// * +// * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES +// * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// * OTHER DEALINGS IN THE SOFTWARE. +// * +// * Except as contained in this notice, the name of Maxim Integrated +// * Products, Inc. shall not be used except as stated in the Maxim Integrated +// * Products, Inc. Branding Policy. +// * +// * The mere transfer of this software does not imply any licenses +// * of trade secrets, proprietary technology, copyrights, patents, +// * trademarks, maskwork rights, or any other form of intellectual +// * property whatsoever. Maxim Integrated Products, Inc. retains all +// * ownership rights. +// ******************************************************************************* +// */ +//---------- CODE GENERATOR: testMainCppCodeList +// CODE GENERATOR: example code includes + +// example code includes +// standard include for target platform -- Platform_Include_Boilerplate +#include "mbed.h" +// Platforms: +// - MAX32625MBED +// - supports mbed-os-5.11, requires USBDevice library +// - add https://developer.mbed.org/teams/MaximIntegrated/code/USBDevice/ +// - remove max32630fthr library (if present) +// - remove MAX32620FTHR library (if present) +// - MAX32600MBED +// - remove max32630fthr library (if present) +// - remove MAX32620FTHR library (if present) +// - Windows 10 note: Don't connect HDK until you are ready to load new firmware into the board. +// - NUCLEO_F446RE +// - remove USBDevice library +// - remove max32630fthr library (if present) +// - remove MAX32620FTHR library (if present) +// - NUCLEO_F401RE +// - remove USBDevice library +// - remove max32630fthr library (if present) +// - remove MAX32620FTHR library (if present) +// - MAX32630FTHR +// - #include "max32630fthr.h" +// - add http://os.mbed.org/teams/MaximIntegrated/code/max32630fthr/ +// - remove MAX32620FTHR library (if present) +// - MAX32620FTHR +// - #include "MAX32620FTHR.h" +// - remove max32630fthr library (if present) +// - add https://os.mbed.com/teams/MaximIntegrated/code/MAX32620FTHR/ +// - not tested yet +// - MAX32625PICO +// - remove max32630fthr library (if present) +// - remove MAX32620FTHR library (if present) +// - not tested yet +// +// end Platform_Include_Boilerplate +#include "MAX11043.h" +#include "CmdLine.h" +#include "MaximTinyTester.h" + +// optional: serial port +// note: some platforms such as Nucleo-F446RE do not support the USBSerial library. +// In those cases, remove the USBDevice lib from the project and rebuild. +#if defined(TARGET_MAX32625MBED) +#include "USBSerial.h" +USBSerial serial; // virtual serial port over USB (DEV connector) +#elif defined(TARGET_MAX32630MBED) +#include "USBSerial.h" +USBSerial serial; // virtual serial port over USB (DEV connector) +#else +//#include "USBSerial.h" +Serial serial(USBTX, USBRX); // tx, rx +#endif + +void on_immediate_0x21(); // Unicode (U+0021) ! EXCLAMATION MARK +void on_immediate_0x7b(); // Unicode (U+007B) { LEFT CURLY BRACKET +void on_immediate_0x7d(); // Unicode (U+007D) } RIGHT CURLY BRACKET + +#include "CmdLine.h" + +# if HAS_DAPLINK_SERIAL +CmdLine cmdLine_DAPLINKserial(DAPLINKserial, "DAPLINK"); +# endif // HAS_DAPLINK_SERIAL +CmdLine cmdLine_serial(serial, "serial"); + + +//-------------------------------------------------- + + +#if defined(TARGET) +// TARGET_NAME macros from targets/TARGET_Maxim/TARGET_MAX32625/device/mxc_device.h +// Create a string definition for the TARGET +#define STRING_ARG(arg) #arg +#define STRING_NAME(name) STRING_ARG(name) +#define TARGET_NAME STRING_NAME(TARGET) +#elif defined(TARGET_MAX32600) +#define TARGET_NAME "MAX32600" +#elif defined(TARGET_LPC1768) +#define TARGET_NAME "LPC1768" +#elif defined(TARGET_NUCLEO_F446RE) +#define TARGET_NAME "NUCLEO_F446RE" +#elif defined(TARGET_NUCLEO_F401RE) +#define TARGET_NAME "NUCLEO_F401RE" +#else +#error TARGET NOT DEFINED +#endif +#if defined(TARGET_MAX32630) +//-------------------------------------------------- +// TARGET=MAX32630FTHR ARM Cortex-M4F 96MHz 2048kB Flash 512kB SRAM +// +-------------[microUSB]-------------+ +// | J1 MAX32630FTHR J2 | +// ______ | [ ] RST GND [ ] | +// ______ | [ ] 3V3 BAT+[ ] | +// ______ | [ ] 1V8 reset SW1 | +// ______ | [ ] GND J4 J3 | +// analogIn0/4 | [a] AIN_0 1.2Vfs (bat) SYS [ ] | switched BAT+ +// analogIn1/5 | [a] AIN_1 1.2Vfs PWR [ ] | external pwr btn +// analogIn2 | [a] AIN_2 1.2Vfs +5V VBUS [ ] | USB +5V power +// analogIn3 | [a] AIN_3 1.2Vfs 1-WIRE P4_0 [d] | D0 dig9 +// (I2C2.SDA) | [d] P5_7 SDA2 SRN P5_6 [d] | D1 dig8 +// (I2C2.SCL) | [d] P6_0 SCL2 SDIO3 P5_5 [d] | D2 dig7 +// D13/SCLK | [s] P5_0 SCLK SDIO2 P5_4 [d] | D3 dig6 +// D11/MOSI | [s] P5_1 MOSI SSEL P5_3 [d] | D4 dig5 +// D12/MISO | [s] P5_2 MISO RTS P3_3 [d] | D5 dig4 +// D10/CS | [s] P3_0 RX CTS P3_2 [d] | D6 dig3 +// D9 dig0 | [d] P3_1 TX SCL P3_5 [d] | D7 dig2 +// ______ | [ ] GND SDA P3_4 [d] | D8 dig1 +// | | +// | XIP Flash MAX14690N | +// | XIP_SCLK P1_0 SDA2 P5_7 | +// | XIP_MOSI P1_1 SCL2 P6_0 | +// | XIP_MISO P1_2 PMIC_INIT P3_7 | +// | XIP_SSEL P1_3 MPC P2_7 | +// | XIP_DIO2 P1_4 MON AIN_0 | +// | XIP_DIO3 P1_5 | +// | | +// | PAN1326B MicroSD LED | +// | BT_RX P0_0 SD_SCLK P0_4 r P2_4 | +// | BT_TX P0_1 SD_MOSI P0_5 g P2_5 | +// | BT_CTS P0_2 SD_MISO P0_6 b P2_6 | +// | BT_RTS P0_3 SD_SSEL P0_7 | +// | BT_RST P1_6 DETECT P2_2 | +// | BT_CLK P1_7 SW2 P2_3 | +// +------------------------------------+ +// MAX32630FTHR board has MAX14690 PMIC on I2C bus (P5_7 SDA, P6_0 SCL) at slave address 0101_000r 0x50 (or 0x28 for 7 MSbit address). +// MAX32630FTHR board has BMI160 accelerometer on I2C bus (P5_7 SDA, P6_0 SCL) at slave address 1101_000r 0xD0 (or 0x68 for 7 MSbit address). +// AIN_0 = AIN0 pin fullscale is 1.2V +// AIN_1 = AIN1 pin fullscale is 1.2V +// AIN_2 = AIN2 pin fullscale is 1.2V +// AIN_3 = AIN3 pin fullscale is 1.2V +// AIN_4 = AIN0 / 5.0 fullscale is 6.0V +// AIN_5 = AIN1 / 5.0 fullscale is 6.0V +// AIN_6 = VDDB / 4.0 fullscale is 4.8V +// AIN_7 = VDD18 fullscale is 1.2V +// AIN_8 = VDD12 fullscale is 1.2V +// AIN_9 = VRTC / 2.0 fullscale is 2.4V +// AIN_10 = x undefined? +// AIN_11 = VDDIO / 4.0 fullscale is 4.8V +// AIN_12 = VDDIOH / 4.0 fullscale is 4.8V +// + #include "max32630fthr.h" +MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3); +#define analogIn4_IS_HIGH_RANGE_OF_analogIn0 1 +// MAX32630FTHR board supports only internal VREF = 1.200V at bypass capacitor C15 +const float ADC_FULL_SCALE_VOLTAGE = 1.200; +// Arduino connector +#ifndef A0 +#define A0 AIN_0 +#endif +#ifndef A1 +#define A1 AIN_1 +#endif +#ifndef A2 +#define A2 AIN_2 +#endif +#ifndef A3 +#define A3 AIN_3 +#endif +#ifndef D0 +#define D0 P4_0 +#endif +#ifndef D1 +#define D1 P5_6 +#endif +#ifndef D2 +#define D2 P5_5 +#endif +#ifndef D3 +#define D3 P5_4 +#endif +#ifndef D4 +#define D4 P5_3 +#endif +#ifndef D5 +#define D5 P3_3 +#endif +#ifndef D6 +#define D6 P3_2 +#endif +#ifndef D7 +#define D7 P3_5 +#endif +#ifndef D8 +#define D8 P3_4 +#endif +#ifndef D9 +#define D9 P3_1 +#endif +#ifndef D10 +#define D10 P3_0 +#endif +#ifndef D11 +#define D11 P5_1 +#endif +#ifndef D12 +#define D12 P5_2 +#endif +#ifndef D13 +#define D13 P5_0 +#endif +//-------------------------------------------------- +#elif defined(TARGET_MAX32625MBED) +//-------------------------------------------------- +// TARGET=MAX32625MBED ARM Cortex-M4F 96MHz 512kB Flash 160kB SRAM +// +-------------------------------------+ +// | MAX32625MBED Arduino UNO header | +// | | +// | A5/SCL[ ] | P1_7 dig15 +// | A4/SDA[ ] | P1_6 dig14 +// | AREF=N/C[ ] | +// | GND[ ] | +// | [ ]N/C SCK/13[ ] | P1_0 dig13 +// | [ ]IOREF=3V3 MISO/12[ ] | P1_2 dig12 +// | [ ]RST MOSI/11[ ]~| P1_1 dig11 +// | [ ]3V3 CS/10[ ]~| P1_3 dig10 +// | [ ]5V0 9[ ]~| P1_5 dig9 +// | [ ]GND 8[ ] | P1_4 dig8 +// | [ ]GND | +// | [ ]Vin 7[ ] | P0_7 dig7 +// | 6[ ]~| P0_6 dig6 +// AIN_0 | [ ]A0 5[ ]~| P0_5 dig5 +// AIN_1 | [ ]A1 4[ ] | P0_4 dig4 +// AIN_2 | [ ]A2 INT1/3[ ]~| P0_3 dig3 +// AIN_3 | [ ]A3 INT0/2[ ] | P0_2 dig2 +// dig16 P3_4 | [ ]A4/SDA RST SCK MISO TX>1[ ] | P0_1 dig1 +// dig17 P3_5 | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | P0_0 dig0 +// | [ ] [ ] [ ] | +// | UNO_R3 GND MOSI 5V ____________/ +// \_______________________/ +// +// +------------------------+ +// | | +// | MicroSD LED | +// | SD_SCLK P2_4 r P3_0 | +// | SD_MOSI P2_5 g P3_1 | +// | SD_MISO P2_6 b P3_2 | +// | SD_SSEL P2_7 y P3_3 | +// | | +// | DAPLINK BUTTONS | +// | TX P2_1 SW3 P2_3 | +// | RX P2_0 SW2 P2_2 | +// +------------------------+ +// +// AIN_0 = AIN0 pin fullscale is 1.2V +// AIN_1 = AIN1 pin fullscale is 1.2V +// AIN_2 = AIN2 pin fullscale is 1.2V +// AIN_3 = AIN3 pin fullscale is 1.2V +// AIN_4 = AIN0 / 5.0 fullscale is 6.0V +// AIN_5 = AIN1 / 5.0 fullscale is 6.0V +// AIN_6 = VDDB / 4.0 fullscale is 4.8V +// AIN_7 = VDD18 fullscale is 1.2V +// AIN_8 = VDD12 fullscale is 1.2V +// AIN_9 = VRTC / 2.0 fullscale is 2.4V +// AIN_10 = x undefined? +// AIN_11 = VDDIO / 4.0 fullscale is 4.8V +// AIN_12 = VDDIOH / 4.0 fullscale is 4.8V +// +//#include "max32625mbed.h" // ? +//MAX32625MBED mbed(MAX32625MBED::VIO_3V3); // ? +#define analogIn4_IS_HIGH_RANGE_OF_analogIn0 1 +// MAX32630FTHR board supports only internal VREF = 1.200V at bypass capacitor C15 +const float ADC_FULL_SCALE_VOLTAGE = 1.200; // TODO: ADC_FULL_SCALE_VOLTAGE Pico? +// Arduino connector +#ifndef A0 +#define A0 AIN_0 +#endif +#ifndef A1 +#define A1 AIN_1 +#endif +#ifndef A2 +#define A2 AIN_2 +#endif +#ifndef A3 +#define A3 AIN_3 +#endif +#ifndef D0 +#define D0 P0_0 +#endif +#ifndef D1 +#define D1 P0_1 +#endif +#ifndef D2 +#define D2 P0_2 +#endif +#ifndef D3 +#define D3 P0_3 +#endif +#ifndef D4 +#define D4 P0_4 +#endif +#ifndef D5 +#define D5 P0_5 +#endif +#ifndef D6 +#define D6 P0_6 +#endif +#ifndef D7 +#define D7 P0_7 +#endif +#ifndef D8 +#define D8 P1_4 +#endif +#ifndef D9 +#define D9 P1_5 +#endif +#ifndef D10 +#define D10 P1_3 +#endif +#ifndef D11 +#define D11 P1_1 +#endif +#ifndef D12 +#define D12 P1_2 +#endif +#ifndef D13 +#define D13 P1_0 +#endif +//-------------------------------------------------- +#elif defined(TARGET_MAX32600) +// target MAX32600 +// +#define analogIn4_IS_HIGH_RANGE_OF_analogIn0 0 +const float ADC_FULL_SCALE_VOLTAGE = 1.500; +// +//-------------------------------------------------- +#elif defined(TARGET_MAX32620FTHR) +#warning "TARGET_MAX32620FTHR not previously tested; need to define pins..." +#include "MAX32620FTHR.h" +// Initialize I/O voltages on MAX32620FTHR board +MAX32620FTHR fthr(MAX32620FTHR::VIO_3V3); +//#define USE_LEDS 0 ? +#define analogIn4_IS_HIGH_RANGE_OF_analogIn0 1 +#warning "TARGET_MAX32620FTHR not previously tested; need to verify ADC_FULL_SCALE_VOLTAGE..." +const float ADC_FULL_SCALE_VOLTAGE = 1.200; +// +//-------------------------------------------------- +#elif defined(TARGET_MAX32625PICO) +#warning "TARGET_MAX32625PICO not previously tested; need to define pins..." +//#define USE_LEDS 0 ? +#define analogIn4_IS_HIGH_RANGE_OF_analogIn0 1 +#warning "TARGET_MAX32625PICO not previously tested; need to verify ADC_FULL_SCALE_VOLTAGE..." +const float ADC_FULL_SCALE_VOLTAGE = 1.200; +// +//-------------------------------------------------- +#elif defined(TARGET_NUCLEO_F446RE) || defined(TARGET_NUCLEO_F401RE) +// TODO1: target NUCLEO_F446RE +// +// USER_BUTTON PC13 +// LED1 is shared with SPI_SCK on NUCLEO_F446RE PA_5, so don't use LED1. +#define USE_LEDS 0 +// SPI spi(SPI_MOSI, SPI_MISO, SPI_SCK); +// Serial serial(SERIAL_TX, SERIAL_RX); +#define analogIn4_IS_HIGH_RANGE_OF_analogIn0 0 +const float ADC_FULL_SCALE_VOLTAGE = 3.300; // TODO: ADC_FULL_SCALE_VOLTAGE Pico? +// +//-------------------------------------------------- +#elif defined(TARGET_LPC1768) +//-------------------------------------------------- +// TARGET=LPC1768 ARM Cortex-M3 100 MHz 512kB flash 64kB SRAM +// +-------------[microUSB]-------------+ +// ______ | [ ] GND +3.3V VOUT [ ] | ______ +// ______ | [ ] 4.5V<VIN<9.0V +5.0V VU [ ] | ______ +// ______ | [ ] VB USB.IF- [ ] | ______ +// ______ | [ ] nR USB.IF+ [ ] | ______ +// digitalInOut0 | [ ] p5 MOSI ETHERNET.RD- [ ] | ______ +// digitalInOut1 | [ ] p6 MISO ETHERNET.RD+ [ ] | ______ +// digitalInOut2 | [ ] p7 SCLK ETHERNET.TD- [ ] | ______ +// digitalInOut3 | [ ] p8 ETHERNET.TD+ [ ] | ______ +// digitalInOut4 | [ ] p9 TX SDA USB.D- [ ] | ______ +// digitalInOut5 | [ ] p10 RX SCL USB.D+ [ ] | ______ +// digitalInOut6 | [ ] p11 MOSI CAN-RD p30 [ ] | digitalInOut13 +// digitalInOut7 | [ ] p12 MISO CAN-TD p29 [ ] | digitalInOut12 +// digitalInOut8 | [ ] p13 TX SCLK SDA TX p28 [ ] | digitalInOut11 +// digitalInOut9 | [ ] p14 RX SCL RX p27 [ ] | digitalInOut10 +// analogIn0 | [ ] p15 AIN0 3.3Vfs PWM1 p26 [ ] | pwmDriver1 +// analogIn1 | [ ] p16 AIN1 3.3Vfs PWM2 p25 [ ] | pwmDriver2 +// analogIn2 | [ ] p17 AIN2 3.3Vfs PWM3 p24 [ ] | pwmDriver3 +// analogIn3 | [ ] p18 AIN3 AOUT PWM4 p23 [ ] | pwmDriver4 +// analogIn4 | [ ] p19 AIN4 3.3Vfs PWM5 p22 [ ] | pwmDriver5 +// analogIn5 | [ ] p20 AIN5 3.3Vfs PWM6 p21 [ ] | pwmDriver6 +// +------------------------------------+ +// AIN6 = P0.3 = TGT_SBL_RXD? +// AIN7 = P0.2 = TGT_SBL_TXD? +// +//-------------------------------------------------- +// LPC1768 board uses VREF = 3.300V +A3,3V thru L1 to bypass capacitor C14 +#define analogIn4_IS_HIGH_RANGE_OF_analogIn0 0 +const float ADC_FULL_SCALE_VOLTAGE = 3.300; +#else // not defined(TARGET_LPC1768 etc.) +//-------------------------------------------------- +// unknown target +//-------------------------------------------------- +#endif // target definition + + +//-------------------------------------------------- +// Option to dedicate SPI port pins +// +// SPI2_MOSI = P5_1 +// SPI2_MISO = P5_2 +// SPI2_SCK = P5_0 +// On this board I'm using P3_0 as spi_cs +// SPI2_SS = P5_3 +// SPI2_SDIO2 = P5_4 +// SPI2_SDIO3 = P5_5 +// SPI2_SRN = P5_6 +// +#ifndef HAS_SPI +#define HAS_SPI 1 +#endif +#if HAS_SPI +#define SPI_MODE0 0 +#define SPI_MODE1 1 +#define SPI_MODE2 2 +#define SPI_MODE3 3 +// +#if defined(TARGET_MAX32630) + // Before setting global variables g_SPI_SCLK_Hz and g_SPI_dataMode, + // workaround for TARGET_MAX32630 SPI_MODE2 SPI_MODE3 problem (issue #30) +#warning "MAX32630 SPI workaround..." + // replace SPI_MODE2 (CPOL=1,CPHA=0) with SPI_MODE1 (CPOL=0,CPHA=1) Falling Edge stable + // replace SPI_MODE3 (CPOL=1,CPHA=1) with SPI_MODE0 (CPOL=0,CPHA=0) Rising Edge stable +# if ((SPI_dataMode) == (SPI_MODE2)) +#warning "MAX32630 SPI_MODE2 workaround, changing SPI_dataMode to SPI_MODE1..." + // SPI_dataMode SPI_MODE2 // CPOL=1,CPHA=0: Falling Edge stable; SCLK idle High +# undef SPI_dataMode +# define SPI_dataMode SPI_MODE1 // CPOL=0,CPHA=1: Falling Edge stable; SCLK idle Low +# elif ((SPI_dataMode) == (SPI_MODE3)) +#warning "MAX32630 SPI_MODE3 workaround, changing SPI_dataMode to SPI_MODE0..." + // SPI_dataMode SPI_MODE3 // CPOL=1,CPHA=1: Rising Edge stable; SCLK idle High +# undef SPI_dataMode +# define SPI_dataMode SPI_MODE0 // CPOL=0,CPHA=0: Rising Edge stable; SCLK idle Low +# endif // workaround for TARGET_MAX32630 SPI_MODE2 SPI_MODE3 problem + // workaround for TARGET_MAX32630 SPI_MODE2 SPI_MODE3 problem (issue #30) + // limit SPI SCLK speed to 6MHz or less +# if ((SPI_SCLK_Hz) > (6000000)) +#warning "MAX32630 SPI speed workaround, changing SPI_SCLK_Hz to 6000000 or 6MHz..." +# undef SPI_SCLK_Hz +# define SPI_SCLK_Hz 6000000 // 6MHz +# endif +#endif +// +uint32_t g_SPI_SCLK_Hz = 6000000; // TODO: missing definition of SPI_SCLK_Hz; +// TODO1: validate g_SPI_SCLK_Hz against system clock frequency SystemCoreClock F_CPU +#if defined(TARGET_NUCLEO_F446RE) || defined(TARGET_NUCLEO_F401RE) +// Nucleo SPI frequency isn't working quite as expected... +// Looks like STMF4 has an spi clock prescaler (2,4,8,16,32,64,128,256) +// so 180MHz->[90.0, 45.0, 22.5, 11.25, 5.625, 2.8125, 1.40625, 0.703125] +// %SC SCLK=1MHz sets spi frequency 703.125kHz +// %SC SCLK=2MHz sets spi frequency 1.40625MHz +// %SC SCLK=3MHz sets spi frequency 2.8125MHz +// %SC SCLK=6MHz sets spi frequency 5.625MHz +// %SC SCLK=12MHz sets spi frequency 11.25MHz +// %SC SCLK=23MHz sets spi frequency 22.5MHz +// %SC SCLK=45MHz sets spi frequency 45.0MHz +// Don't know why I can't reach spi frequency 90.0MHz, but ok whatever. +const uint32_t limit_min_SPI_SCLK_divisor = 2; +const uint32_t limit_max_SPI_SCLK_divisor = 256; +// not really a divisor, just a powers-of-two prescaler with no intermediate divisors. +#else +const uint32_t limit_min_SPI_SCLK_divisor = 2; +const uint32_t limit_max_SPI_SCLK_divisor = 8191; +#endif +const uint32_t limit_max_SPI_SCLK_Hz = (SystemCoreClock / limit_min_SPI_SCLK_divisor); // F_CPU / 2; // 8MHz / 2 = 4MHz +const uint32_t limit_min_SPI_SCLK_Hz = (SystemCoreClock / limit_max_SPI_SCLK_divisor); // F_CPU / 128; // 8MHz / 128 = 62.5kHz +// +uint8_t g_SPI_dataMode = SPI_MODE0; // TODO: missing definition SPI_dataMode; +uint8_t g_SPI_cs_state = 1; +// +#endif + + + +// uncrustify-0.66.1 *INDENT-OFF* +//-------------------------------------------------- +// Declare the AnalogIn driver +// Optional analogIn support. If there is only one it should be analogIn1. +// A) analog input +#if defined(TARGET_MAX32630) + #define HAS_analogIn0 1 + #define HAS_analogIn1 1 + #define HAS_analogIn2 1 + #define HAS_analogIn3 1 + #define HAS_analogIn4 1 + #define HAS_analogIn5 1 + #define HAS_analogIn6 1 + #define HAS_analogIn7 1 + #define HAS_analogIn8 1 + #define HAS_analogIn9 1 +// #define HAS_analogIn10 0 +// #define HAS_analogIn11 0 +// #define HAS_analogIn12 0 +// #define HAS_analogIn13 0 +// #define HAS_analogIn14 0 +// #define HAS_analogIn15 0 +#if HAS_analogIn0 + AnalogIn analogIn0(AIN_0); // TARGET_MAX32630 J1.5 AIN_0 = AIN0 pin fullscale is 1.2V +#endif +#if HAS_analogIn1 + AnalogIn analogIn1(AIN_1); // TARGET_MAX32630 J1.6 AIN_1 = AIN1 pin fullscale is 1.2V +#endif +#if HAS_analogIn2 + AnalogIn analogIn2(AIN_2); // TARGET_MAX32630 J1.7 AIN_2 = AIN2 pin fullscale is 1.2V +#endif +#if HAS_analogIn3 + AnalogIn analogIn3(AIN_3); // TARGET_MAX32630 J1.8 AIN_3 = AIN3 pin fullscale is 1.2V +#endif +#if HAS_analogIn4 + AnalogIn analogIn4(AIN_4); // TARGET_MAX32630 J1.5 AIN_4 = AIN0 / 5.0 fullscale is 6.0V +#endif +#if HAS_analogIn5 + AnalogIn analogIn5(AIN_5); // TARGET_MAX32630 J1.6 AIN_5 = AIN1 / 5.0 fullscale is 6.0V +#endif +#if HAS_analogIn6 + AnalogIn analogIn6(AIN_6); // TARGET_MAX32630 AIN_6 = VDDB / 4.0 fullscale is 4.8V +#endif +#if HAS_analogIn7 + AnalogIn analogIn7(AIN_7); // TARGET_MAX32630 AIN_7 = VDD18 fullscale is 1.2V +#endif +#if HAS_analogIn8 + AnalogIn analogIn8(AIN_8); // TARGET_MAX32630 AIN_8 = VDD12 fullscale is 1.2V +#endif +#if HAS_analogIn9 + AnalogIn analogIn9(AIN_9); // TARGET_MAX32630 AIN_9 = VRTC / 2.0 fullscale is 2.4V +#endif +#if HAS_analogIn10 + AnalogIn analogIn10(____); // TARGET_MAX32630 AIN_10 = x undefined? +#endif +#if HAS_analogIn11 + AnalogIn analogIn11(____); // TARGET_MAX32630 AIN_11 = VDDIO / 4.0 fullscale is 4.8V +#endif +#if HAS_analogIn12 + AnalogIn analogIn12(____); // TARGET_MAX32630 AIN_12 = VDDIOH / 4.0 fullscale is 4.8V +#endif +#if HAS_analogIn13 + AnalogIn analogIn13(____); +#endif +#if HAS_analogIn14 + AnalogIn analogIn14(____); +#endif +#if HAS_analogIn15 + AnalogIn analogIn15(____); +#endif +//-------------------------------------------------- +#elif defined(TARGET_MAX32625MBED) + #define HAS_analogIn0 1 + #define HAS_analogIn1 1 + #define HAS_analogIn2 1 + #define HAS_analogIn3 1 + #define HAS_analogIn4 1 + #define HAS_analogIn5 1 +#if HAS_analogIn0 + AnalogIn analogIn0(AIN_0); // TARGET_MAX32630 J1.5 AIN_0 = AIN0 pin fullscale is 1.2V +#endif +#if HAS_analogIn1 + AnalogIn analogIn1(AIN_1); // TARGET_MAX32630 J1.6 AIN_1 = AIN1 pin fullscale is 1.2V +#endif +#if HAS_analogIn2 + AnalogIn analogIn2(AIN_2); // TARGET_MAX32630 J1.7 AIN_2 = AIN2 pin fullscale is 1.2V +#endif +#if HAS_analogIn3 + AnalogIn analogIn3(AIN_3); // TARGET_MAX32630 J1.8 AIN_3 = AIN3 pin fullscale is 1.2V +#endif +#if HAS_analogIn4 + AnalogIn analogIn4(AIN_4); // TARGET_MAX32630 J1.5 AIN_4 = AIN0 / 5.0 fullscale is 6.0V +#endif +#if HAS_analogIn5 + AnalogIn analogIn5(AIN_5); // TARGET_MAX32630 J1.6 AIN_5 = AIN1 / 5.0 fullscale is 6.0V +#endif +//-------------------------------------------------- +#elif defined(TARGET_MAX32620FTHR) +#warning "TARGET_MAX32620FTHR not previously tested; need to verify analogIn0..." + #define HAS_analogIn0 1 + #define HAS_analogIn1 1 + #define HAS_analogIn2 1 + #define HAS_analogIn3 1 + #define HAS_analogIn4 1 + #define HAS_analogIn5 1 + #define HAS_analogIn6 1 + #define HAS_analogIn7 1 + #define HAS_analogIn8 1 + #define HAS_analogIn9 1 +// #define HAS_analogIn10 0 +// #define HAS_analogIn11 0 +// #define HAS_analogIn12 0 +// #define HAS_analogIn13 0 +// #define HAS_analogIn14 0 +// #define HAS_analogIn15 0 +#if HAS_analogIn0 + AnalogIn analogIn0(AIN_0); // TARGET_MAX32620FTHR J1.5 AIN_0 = AIN0 pin fullscale is 1.2V +#endif +#if HAS_analogIn1 + AnalogIn analogIn1(AIN_1); // TARGET_MAX32620FTHR J1.6 AIN_1 = AIN1 pin fullscale is 1.2V +#endif +#if HAS_analogIn2 + AnalogIn analogIn2(AIN_2); // TARGET_MAX32620FTHR J1.7 AIN_2 = AIN2 pin fullscale is 1.2V +#endif +#if HAS_analogIn3 + AnalogIn analogIn3(AIN_3); // TARGET_MAX32620FTHR J1.8 AIN_3 = AIN3 pin fullscale is 1.2V +#endif +#if HAS_analogIn4 + AnalogIn analogIn4(AIN_4); // TARGET_MAX32620FTHR J1.5 AIN_4 = AIN0 / 5.0 fullscale is 6.0V +#endif +#if HAS_analogIn5 + AnalogIn analogIn5(AIN_5); // TARGET_MAX32620FTHR J1.6 AIN_5 = AIN1 / 5.0 fullscale is 6.0V +#endif +#if HAS_analogIn6 + AnalogIn analogIn6(AIN_6); // TARGET_MAX32620FTHR AIN_6 = VDDB / 4.0 fullscale is 4.8V +#endif +#if HAS_analogIn7 + AnalogIn analogIn7(AIN_7); // TARGET_MAX32620FTHR AIN_7 = VDD18 fullscale is 1.2V +#endif +#if HAS_analogIn8 + AnalogIn analogIn8(AIN_8); // TARGET_MAX32620FTHR AIN_8 = VDD12 fullscale is 1.2V +#endif +#if HAS_analogIn9 + AnalogIn analogIn9(AIN_9); // TARGET_MAX32620FTHR AIN_9 = VRTC / 2.0 fullscale is 2.4V +#endif +#if HAS_analogIn10 + AnalogIn analogIn10(____); // TARGET_MAX32620FTHR AIN_10 = x undefined? +#endif +#if HAS_analogIn11 + AnalogIn analogIn11(____); // TARGET_MAX32620FTHR AIN_11 = VDDIO / 4.0 fullscale is 4.8V +#endif +#if HAS_analogIn12 + AnalogIn analogIn12(____); // TARGET_MAX32620FTHR AIN_12 = VDDIOH / 4.0 fullscale is 4.8V +#endif +#if HAS_analogIn13 + AnalogIn analogIn13(____); +#endif +#if HAS_analogIn14 + AnalogIn analogIn14(____); +#endif +#if HAS_analogIn15 + AnalogIn analogIn15(____); +#endif +//-------------------------------------------------- +#elif defined(TARGET_MAX32625PICO) +#warning "TARGET_MAX32625PICO not previously tested; need to verify analogIn0..." + #define HAS_analogIn0 1 + #define HAS_analogIn1 1 + #define HAS_analogIn2 1 + #define HAS_analogIn3 1 + #define HAS_analogIn4 1 + #define HAS_analogIn5 1 +#if HAS_analogIn0 + AnalogIn analogIn0(AIN_0); // TARGET_MAX32630 J1.5 AIN_0 = AIN0 pin fullscale is 1.2V +#endif +#if HAS_analogIn1 + AnalogIn analogIn1(AIN_1); // TARGET_MAX32630 J1.6 AIN_1 = AIN1 pin fullscale is 1.2V +#endif +#if HAS_analogIn2 + AnalogIn analogIn2(AIN_2); // TARGET_MAX32630 J1.7 AIN_2 = AIN2 pin fullscale is 1.2V +#endif +#if HAS_analogIn3 + AnalogIn analogIn3(AIN_3); // TARGET_MAX32630 J1.8 AIN_3 = AIN3 pin fullscale is 1.2V +#endif +#if HAS_analogIn4 + AnalogIn analogIn4(AIN_4); // TARGET_MAX32630 J1.5 AIN_4 = AIN0 / 5.0 fullscale is 6.0V +#endif +#if HAS_analogIn5 + AnalogIn analogIn5(AIN_5); // TARGET_MAX32630 J1.6 AIN_5 = AIN1 / 5.0 fullscale is 6.0V +#endif +//-------------------------------------------------- +#elif defined(TARGET_MAX32600) + #define HAS_analogIn0 1 + #define HAS_analogIn1 1 + #define HAS_analogIn2 1 + #define HAS_analogIn3 1 + #define HAS_analogIn4 1 + #define HAS_analogIn5 1 +#if HAS_analogIn0 + AnalogIn analogIn0(A0); +#endif +#if HAS_analogIn1 + AnalogIn analogIn1(A1); +#endif +#if HAS_analogIn2 + AnalogIn analogIn2(A2); +#endif +#if HAS_analogIn3 + AnalogIn analogIn3(A3); +#endif +#if HAS_analogIn4 + AnalogIn analogIn4(A4); +#endif +#if HAS_analogIn5 + AnalogIn analogIn5(A5); +#endif +//-------------------------------------------------- +#elif defined(TARGET_NUCLEO_F446RE) + #define HAS_analogIn0 1 + #define HAS_analogIn1 1 + #define HAS_analogIn2 1 + #define HAS_analogIn3 1 + #define HAS_analogIn4 1 + #define HAS_analogIn5 1 +#if HAS_analogIn0 + AnalogIn analogIn0(A0); +#endif +#if HAS_analogIn1 + AnalogIn analogIn1(A1); +#endif +#if HAS_analogIn2 + AnalogIn analogIn2(A2); +#endif +#if HAS_analogIn3 + AnalogIn analogIn3(A3); +#endif +#if HAS_analogIn4 + AnalogIn analogIn4(A4); +#endif +#if HAS_analogIn5 + AnalogIn analogIn5(A5); +#endif +//-------------------------------------------------- +#elif defined(TARGET_NUCLEO_F401RE) + #define HAS_analogIn0 1 + #define HAS_analogIn1 1 + #define HAS_analogIn2 1 + #define HAS_analogIn3 1 + #define HAS_analogIn4 1 + #define HAS_analogIn5 1 +#if HAS_analogIn0 + AnalogIn analogIn0(A0); +#endif +#if HAS_analogIn1 + AnalogIn analogIn1(A1); +#endif +#if HAS_analogIn2 + AnalogIn analogIn2(A2); +#endif +#if HAS_analogIn3 + AnalogIn analogIn3(A3); +#endif +#if HAS_analogIn4 + AnalogIn analogIn4(A4); +#endif +#if HAS_analogIn5 + AnalogIn analogIn5(A5); +#endif +//-------------------------------------------------- +// TODO1: TARGET=MAX32625MBED ARM Cortex-M4F 96MHz 512kB Flash 160kB SRAM +#elif defined(TARGET_LPC1768) + #define HAS_analogIn0 1 + #define HAS_analogIn1 1 + #define HAS_analogIn2 1 + #define HAS_analogIn3 1 + #define HAS_analogIn4 1 + #define HAS_analogIn5 1 +// #define HAS_analogIn6 1 +// #define HAS_analogIn7 1 +// #define HAS_analogIn8 1 +// #define HAS_analogIn9 1 +// #define HAS_analogIn10 1 +// #define HAS_analogIn11 1 +// #define HAS_analogIn12 1 +// #define HAS_analogIn13 1 +// #define HAS_analogIn14 1 +// #define HAS_analogIn15 1 +#if HAS_analogIn0 + AnalogIn analogIn0(p15); // TARGET_LPC1768 P0.23/AD0.0/I2SRX_CLK/CAP3.0 +#endif +#if HAS_analogIn1 + AnalogIn analogIn1(p16); // TARGET_LPC1768 P0.24/AD0.1/I2SRX_WS/CAP3.1 +#endif +#if HAS_analogIn2 + AnalogIn analogIn2(p17); // TARGET_LPC1768 P0.25/AD0.2/I2SRX_SDA/TXD3 +#endif +#if HAS_analogIn3 + AnalogIn analogIn3(p18); // TARGET_LPC1768 P0.26/AD0.3/AOUT/RXD3 +#endif +#if HAS_analogIn4 + AnalogIn analogIn4(p19); // TARGET_LPC1768 P1.30/VBUS/AD0.4 +#endif +#if HAS_analogIn5 + AnalogIn analogIn5(p20); // TARGET_LPC1768 P1.31/SCK1/AD0.5 +#endif +#if HAS_analogIn6 + AnalogIn analogIn6(____); +#endif +#if HAS_analogIn7 + AnalogIn analogIn7(____); +#endif +#if HAS_analogIn8 + AnalogIn analogIn8(____); +#endif +#if HAS_analogIn9 + AnalogIn analogIn9(____); +#endif +#if HAS_analogIn10 + AnalogIn analogIn10(____); +#endif +#if HAS_analogIn11 + AnalogIn analogIn11(____); +#endif +#if HAS_analogIn12 + AnalogIn analogIn12(____); +#endif +#if HAS_analogIn13 + AnalogIn analogIn13(____); +#endif +#if HAS_analogIn14 + AnalogIn analogIn14(____); +#endif +#if HAS_analogIn15 + AnalogIn analogIn15(____); +#endif +#else + // unknown target +#endif +// uncrustify-0.66.1 *INDENT-ON* +#if HAS_analogIn0 || HAS_analogIn1 \ + || HAS_analogIn2 || HAS_analogIn3 \ + || HAS_analogIn4 || HAS_analogIn5 \ + || HAS_analogIn6 || HAS_analogIn7 \ + || HAS_analogIn8 || HAS_analogIn9 \ + || HAS_analogIn10 || HAS_analogIn11 \ + || HAS_analogIn12 || HAS_analogIn13 \ + || HAS_analogIn14 || HAS_analogIn15 +#define HAS_analogIns 1 +#endif + + + +// AnalogIn pin resource: search index +#if HAS_analogIns +AnalogIn& find_analogInPin(int cPinIndex) +{ + switch (cPinIndex) + { + default: // default to the first defined analogIn pin +#if HAS_analogIn0 + case '0': case 0x00: return analogIn0; +#endif +#if HAS_analogIn1 + case '1': case 0x01: return analogIn1; +#endif +#if HAS_analogIn2 + case '2': case 0x02: return analogIn2; +#endif +#if HAS_analogIn3 + case '3': case 0x03: return analogIn3; +#endif +#if HAS_analogIn4 + case '4': case 0x04: return analogIn4; +#endif +#if HAS_analogIn5 + case '5': case 0x05: return analogIn5; +#endif +#if HAS_analogIn6 + case '6': case 0x06: return analogIn6; +#endif +#if HAS_analogIn7 + case '7': case 0x07: return analogIn7; +#endif +#if HAS_analogIn8 + case '8': case 0x08: return analogIn8; +#endif +#if HAS_analogIn9 + case '9': case 0x09: return analogIn9; +#endif +#if HAS_analogIn10 + case 'a': case 0x0a: return analogIn10; +#endif +#if HAS_analogIn11 + case 'b': case 0x0b: return analogIn11; +#endif +#if HAS_analogIn12 + case 'c': case 0x0c: return analogIn12; +#endif +#if HAS_analogIn13 + case 'd': case 0x0d: return analogIn13; +#endif +#if HAS_analogIn14 + case 'e': case 0x0e: return analogIn14; +#endif +#if HAS_analogIn15 + case 'f': case 0x0f: return analogIn15; +#endif + } +} +#endif + +#if HAS_analogIns +const float analogInPin_fullScaleVoltage[] = { +# if defined(TARGET_MAX32630) + ADC_FULL_SCALE_VOLTAGE, // analogIn0 + ADC_FULL_SCALE_VOLTAGE, // analogIn1 + ADC_FULL_SCALE_VOLTAGE, // analogIn2 + ADC_FULL_SCALE_VOLTAGE, // analogIn3 + ADC_FULL_SCALE_VOLTAGE * 5.0f, // analogIn4 // AIN_4 = AIN0 / 5.0 fullscale is 6.0V + ADC_FULL_SCALE_VOLTAGE * 5.0f, // analogIn4 // AIN_5 = AIN1 / 5.0 fullscale is 6.0V + ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn6 // AIN_6 = VDDB / 4.0 fullscale is 4.8V + ADC_FULL_SCALE_VOLTAGE, // analogIn7 // AIN_7 = VDD18 fullscale is 1.2V + ADC_FULL_SCALE_VOLTAGE, // analogIn8 // AIN_8 = VDD12 fullscale is 1.2V + ADC_FULL_SCALE_VOLTAGE * 2.0f, // analogIn9 // AIN_9 = VRTC / 2.0 fullscale is 2.4V + ADC_FULL_SCALE_VOLTAGE, // analogIn10 // AIN_10 = x undefined? + ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn11 // AIN_11 = VDDIO / 4.0 fullscale is 4.8V + ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn12 // AIN_12 = VDDIOH / 4.0 fullscale is 4.8V + ADC_FULL_SCALE_VOLTAGE, // analogIn13 + ADC_FULL_SCALE_VOLTAGE, // analogIn14 + ADC_FULL_SCALE_VOLTAGE // analogIn15 +# elif defined(TARGET_MAX32620FTHR) +#warning "TARGET_MAX32620FTHR not previously tested; need to verify analogIn0..." + ADC_FULL_SCALE_VOLTAGE, // analogIn0 + ADC_FULL_SCALE_VOLTAGE, // analogIn1 + ADC_FULL_SCALE_VOLTAGE, // analogIn2 + ADC_FULL_SCALE_VOLTAGE, // analogIn3 + ADC_FULL_SCALE_VOLTAGE * 5.0f, // analogIn4 // AIN_4 = AIN0 / 5.0 fullscale is 6.0V + ADC_FULL_SCALE_VOLTAGE * 5.0f, // analogIn4 // AIN_5 = AIN1 / 5.0 fullscale is 6.0V + ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn6 // AIN_6 = VDDB / 4.0 fullscale is 4.8V + ADC_FULL_SCALE_VOLTAGE, // analogIn7 // AIN_7 = VDD18 fullscale is 1.2V + ADC_FULL_SCALE_VOLTAGE, // analogIn8 // AIN_8 = VDD12 fullscale is 1.2V + ADC_FULL_SCALE_VOLTAGE * 2.0f, // analogIn9 // AIN_9 = VRTC / 2.0 fullscale is 2.4V + ADC_FULL_SCALE_VOLTAGE, // analogIn10 // AIN_10 = x undefined? + ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn11 // AIN_11 = VDDIO / 4.0 fullscale is 4.8V + ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn12 // AIN_12 = VDDIOH / 4.0 fullscale is 4.8V + ADC_FULL_SCALE_VOLTAGE, // analogIn13 + ADC_FULL_SCALE_VOLTAGE, // analogIn14 + ADC_FULL_SCALE_VOLTAGE // analogIn15 +#elif defined(TARGET_MAX32625MBED) + ADC_FULL_SCALE_VOLTAGE * 1.0f, // analogIn0 // fullscale is 1.2V + ADC_FULL_SCALE_VOLTAGE * 1.0f, // analogIn1 // fullscale is 1.2V + ADC_FULL_SCALE_VOLTAGE * 1.0f, // analogIn2 // fullscale is 1.2V + ADC_FULL_SCALE_VOLTAGE * 1.0f, // analogIn3 // fullscale is 1.2V + ADC_FULL_SCALE_VOLTAGE * 5.0f, // analogIn4 // AIN_4 = AIN0 / 5.0 fullscale is 6.0V + ADC_FULL_SCALE_VOLTAGE * 5.0f, // analogIn4 // AIN_5 = AIN1 / 5.0 fullscale is 6.0V + ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn6 // AIN_6 = VDDB / 4.0 fullscale is 4.8V + ADC_FULL_SCALE_VOLTAGE, // analogIn7 // AIN_7 = VDD18 fullscale is 1.2V + ADC_FULL_SCALE_VOLTAGE, // analogIn8 // AIN_8 = VDD12 fullscale is 1.2V + ADC_FULL_SCALE_VOLTAGE * 2.0f, // analogIn9 // AIN_9 = VRTC / 2.0 fullscale is 2.4V + ADC_FULL_SCALE_VOLTAGE, // analogIn10 // AIN_10 = x undefined? + ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn11 // AIN_11 = VDDIO / 4.0 fullscale is 4.8V + ADC_FULL_SCALE_VOLTAGE * 4.0f, // analogIn12 // AIN_12 = VDDIOH / 4.0 fullscale is 4.8V + ADC_FULL_SCALE_VOLTAGE, // analogIn13 + ADC_FULL_SCALE_VOLTAGE, // analogIn14 + ADC_FULL_SCALE_VOLTAGE // analogIn15 +#elif defined(TARGET_NUCLEO_F446RE) + ADC_FULL_SCALE_VOLTAGE, // analogIn0 + ADC_FULL_SCALE_VOLTAGE, // analogIn1 + ADC_FULL_SCALE_VOLTAGE, // analogIn2 + ADC_FULL_SCALE_VOLTAGE, // analogIn3 + ADC_FULL_SCALE_VOLTAGE, // analogIn4 + ADC_FULL_SCALE_VOLTAGE, // analogIn5 + ADC_FULL_SCALE_VOLTAGE, // analogIn6 + ADC_FULL_SCALE_VOLTAGE, // analogIn7 + ADC_FULL_SCALE_VOLTAGE, // analogIn8 + ADC_FULL_SCALE_VOLTAGE, // analogIn9 + ADC_FULL_SCALE_VOLTAGE, // analogIn10 + ADC_FULL_SCALE_VOLTAGE, // analogIn11 + ADC_FULL_SCALE_VOLTAGE, // analogIn12 + ADC_FULL_SCALE_VOLTAGE, // analogIn13 + ADC_FULL_SCALE_VOLTAGE, // analogIn14 + ADC_FULL_SCALE_VOLTAGE // analogIn15 +#elif defined(TARGET_NUCLEO_F401RE) + ADC_FULL_SCALE_VOLTAGE, // analogIn0 + ADC_FULL_SCALE_VOLTAGE, // analogIn1 + ADC_FULL_SCALE_VOLTAGE, // analogIn2 + ADC_FULL_SCALE_VOLTAGE, // analogIn3 + ADC_FULL_SCALE_VOLTAGE, // analogIn4 + ADC_FULL_SCALE_VOLTAGE, // analogIn5 + ADC_FULL_SCALE_VOLTAGE, // analogIn6 + ADC_FULL_SCALE_VOLTAGE, // analogIn7 + ADC_FULL_SCALE_VOLTAGE, // analogIn8 + ADC_FULL_SCALE_VOLTAGE, // analogIn9 + ADC_FULL_SCALE_VOLTAGE, // analogIn10 + ADC_FULL_SCALE_VOLTAGE, // analogIn11 + ADC_FULL_SCALE_VOLTAGE, // analogIn12 + ADC_FULL_SCALE_VOLTAGE, // analogIn13 + ADC_FULL_SCALE_VOLTAGE, // analogIn14 + ADC_FULL_SCALE_VOLTAGE // analogIn15 +//#elif defined(TARGET_LPC1768) +#else + // unknown target + ADC_FULL_SCALE_VOLTAGE, // analogIn0 + ADC_FULL_SCALE_VOLTAGE, // analogIn1 + ADC_FULL_SCALE_VOLTAGE, // analogIn2 + ADC_FULL_SCALE_VOLTAGE, // analogIn3 + ADC_FULL_SCALE_VOLTAGE, // analogIn4 + ADC_FULL_SCALE_VOLTAGE, // analogIn5 + ADC_FULL_SCALE_VOLTAGE, // analogIn6 + ADC_FULL_SCALE_VOLTAGE, // analogIn7 + ADC_FULL_SCALE_VOLTAGE, // analogIn8 + ADC_FULL_SCALE_VOLTAGE, // analogIn9 + ADC_FULL_SCALE_VOLTAGE, // analogIn10 + ADC_FULL_SCALE_VOLTAGE, // analogIn11 + ADC_FULL_SCALE_VOLTAGE, // analogIn12 + ADC_FULL_SCALE_VOLTAGE, // analogIn13 + ADC_FULL_SCALE_VOLTAGE, // analogIn14 + ADC_FULL_SCALE_VOLTAGE // analogIn15 +# endif +}; +#endif + + + + +//-------------------------------------------------- +// Option to use LEDs to show status +#ifndef USE_LEDS +#define USE_LEDS 1 +#endif +#if USE_LEDS +#if defined(TARGET_MAX32630) +# define LED_ON 0 +# define LED_OFF 1 +//-------------------------------------------------- +#elif defined(TARGET_MAX32625MBED) +# define LED_ON 0 +# define LED_OFF 1 +//-------------------------------------------------- +// TODO1: TARGET=MAX32625MBED ARM Cortex-M4F 96MHz 512kB Flash 160kB SRAM +#elif defined(TARGET_LPC1768) +# define LED_ON 1 +# define LED_OFF 0 +#else // not defined(TARGET_LPC1768 etc.) +// USE_LEDS with some platform other than MAX32630, MAX32625MBED, LPC1768 +// bugfix for MAX32600MBED LED blink pattern: check if LED_ON/LED_OFF already defined +# ifndef LED_ON +# define LED_ON 0 +# endif +# ifndef LED_OFF +# define LED_OFF 1 +# endif +//# define LED_ON 1 +//# define LED_OFF 0 +#endif // target definition +DigitalOut led1(LED1, LED_OFF); // MAX32630FTHR: LED1 = LED_RED +DigitalOut led2(LED2, LED_OFF); // MAX32630FTHR: LED2 = LED_GREEN +DigitalOut led3(LED3, LED_OFF); // MAX32630FTHR: LED3 = LED_BLUE +DigitalOut led4(LED4, LED_OFF); +#else // USE_LEDS=0 +// issue #41 support Nucleo_F446RE +// there are no LED indicators on the board, LED1 interferes with SPI; +// but we still need placeholders led1 led2 led3 led4. +// Declare DigitalOut led1 led2 led3 led4 targeting safe pins. +// PinName NC means NOT_CONNECTED; DigitalOut::is_connected() returns false +# define LED_ON 0 +# define LED_OFF 1 +DigitalOut led1(NC, LED_OFF); +DigitalOut led2(NC, LED_OFF); +DigitalOut led3(NC, LED_OFF); +DigitalOut led4(NC, LED_OFF); +#endif // USE_LEDS +#define led1_RFailLED led1 +#define led2_GPassLED led2 +#define led3_BBusyLED led3 + +//-------------------------------------------------- + + +// example code board support +//MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3); +//DigitalOut rLED(LED1); +//DigitalOut gLED(LED2); +//DigitalOut bLED(LED3); +// +// Arduino "shield" connector port definitions (MAX32625MBED shown) +#if defined(TARGET_MAX32625MBED) +#define A0 AIN_0 +#define A1 AIN_1 +#define A2 AIN_2 +#define A3 AIN_3 +#define D0 P0_0 +#define D1 P0_1 +#define D2 P0_2 +#define D3 P0_3 +#define D4 P0_4 +#define D5 P0_5 +#define D6 P0_6 +#define D7 P0_7 +#define D8 P1_4 +#define D9 P1_5 +#define D10 P1_3 +#define D11 P1_1 +#define D12 P1_2 +#define D13 P1_0 +#endif + +// example code declare SPI interface +#if defined(TARGET_MAX32625MBED) +SPI spi(SPI1_MOSI, SPI1_MISO, SPI1_SCK); // mosi, miso, sclk spi1 TARGET_MAX32625MBED: P1_1 P1_2 P1_0 Arduino 10-pin header D11 D12 D13 +DigitalOut spi_cs(SPI1_SS); // TARGET_MAX32625MBED: P1_3 Arduino 10-pin header D10 +#elif defined(TARGET_MAX32600MBED) +SPI spi(SPI2_MOSI, SPI2_MISO, SPI2_SCK); // mosi, miso, sclk spi1 TARGET_MAX32600MBED: Arduino 10-pin header D11 D12 D13 +DigitalOut spi_cs(SPI2_SS); // Generic: Arduino 10-pin header D10 +#else +SPI spi(D11, D12, D13); // mosi, miso, sclk spi1 TARGET_MAX32600MBED: Arduino 10-pin header D11 D12 D13 +DigitalOut spi_cs(D10); // Generic: Arduino 10-pin header D10 +#endif +// example code declare GPIO interface pins +DigitalOut CONVRUN_pin(D9); // Digital Configuration Input to MAX11043 device +DigitalOut SHDN_pin(D8); // Digital Configuration Input to MAX11043 device +DigitalOut DACSTEP_pin(D7); // Digital Configuration Input to MAX11043 device +DigitalOut UP_slash_DWNb_pin(D6); // Digital Configuration Input to MAX11043 device +DigitalIn EOC_pin(D2); // Digital Event Output from MAX11043 device +// example code declare device instance +MAX11043 g_MAX11043_device(spi, spi_cs, CONVRUN_pin, SHDN_pin, DACSTEP_pin, UP_slash_DWNb_pin, EOC_pin, MAX11043::MAX11043_IC); + + +//---------------------------------------- +// Global SPI options +// + +//---------------------------------------- +// Global I2C options +// + +#define APPLICATION_ArduinoPinsMonitor 1 + +//-------------------------------------------------- +// use BUTTON1 trigger some action +#if defined(TARGET_MAX32630) +#define HAS_BUTTON1_DEMO_INTERRUPT 1 +#define HAS_BUTTON2_DEMO 0 +#define HAS_BUTTON2_DEMO_INTERRUPT 0 +#elif defined(TARGET_MAX32625PICO) +#warning "TARGET_MAX32625PICO not previously tested; need to define buttons..." +#define HAS_BUTTON1_DEMO_INTERRUPT 1 +#define HAS_BUTTON2_DEMO 0 +#define HAS_BUTTON2_DEMO_INTERRUPT 0 +#elif defined(TARGET_MAX32625) +#define HAS_BUTTON1_DEMO_INTERRUPT 1 +#define HAS_BUTTON2_DEMO_INTERRUPT 1 +#elif defined(TARGET_MAX32620FTHR) +#warning "TARGET_MAX32620FTHR not previously tested; need to define buttons..." +#define BUTTON1 SW1 +#define HAS_BUTTON1_DEMO_INTERRUPT 1 +#define HAS_BUTTON2_DEMO 0 +#define HAS_BUTTON2_DEMO_INTERRUPT 0 +#elif defined(TARGET_NUCLEO_F446RE) +#define HAS_BUTTON1_DEMO_INTERRUPT 0 +#define HAS_BUTTON2_DEMO_INTERRUPT 0 +#elif defined(TARGET_NUCLEO_F401RE) +#define HAS_BUTTON1_DEMO_INTERRUPT 0 +#define HAS_BUTTON2_DEMO_INTERRUPT 0 +#else +#warning "target not previously tested; need to define buttons..." +#endif +// +#ifndef HAS_BUTTON1_DEMO +#define HAS_BUTTON1_DEMO 0 +#endif +#ifndef HAS_BUTTON2_DEMO +#define HAS_BUTTON2_DEMO 0 +#endif +// +// avoid runtime error on button1 press [mbed-os-5.11] +// instead of using InterruptIn, use DigitalIn and poll in main while(1) +#ifndef HAS_BUTTON1_DEMO_INTERRUPT_POLLING +#define HAS_BUTTON1_DEMO_INTERRUPT_POLLING 1 +#endif +// +#ifndef HAS_BUTTON1_DEMO_INTERRUPT +#define HAS_BUTTON1_DEMO_INTERRUPT 1 +#endif +#ifndef HAS_BUTTON2_DEMO_INTERRUPT +#define HAS_BUTTON2_DEMO_INTERRUPT 1 +#endif +// +#if HAS_BUTTON1_DEMO_INTERRUPT +# if HAS_BUTTON1_DEMO_INTERRUPT_POLLING +// avoid runtime error on button1 press [mbed-os-5.11] +// instead of using InterruptIn, use DigitalIn and poll in main while(1) +DigitalIn button1(BUTTON1); +# else +InterruptIn button1(BUTTON1); +# endif +#elif HAS_BUTTON1_DEMO +DigitalIn button1(BUTTON1); +#endif +#if HAS_BUTTON2_DEMO_INTERRUPT +# if HAS_BUTTON1_DEMO_INTERRUPT_POLLING +// avoid runtime error on button1 press [mbed-os-5.11] +// instead of using InterruptIn, use DigitalIn and poll in main while(1) +DigitalIn button2(BUTTON2); +# else +InterruptIn button2(BUTTON2); +# endif +#elif HAS_BUTTON2_DEMO +DigitalIn button2(BUTTON2); +#endif + +//-------------------------------------------------- +// When user presses button BUTTON1, perform self test +#if HAS_BUTTON1_DEMO_INTERRUPT +void onButton1FallingEdge(void) +{ + void SelfTest(CmdLine & cmdLine); + SelfTest(cmdLine_serial); +} +#endif // HAS_BUTTON1_DEMO_INTERRUPT + +//-------------------------------------------------- +// When user presses button BUTTON2, perform demo configuration +#if HAS_BUTTON2_DEMO_INTERRUPT +void onButton2FallingEdge(void) +{ + // TBD demo configuration + // TODO diagnostic LED +} +#endif // HAS_BUTTON2_DEMO_INTERRUPT + +//-------------------------------------------------- +void SelfTest(CmdLine & cmdLine) +{ + //-------------------------------------------------- +#if analogIn4_IS_HIGH_RANGE_OF_analogIn0 + // Platform board uses AIN4,AIN5,.. as high range of AIN0,AIN1,.. + MaximTinyTester tinyTester(cmdLine, analogIn4, analogIn5, analogIn2, analogIn3, analogIn0, analogIn4, led1_RFailLED, led2_GPassLED, led3_BBusyLED); + tinyTester.analogInPin_fullScaleVoltage[0] = analogInPin_fullScaleVoltage[4]; // board support + tinyTester.analogInPin_fullScaleVoltage[1] = analogInPin_fullScaleVoltage[5]; // board support + tinyTester.analogInPin_fullScaleVoltage[2] = analogInPin_fullScaleVoltage[2]; // board support + tinyTester.analogInPin_fullScaleVoltage[3] = analogInPin_fullScaleVoltage[3]; // board support + tinyTester.analogInPin_fullScaleVoltage[4] = analogInPin_fullScaleVoltage[0]; // board support + tinyTester.analogInPin_fullScaleVoltage[5] = analogInPin_fullScaleVoltage[1]; // board support + // low range channels AIN0, AIN1, AIN2, AIN3 +#else // analogIn4_IS_HIGH_RANGE_OF_analogIn0 + // Platform board uses simple analog inputs + MaximTinyTester tinyTester(cmdLine, analogIn0, analogIn1, analogIn2, analogIn3, analogIn4, analogIn5, led1_RFailLED, led2_GPassLED, led3_BBusyLED); + tinyTester.analogInPin_fullScaleVoltage[0] = analogInPin_fullScaleVoltage[0]; // board support + tinyTester.analogInPin_fullScaleVoltage[1] = analogInPin_fullScaleVoltage[1]; // board support + tinyTester.analogInPin_fullScaleVoltage[2] = analogInPin_fullScaleVoltage[2]; // board support + tinyTester.analogInPin_fullScaleVoltage[3] = analogInPin_fullScaleVoltage[3]; // board support + tinyTester.analogInPin_fullScaleVoltage[4] = analogInPin_fullScaleVoltage[4]; // board support + tinyTester.analogInPin_fullScaleVoltage[5] = analogInPin_fullScaleVoltage[5]; // board support +#endif + tinyTester.clear(); + + // CODE GENERATOR: generate SelfTest based on function docstrings @test lines + + // +#if INJECT_SELFTEST_FAIL + // Test of the pass/fail report mechanism + tinyTester.FAIL(); + cmdLine.serial().print(F("injecting one false failure for test reporting")); +#endif + // + // Report number of pass and number of fail test results + tinyTester.Report_Summary(); +} + + +//-------------------------------------------------- +inline void print_command_prompt() +{ + cmdLine_serial.serial().printf("\r\n> "); + +} + + +//-------------------------------------------------- +void pinsMonitor_submenu_onEOLcommandParser(CmdLine& cmdLine) +{ + // % diagnostic commands submenu + // %Hpin -- digital output high + // %Lpin -- digital output low + // %?pin -- digital input + // %A %Apin -- analog input + // %Ppin df=xx -- pwm output + // %Wpin -- measure high pulsewidth input in usec + // %wpin -- measure low pulsewidth input in usec + // %I... -- I2C diagnostics + // %IP -- I2C probe + // %IC scl=100khz ADDR=? -- I2C configure + // %IW byte byte ... byte RD=? ADDR=0x -- write + // %IR ADDR=? RD=? -- read + // %I^ cmd=? -- i2c_smbus_read_word_data + // %S... -- SPI diagnostics + // %SC sclk=1Mhz -- SPI configure + // %SW -- write (write and read) + // %SR -- read (alias for %SW because SPI always write and read) + // A-Z,a-z,0-9 reserved for application use + // + char strPinIndex[3]; + strPinIndex[0] = cmdLine[2]; + strPinIndex[1] = cmdLine[3]; + strPinIndex[2] = '\0'; + int pinIndex = strtoul(strPinIndex, NULL, 10); // strtol(str, NULL, 10): get decimal value + //cmdLine.serial().printf(" pinIndex=%d ", pinIndex); + // + // get next character + switch (cmdLine[1]) + { +#if HAS_digitalInOuts + case 'H': case 'h': + { + // %Hpin -- digital output high +#if ARDUINO_STYLE + pinMode(pinIndex, OUTPUT); // digital pins 0, 1, 2, .. 13, analog input pins A0, A1, .. A5 + digitalWrite(pinIndex, HIGH); // digital pins 0, 1, 2, .. 13, analog input pins A0, A1, .. A5 +#else + DigitalInOut& digitalInOutPin = find_digitalInOutPin(pinIndex); + digitalInOutPin.output(); + digitalInOutPin.write(1); +#endif + cmdLine.serial().printf(" digitalInOutPin %d Output High ", pinIndex); + } + break; + case 'L': case 'l': + { + // %Lpin -- digital output low +#if ARDUINO_STYLE + pinMode(pinIndex, OUTPUT); // digital pins 0, 1, 2, .. 13, analog input pins A0, A1, .. A5 + digitalWrite(pinIndex, LOW); // digital pins 0, 1, 2, .. 13, analog input pins A0, A1, .. A5 +#else + DigitalInOut& digitalInOutPin = find_digitalInOutPin(pinIndex); + digitalInOutPin.output(); + digitalInOutPin.write(0); +#endif + cmdLine.serial().printf(" digitalInOutPin %d Output Low ", pinIndex); + } + break; + case '?': + { + // %?pin -- digital input +#if ARDUINO_STYLE + pinMode(pinIndex, INPUT); // digital pins 0, 1, 2, .. 13, analog input pins A0, A1, .. A5 +#else + DigitalInOut& digitalInOutPin = find_digitalInOutPin(pinIndex); + digitalInOutPin.input(); +#endif + serial.printf(" digitalInOutPin %d Input ", pinIndex); +#if ARDUINO_STYLE + int value = digitalRead(pinIndex); +#else + int value = digitalInOutPin.read(); +#endif + cmdLine.serial().printf("%d ", value); + } + break; +#endif + // +#if HAS_analogIns + case 'A': case 'a': + { + // %A %Apin -- analog input +#if analogIn4_IS_HIGH_RANGE_OF_analogIn0 + // Platform board uses AIN4,AIN5,.. as high range of AIN0,AIN1,.. + for (int pinIndex = 0; pinIndex < 2; pinIndex++) + { + int cPinIndex = '0' + pinIndex; + AnalogIn& analogInPin = find_analogInPin(cPinIndex); + float adc_full_scale_voltage = analogInPin_fullScaleVoltage[pinIndex]; + float normValue_0_1 = analogInPin.read(); + // + int pinIndexH = pinIndex + 4; + int cPinIndexH = '0' + pinIndexH; + AnalogIn& analogInPinH = find_analogInPin(cPinIndexH); + float adc_full_scale_voltageH = analogInPin_fullScaleVoltage[pinIndexH]; + float normValueH_0_1 = analogInPinH.read(); + // + cmdLine.serial().printf("AIN%c = %7.3f%% = %1.3fV AIN%c = %7.3f%% = %1.3fV \r\n", + cPinIndex, + normValue_0_1 * 100.0, + normValue_0_1 * adc_full_scale_voltage, + cPinIndexH, + normValueH_0_1 * 100.0, + normValueH_0_1 * adc_full_scale_voltageH + ); + } + for (int pinIndex = 2; pinIndex < 4; pinIndex++) + { + int cPinIndex = '0' + pinIndex; + AnalogIn& analogInPin = find_analogInPin(cPinIndex); + float adc_full_scale_voltage = analogInPin_fullScaleVoltage[pinIndex]; + float normValue_0_1 = analogInPin.read(); + // + cmdLine.serial().printf("AIN%c = %7.3f%% = %1.3fV\r\n", + cPinIndex, + normValue_0_1 * 100.0, + normValue_0_1 * adc_full_scale_voltage + ); + } +#else // analogIn4_IS_HIGH_RANGE_OF_analogIn0 + // Platform board uses simple analog inputs + // assume standard Arduino analog inputs A0-A5 + for (int pinIndex = 0; pinIndex < 6; pinIndex++) + { + int cPinIndex = '0' + pinIndex; + AnalogIn& analogInPin = find_analogInPin(cPinIndex); + float adc_full_scale_voltage = analogInPin_fullScaleVoltage[pinIndex]; + float normValue_0_1 = analogInPin.read(); + // + cmdLine.serial().printf("AIN%c = %7.3f%% = %1.3fV\r\n", + cPinIndex, + normValue_0_1 * 100.0, + normValue_0_1 * adc_full_scale_voltage + ); + } +#endif // analogIn4_IS_HIGH_RANGE_OF_analogIn0 + } + break; +#endif + // +#if HAS_SPI2_MAX541 + case 'D': case 'd': + { + // %D -- DAC output MAX541 (SPI2) -- need cmdLine.parse_float(voltageV) + // MAX541 max541(spi2_max541, spi2_max541_cs); + float voltageV = max541.Get_Voltage(); + // if (cmdLine[2] == '+') { + // // %D+ + // voltageV = voltageV * 1.25f; + // if (voltageV >= max541.VRef) voltageV = max541.VRef; + // SelfTest_MAX541_Voltage(cmdLine, max541, voltageV); + // } + // else if (cmdLine[2] == '-') { + // // %D- + // voltageV = voltageV * 0.75f; + // if (voltageV < 0.1f) voltageV = 0.1f; + // SelfTest_MAX541_Voltage(cmdLine, max541, voltageV); + // } + if (cmdLine.parse_float("V", voltageV)) + { + // %D V=1.234 -- set voltage + max541.Set_Voltage(voltageV); + } + else if (cmdLine.parse_float("TEST", voltageV)) + { + // %D TEST=1.234 -- set voltage and compare with AIN0 + SelfTest_MAX541_Voltage(cmdLine, max541, voltageV); + } + else if (cmdLine.parse_float("CAL", voltageV)) + { + // %D CAL=1.234 -- calibrate VRef and compare with AIN0 + + max541.Set_Code(0x8000); // we don't know the fullscale voltage yet, so set code to midscale + double max541_midscale_V = analogInPin_fullScaleVoltage[4] * analogIn4.read(); // TARGET_MAX32630 J1.5 AIN_4 = AIN0 / 5.0 fullscale is 6.0V + const int average_count = 100; + const double average_K = 0.25; + for (int count = 0; count < average_count; count++) { + double measurement_V = analogInPin_fullScaleVoltage[4] * analogIn4.read(); // TARGET_MAX32630 J1.5 AIN_4 = AIN0 / 5.0 fullscale is 6.0V + max541_midscale_V = ((1 - average_K) * max541_midscale_V) + (average_K * measurement_V); + } + max541.VRef = 2.0 * max541_midscale_V; + cmdLine.serial().printf( + "\r\n MAX541 midscale = %1.3fV, so fullscale = %1.3fV", + max541_midscale_V, max541.VRef); + // Detect whether MAX541 is really connected to MAX32625MBED.AIN0/AIN4 + voltageV = 1.0f; + SelfTest_MAX541_Voltage(cmdLine, max541, voltageV); + } + else { + // %D -- print MAX541 DAC status + cmdLine.serial().printf("MAX541 code=0x%4.4x = %1.3fV VRef=%1.3fV\r\n", + max541.Get_Code(), max541.Get_Voltage(), max541.VRef); + } + } + break; +#endif + + // +#if HAS_I2C // SUPPORT_I2C + case 'I': case 'i': + // %I... -- I2C diagnostics + // %IP -- I2C probe + // %IC scl=100khz ADDR=? -- I2C configure + // %IW byte byte ... byte RD=? ADDR=0x -- write + // %IR ADDR=? RD=? -- read + // %I^ cmd=? -- i2c_smbus_read_word_data + // get next character + // TODO: parse cmdLine arg (ADDR=\d+)? --> g_I2C_deviceAddress7 + cmdLine.parse_byte_hex("ADDR", g_I2C_deviceAddress7); + // TODO: parse cmdLine arg (RD=\d)? --> g_I2C_read_count + g_I2C_read_count = 0; // read count must be reset every command + cmdLine.parse_byte_dec("RD", g_I2C_read_count); + // TODO: parse cmdLine arg (CMD=\d)? --> g_I2C_command_regAddress + cmdLine.parse_byte_hex("CMD", g_I2C_command_regAddress); + switch (cmdLine[2]) + { + case 'P': case 'p': + { + // %IP -- I2C probe + HuntAttachedI2CDevices(cmdLine, 0x03, 0x77); + } + break; + case 'C': case 'c': + { + bool isUpdatedI2CConfig = false; + // %IC scl=100khz ADDR=? -- I2C configure + // parse cmdLine arg (SCL=\d+(kHZ|MHZ)?)? --> g_I2C_SCL_Hz + if (cmdLine.parse_frequency_Hz("SCL", g_I2C_SCL_Hz)) + { + isUpdatedI2CConfig = true; + // TODO1: validate g_I2C_SCL_Hz against system clock frequency F_CPU + if (g_I2C_SCL_Hz > limit_max_I2C_SCL_Hz) + { + g_I2C_SCL_Hz = limit_max_I2C_SCL_Hz; + } + if (g_I2C_SCL_Hz < limit_min_I2C_SCL_Hz) + { + g_I2C_SCL_Hz = limit_min_I2C_SCL_Hz; + } + } + if (isUpdatedI2CConfig) + { + // declare in narrower scope: MAX32625MBED I2C i2cMaster(...) + I2C i2cMaster(I2C0_SDA, I2C0_SCL); // sda scl TARGET_MAX32635MBED: P1_6, P1_7 Arduino 10-pin header + i2cMaster.frequency(g_I2C_SCL_Hz); + i2cMaster.start(); + i2cMaster.stop(); + i2cMaster.frequency(g_I2C_SCL_Hz); + cmdLine.serial().printf( + "\r\n %%IC ADDR=0x%2.2x=(0x%2.2x>>1) SCL=%d=%1.3fkHz -- I2C config", + g_I2C_deviceAddress7, (g_I2C_deviceAddress7 << 1), g_I2C_SCL_Hz, + (g_I2C_SCL_Hz / 1000.)); + i2cMaster.start(); + i2cMaster.stop(); + } + } + break; + case 'W': case 'w': + { + // declare in narrower scope: MAX32625MBED I2C i2cMaster(...) + I2C i2cMaster(I2C0_SDA, I2C0_SCL); // sda scl TARGET_MAX32635MBED: P1_6, P1_7 Arduino 10-pin header + i2cMaster.frequency(g_I2C_SCL_Hz); + // %IW byte byte ... byte RD=? ADDR=0x -- write + // parse cmdLine byte list --> int byteCount; int mosiData[MAX_SPI_BYTE_COUNT]; + #define MAX_I2C_BYTE_COUNT 32 + size_t byteCount = byteCount; + static char mosiData[MAX_I2C_BYTE_COUNT]; + static char misoData[MAX_I2C_BYTE_COUNT]; + if (cmdLine.parse_byteCount_byteList_hex(byteCount, mosiData, + MAX_I2C_BYTE_COUNT)) + { + // hex dump mosiData[0..byteCount-1] + cmdLine.serial().printf( + "\r\nADDR=0x%2.2x=(0x%2.2x>>1) byteCount:%d RD=%d\r\nI2C MOSI->", + g_I2C_deviceAddress7, + (g_I2C_deviceAddress7 << 1), byteCount, g_I2C_read_count); + for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) + { + cmdLine.serial().printf(" 0x%2.2X", mosiData[byteIndex]); + } + // + // TODO: i2c transfer + //const int addr7bit = 0x48; // 7 bit I2C address + //const int addr8bit = 0x48 << 1; // 8bit I2C address, 0x90 + // /* int */ i2cMaster.read (int addr8bit, char *data, int length, bool repeated=false) // Read from an I2C slave. + // /* int */ i2cMaster.read (int ack) // Read a single byte from the I2C bus. + // /* int */ i2cMaster.write (int addr8bit, const char *data, int length, bool repeated=false) // Write to an I2C slave. + // /* int */ i2cMaster.write (int data) // Write single byte out on the I2C bus. + // /* void */ i2cMaster.start (void) // Creates a start condition on the I2C bus. + // /* void */ i2cMaster.stop (void) // Creates a stop condition on the I2C bus. + // /* int */ i2cMaster.transfer (int addr8bit, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, const event_callback_t &callback, int event=I2C_EVENT_TRANSFER_COMPLETE, bool repeated=false) // Start nonblocking I2C transfer. More... + // /* void */ i2cMaster.abort_transfer () // Abort the ongoing I2C transfer. More... + const int addr8bit = g_I2C_deviceAddress7 << 1; // 8bit I2C address, 0x90 + unsigned int misoLength = 0; + bool repeated = (g_I2C_read_count > 0); + // + int writeStatus = i2cMaster.write (addr8bit, mosiData, byteCount, repeated); + switch (writeStatus) + { + case 0: cmdLine.serial().printf(" ack "); break; + case 1: cmdLine.serial().printf(" nack "); break; + default: cmdLine.serial().printf(" {writeStatus 0x%2.2X} ", + writeStatus); + } + if (repeated) + { + int readStatus = + i2cMaster.read (addr8bit, misoData, g_I2C_read_count, false); + switch (readStatus) + { + case 1: cmdLine.serial().printf(" nack "); break; + case 0: cmdLine.serial().printf(" ack "); break; + default: cmdLine.serial().printf(" {readStatus 0x%2.2X} ", + readStatus); + } + } + // + if (misoLength > 0) + { + // hex dump misoData[0..byteCount-1] + cmdLine.serial().printf(" MISO<-"); + for (unsigned int byteIndex = 0; byteIndex < g_I2C_read_count; + byteIndex++) + { + cmdLine.serial().printf(" 0x%2.2X", misoData[byteIndex]); + } + } + cmdLine.serial().printf(" "); + } + } + break; + case 'R': case 'r': + { + // declare in narrower scope: MAX32625MBED I2C i2cMaster(...) + I2C i2cMaster(I2C0_SDA, I2C0_SCL); // sda scl TARGET_MAX32635MBED: P1_6, P1_7 Arduino 10-pin header + i2cMaster.frequency(g_I2C_SCL_Hz); + // %IR ADDR=? RD=? -- read + // TODO: i2c transfer + //const int addr7bit = 0x48; // 7 bit I2C address + //const int addr8bit = 0x48 << 1; // 8bit I2C address, 0x90 + // /* int */ i2cMaster.read (int addr8bit, char *data, int length, bool repeated=false) // Read from an I2C slave. + // /* int */ i2cMaster.read (int ack) // Read a single byte from the I2C bus. + // /* int */ i2cMaster.write (int addr8bit, const char *data, int length, bool repeated=false) // Write to an I2C slave. + // /* int */ i2cMaster.write (int data) // Write single byte out on the I2C bus. + // /* void */ i2cMaster.start (void) // Creates a start condition on the I2C bus. + // /* void */ i2cMaster.stop (void) // Creates a stop condition on the I2C bus. + // /* int */ i2cMaster.transfer (int addr8bit, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, const event_callback_t &callback, int event=I2C_EVENT_TRANSFER_COMPLETE, bool repeated=false) // Start nonblocking I2C transfer. More... + // /* void */ i2cMaster.abort_transfer () // Abort the ongoing I2C transfer. More... + } + break; + case '^': + { + // declare in narrower scope: MAX32625MBED I2C i2cMaster(...) + I2C i2cMaster(I2C0_SDA, I2C0_SCL); // sda scl TARGET_MAX32635MBED: P1_6, P1_7 Arduino 10-pin header + i2cMaster.frequency(g_I2C_SCL_Hz); + // %I^ cmd=? -- i2c_smbus_read_word_data + // TODO: i2c transfer + //const int addr7bit = 0x48; // 7 bit I2C address + //const int addr8bit = 0x48 << 1; // 8bit I2C address, 0x90 + // /* int */ i2cMaster.read (int addr8bit, char *data, int length, bool repeated=false) // Read from an I2C slave. + // /* int */ i2cMaster.read (int ack) // Read a single byte from the I2C bus. + // /* int */ i2cMaster.write (int addr8bit, const char *data, int length, bool repeated=false) // Write to an I2C slave. + // /* int */ i2cMaster.write (int data) // Write single byte out on the I2C bus. + // /* void */ i2cMaster.start (void) // Creates a start condition on the I2C bus. + // /* void */ i2cMaster.stop (void) // Creates a stop condition on the I2C bus. + // /* int */ i2cMaster.transfer (int addr8bit, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, const event_callback_t &callback, int event=I2C_EVENT_TRANSFER_COMPLETE, bool repeated=false) // Start nonblocking I2C transfer. More... + // /* void */ i2cMaster.abort_transfer () // Abort the ongoing I2C transfer. More... + } + break; + } // switch(cmdLine[2]) + break; +#endif + // +#if HAS_SPI // SUPPORT_SPI + case 'S': case 's': + { + // %S... -- SPI diagnostics + // %SC sclk=1Mhz -- SPI configure + // %SW -- write (write and read) + // %SR -- read (alias for %SW because SPI always write and read) + // + // Process arguments SCLK=\d+(kHZ|MHZ) CPOL=\d CPHA=\d + bool isUpdatedSPIConfig = false; + // parse cmdLine arg (CPOL=\d)? --> g_SPI_dataMode | SPI_MODE2 + // parse cmdLine arg (CPHA=\d)? --> g_SPI_dataMode | SPI_MODE1 + if (cmdLine.parse_flag("CPOL", g_SPI_dataMode, SPI_MODE2)) + { + isUpdatedSPIConfig = true; + } + if (cmdLine.parse_flag("CPHA", g_SPI_dataMode, SPI_MODE1)) + { + isUpdatedSPIConfig = true; + } + if (cmdLine.parse_flag("CS", g_SPI_cs_state, 1)) + { + isUpdatedSPIConfig = true; + } + // parse cmdLine arg (SCLK=\d+(kHZ|MHZ)?)? --> g_SPI_SCLK_Hz + if (cmdLine.parse_frequency_Hz("SCLK", g_SPI_SCLK_Hz)) + { + isUpdatedSPIConfig = true; + // TODO1: validate g_SPI_SCLK_Hz against system clock frequency F_CPU + if (g_SPI_SCLK_Hz > limit_max_SPI_SCLK_Hz) + { + g_SPI_SCLK_Hz = limit_max_SPI_SCLK_Hz; + } + if (g_SPI_SCLK_Hz < limit_min_SPI_SCLK_Hz) + { + g_SPI_SCLK_Hz = limit_min_SPI_SCLK_Hz; + } + } + // Update SPI configuration + if (isUpdatedSPIConfig) + { + // %SC sclk=1Mhz -- SPI configure + spi_cs = g_SPI_cs_state; + spi.format(8,g_SPI_dataMode); // int bits_must_be_8, int mode=0_3 CPOL=0,CPHA=0 +#if APPLICATION_MAX5715 + g_MAX5715_device.spi_frequency(g_SPI_SCLK_Hz); +#elif APPLICATION_MAX11131 + g_MAX11131_device.spi_frequency(g_SPI_SCLK_Hz); +#elif APPLICATION_MAX5171 + g_MAX5171_device.spi_frequency(g_SPI_SCLK_Hz); +#elif APPLICATION_MAX11410 + g_MAX11410_device.spi_frequency(g_SPI_SCLK_Hz); +#elif APPLICATION_MAX12345 + g_MAX12345_device.spi_frequency(g_SPI_SCLK_Hz); +#else + spi.frequency(g_SPI_SCLK_Hz); // int SCLK_Hz=1000000 = 1MHz (initial default) +#endif + // + double ideal_divisor = ((double)SystemCoreClock) / g_SPI_SCLK_Hz; + int actual_divisor = (int)(ideal_divisor + 0.0); // frequency divisor truncate + double actual_SCLK_Hz = SystemCoreClock / actual_divisor; + // + // fixed: mbed-os-5.11: [Warning] format '%d' expects argument of type 'int', but argument 6 has type 'uint32_t {aka long unsigned int}' [-Wformat=] + cmdLine.serial().printf( + "\r\n %%SC CPOL=%d CPHA=%d CS=%d SCLK=%ld=%1.3fMHz (%1.1fMHz/%1.2f = actual %1.3fMHz) -- SPI config", + ((g_SPI_dataMode & SPI_MODE2) ? 1 : 0), + ((g_SPI_dataMode & SPI_MODE1) ? 1 : 0), + g_SPI_cs_state, + g_SPI_SCLK_Hz, + (g_SPI_SCLK_Hz / 1000000.), + ((double)(SystemCoreClock / 1000000.)), + ideal_divisor, + (actual_SCLK_Hz / 1000000.) + ); + } + // get next character + switch (cmdLine[2]) + { + case 'C': case 's': + // %SC sclk=1Mhz -- SPI configure + break; + case 'W': case 'R': case 'w': case 'r': + { + // %SW -- write (write and read) + // %SR -- read (alias for %SW because SPI always write and read) + // parse cmdLine byte list --> int byteCount; int mosiData[MAX_SPI_BYTE_COUNT]; + #define MAX_SPI_BYTE_COUNT 32 + size_t byteCount = byteCount; + static char mosiData[MAX_SPI_BYTE_COUNT]; + static char misoData[MAX_SPI_BYTE_COUNT]; + if (cmdLine.parse_byteCount_byteList_hex(byteCount, mosiData, + MAX_SPI_BYTE_COUNT)) + { + // hex dump mosiData[0..byteCount-1] + cmdLine.serial().printf("\r\nSPI"); + if (byteCount > 7) { + cmdLine.serial().printf(" byteCount:%d", byteCount); + } + cmdLine.serial().printf(" MOSI->"); + for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++) + { + cmdLine.serial().printf(" 0x%2.2X", mosiData[byteIndex]); + } + spi_cs = 0; + unsigned int numBytesTransferred = + spi.write(mosiData, byteCount, misoData, byteCount); + spi_cs = 1; + // hex dump misoData[0..byteCount-1] + cmdLine.serial().printf(" MISO<-"); + for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; + byteIndex++) + { + cmdLine.serial().printf(" 0x%2.2X", misoData[byteIndex]); + } + cmdLine.serial().printf(" "); + } + } + break; + } // switch(cmdLine[2]) + } // case 'S': // %S... -- SPI diagnostics + break; +#endif + // + // A-Z,a-z,0-9 reserved for application use + } // switch(cmdLine[1]) +} // end void pinsMonitor_submenu_onEOLcommandParser(CmdLine & cmdLine) + + +//-------------------------------------------------- +void main_menu_status(CmdLine & cmdLine) +{ + cmdLine.serial().printf("\r\nMain menu"); + + cmdLine.serial().printf(" MAX11043 24-bit 200ksps Delta-Sigma ADC"); + + //cmdLine.serial().print(" %s", TARGET_NAME); + if (cmdLine.nameStr()) + { + cmdLine.serial().printf(" [%s]", cmdLine.nameStr()); + + } + cmdLine.serial().printf("\r\n ? -- help"); + +} + + +//-------------------------------------------------- +void main_menu_help(CmdLine & cmdLine) +{ + // ? -- help + //~ cmdLine.serial().print(F("\r\nMenu:")); + cmdLine.serial().printf("\r\n # -- lines beginning with # are comments"); + + cmdLine.serial().printf("\r\n . -- SelfTest"); + + //cmdLine.serial().print(F("\r\n ! -- Initial Configuration")); + // + // % standardize diagnostic commands + // %Hpin -- digital output high + // %Lpin -- digital output low + // %?pin -- digital input + // %A %Apin -- analog input + // %Ppin df=xx -- pwm output + // %Wpin -- measure high pulsewidth input in usec + // %wpin -- measure low pulsewidth input in usec + // %I... -- I2C diagnostics + // %IP -- I2C probe + // %IC scl=100khz ADDR=? -- I2C configure + // %IW ADDR=? cmd=? data,data,data -- write + // %IR ADDR=? RD=? -- read + // %I^ cmd=? -- i2c_smbus_read_word_data + // %S... -- SPI diagnostics + // %SC sclk=1Mhz -- SPI configure + // %SW -- write (write and read) + // %SR -- read (alias for %SW because SPI always write and read) + // A-Z,a-z,0-9 reserved for application use + // +#if HAS_digitalInOuts + // %Hpin -- digital output high + // %Lpin -- digital output low + // %?pin -- digital input + cmdLine.serial().printf("\r\n %%Hn {pin:"); + list_digitalInOutPins(cmdLine.serial()); + cmdLine.serial().printf("} -- High Output"); + cmdLine.serial().printf("\r\n %%Ln {pin:"); + list_digitalInOutPins(cmdLine.serial()); + cmdLine.serial().printf("} -- Low Output"); + cmdLine.serial().printf("\r\n %%?n {pin:"); + list_digitalInOutPins(cmdLine.serial()); + cmdLine.serial().printf("} -- Input"); +#endif + +#if HAS_analogIns + // Menu A) analogRead A0..7 + // %A %Apin -- analog input + // analogRead(pinIndex) // analog input pins A0, A1, A2, A3, A4, A5; float voltage = analogRead(A0) * (5.0 / 1023.0) + cmdLine.serial().printf("\r\n %%A -- analogRead"); +#endif + +#if HAS_SPI2_MAX541 + // TODO1: MAX541 max541(spi2_max541, spi2_max541_cs); + cmdLine.serial().printf("\r\n %%D -- DAC output MAX541 (SPI2)"); +#endif + +#if HAS_I2C // SUPPORT_I2C + // TODO: support I2C HAS_I2C // SUPPORT_I2C + // VERIFY: I2C utility commands SUPPORT_I2C + // VERIFY: report g_I2C_SCL_Hz = (F_CPU / ((TWBR * 2) + 16)) from last Wire_Sr.setClock(I2C_SCL_Hz); + // %I... -- I2C diagnostics + // %IP -- I2C probe + // %IC scl=100khz ADDR=? -- I2C configure + // %IW byte byte ... byte RD=? ADDR=0x -- write + // %IR ADDR=? RD=? -- read + // %I^ cmd=? -- i2c_smbus_read_word_data + //g_I2C_SCL_Hz = (F_CPU / ((TWBR * 2) + 16)); // 'F_CPU' 'TWBR' not declared in this scope + cmdLine.serial().printf("\r\n %%IC ADDR=0x%2.2x=(0x%2.2x>>1) SCL=%d=%1.3fkHz -- I2C config", + g_I2C_deviceAddress7, (g_I2C_deviceAddress7 << 1), g_I2C_SCL_Hz, + (g_I2C_SCL_Hz / 1000.)); + cmdLine.serial().printf("\r\n %%IW byte byte ... byte RD=? ADDR=0x%2.2x -- I2C write/read", + g_I2C_deviceAddress7); + // +#if SUPPORT_I2C + // Menu ^ cmd=?) i2c_smbus_read_word_data + cmdLine.serial().printf("\r\n %%I^ cmd=? -- i2c_smbus_read_word_data"); + // test low-level I2C i2c_smbus_read_word_data +#endif // SUPPORT_I2C + //cmdLine.serial().printf(" H) Hunt for attached I2C devices"); + cmdLine.serial().printf("\r\n %%IP -- I2C Probe for attached devices"); + // cmdLine.serial().printf(" s) search i2c address"); +#endif // SUPPORT_I2C + +#if HAS_SPI // SUPPORT_SPI + // TODO: support SPI HAS_SPI // SUPPORT_SPI + // SPI test command S (mosiData)+ + // %S... -- SPI diagnostics + // %SC sclk=1Mhz -- SPI configure + // %SW -- write (write and read) + // %SR -- read (alias for %SW because SPI always write and read) + // spi.format(8,0); // int bits_must_be_8, int mode=0_3 CPOL=0,CPHA=0 rising edge (initial default) + // spi.format(8,1); // int bits_must_be_8, int mode=0_3 CPOL=0,CPHA=1 falling edge (initial default) + // spi.format(8,2); // int bits_must_be_8, int mode=0_3 CPOL=1,CPHA=0 falling edge (initial default) + // spi.format(8,3); // int bits_must_be_8, int mode=0_3 CPOL=1,CPHA=1 rising edge (initial default) + // spi.frequency(1000000); // int SCLK_Hz=1000000 = 1MHz (initial default) + // mode | POL PHA + // -----+-------- + // 0 | 0 0 + // 1 | 0 1 + // 2 | 1 0 + // 3 | 1 1 + //cmdLine.serial().printf(" S) SPI mosi,mosi,...mosi hex bytes SCLK=1000000 CPOL=0 CPHA=0"); + // fixed: mbed-os-5.11: [Warning] format '%d' expects argument of type 'int', but argument 3 has type 'uint32_t {aka long unsigned int}' [-Wformat=] + cmdLine.serial().printf("\r\n %%SC SCLK=%ld=%1.3fMHz CPOL=%d CPHA=%d -- SPI config", + g_SPI_SCLK_Hz, (g_SPI_SCLK_Hz / 1000000.), + ((g_SPI_dataMode & SPI_MODE2) ? 1 : 0), + ((g_SPI_dataMode & SPI_MODE1) ? 1 : 0)); + cmdLine.serial().printf("\r\n %%SW mosi,mosi,...mosi -- SPI write hex bytes"); + // VERIFY: parse new SPI settings parse_strCommandArgs() SCLK=1000000 CPOL=0 CPHA=0 +#endif // SUPPORT_SPI + // + // Application-specific commands (help text) here + // +#if APPLICATION_ArduinoPinsMonitor + cmdLine.serial().printf("\r\n A-Z,a-z,0-9 -- reserved for application use"); // ArduinoPinsMonitor +#endif // APPLICATION_ArduinoPinsMonitor + // + + extern bool MAX11043_menu_help(CmdLine & cmdLine); // defined in Test_Menu_MAX11043.cpp\n + MAX11043_menu_help(cmdLine); +} + + + +//-------------------------------------------------- +// main menu command-line parser +// invoked by CmdLine::append(char ch) or CmdLine::idleAppendIfReadable() +void main_menu_onEOLcommandParser(CmdLine & cmdLine) +{ + // DIAGNOSTIC: print line buffer + //~ cmdLine.serial().printf("\r\nmain_menu_onEOLcommandParser: ~%s~\r\n", cmdLine.str()); + // + switch (cmdLine[0]) + { + case '?': + main_menu_status(cmdLine); + main_menu_help(cmdLine); + // print command prompt + //cmdLine.serial().printf("\r\n>"); + break; + case '\r': case '\n': // ignore blank line + case '\0': // ignore empty line + case '#': // ignore comment line + // # -- lines beginning with # are comments + main_menu_status(cmdLine); + //~ main_menu_help(cmdLine); + // print command prompt + //cmdLine.serial().printf("\r\n>"); + break; +#if ECHO_EOF_ON_EOL + case '\x04': // Unicode (U+0004) EOT END OF TRANSMISSION = CTRL+D as EOF end of file + cmdLine.serial().printf("\x04"); // immediately echo EOF for test scripting + diagnostic_led_EOF(); + break; + case '\x1a': // Unicode (U+001A) SUB SUBSTITUTE = CTRL+Z as EOF end of file + cmdLine.serial().printf("\x1a"); // immediately echo EOF for test scripting + diagnostic_led_EOF(); + break; +#endif +#if APPLICATION_ArduinoPinsMonitor + case '.': + { + // . -- SelfTest + cmdLine.serial().printf("SelfTest()"); + SelfTest(cmdLine); + } + break; + case '%': + { + pinsMonitor_submenu_onEOLcommandParser(cmdLine); + } + break; // case '%' +#endif // APPLICATION_ArduinoPinsMonitor + // + // Application-specific commands here + // alphanumeric command codes A-Z,a-z,0-9 reserved for application use + // +#if APPLICATION_ArduinoPinsMonitor +#endif // APPLICATION_ArduinoPinsMonitor + + // + // add new commands here + // + default: + extern bool MAX11043_menu_onEOLcommandParser(CmdLine & cmdLine); // defined in Test_Menu_MAX11043.cpp + if (!MAX11043_menu_onEOLcommandParser(cmdLine)) + { // not_handled_by_device_submenu + cmdLine.serial().printf("\r\n unknown command 0x%2.2x \"%s\"\r\n", cmdLine.str()[0], cmdLine.str()); + +# if HAS_DAPLINK_SERIAL + cmdLine_DAPLINKserial.serial().printf("\r\n unknown command 0x%2.2x \"%s\"\r\n", cmdLine.str()[0], cmdLine.str()); + +# endif // HAS_DAPLINK_SERIAL + } + } // switch (cmdLine[0]) +// +// print command prompt + cmdLine.serial().printf("\r\nMAX11043 > "); + +} // end void main_menu_onEOLcommandParser(CmdLine & cmdLine) + +//-------------------------------------------------- +void InitializeConfiguration() +{ + // CODE GENERATOR: example code: member function Init +# if HAS_DAPLINK_SERIAL + cmdLine_DAPLINKserial.serial().printf("\r\nMAX11043_Init()"); + +# endif + cmdLine_serial.serial().printf("\r\nMAX11043_Init()"); + + // Initialize MAX11043 and verify device ID + if (g_MAX11043_device.Init() == 0) + { // init failed; try "safe mode" SPI at slower SCLK rate + cmdLine_serial.serial().printf("\r\nMAX11043 Init failed; retry at SPI SCLK frequency 2000000 Hz"); + g_SPI_SCLK_Hz = 2000000; + g_MAX11043_device.spi_frequency(2000000); + g_MAX11043_device.Init(); + } + // CODE GENERATOR: get spi properties from device + if (g_SPI_SCLK_Hz > g_MAX11043_device.get_spi_frequency()) + { // Device limits SPI SCLK frequency + g_SPI_SCLK_Hz = g_MAX11043_device.get_spi_frequency(); + cmdLine_serial.serial().printf("\r\nMAX11043 limits SPI SCLK frequency to %dHz\r\n", g_SPI_SCLK_Hz); + g_MAX11043_device.Init(); + } + if (g_MAX11043_device.get_spi_frequency() > g_SPI_SCLK_Hz) + { // Platform limits SPI SCLK frequency + g_MAX11043_device.spi_frequency(g_SPI_SCLK_Hz); + cmdLine_serial.serial().printf("\r\nPlatform limits MAX11043 SPI SCLK frequency to %dHz\r\n", g_SPI_SCLK_Hz); + g_MAX11043_device.Init(); + } + g_SPI_dataMode = g_MAX11043_device.get_spi_dataMode(); + +# if MAX11043_ONSPIPRINT + // Optional Diagnostic function to print SPI transactions + g_MAX11043_device.onSPIprint = onSPIprint_handler; +# endif +} + +//-------------------------------------------------- +// diagnostic rbg led GREEN +void diagnostic_led_EOF() +{ +#if USE_LEDS + led1 = LED_ON; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led RED+GREEN=YELLOW + // TODO1: mbed-os-5.11: [Warning] 'static osStatus rtos::Thread::wait(uint32_t)' is deprecated: Static methods only affecting current thread cause confusion. Replaced by ThisThread::sleep_for. [since mbed-os-5.10] [-Wdeprecated-declarations] + ThisThread::sleep_for(250); // [since mbed-os-5.10] vs Thread::wait(250); + led1 = LED_OFF; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led GREEN + ThisThread::sleep_for(250); // [since mbed-os-5.10] vs Thread::wait(250); + led1 = LED_ON; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led RED+GREEN=YELLOW + ThisThread::sleep_for(250); // [since mbed-os-5.10] vs Thread::wait(250); + led1 = LED_OFF; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led GREEN + ThisThread::sleep_for(250); // [since mbed-os-5.10] vs Thread::wait(250); +#endif // USE_LEDS +} + +//-------------------------------------------------- +// Support commands that get handled immediately w/o waiting for EOL +// handled as immediate command, do not append to buffer +void on_immediate_0x21() // Unicode (U+0021) ! EXCLAMATION MARK +{ +#if USE_LEDS + led1 = LED_OFF; led2 = LED_OFF; led3 = LED_ON; // diagnostic rbg led BLUE +#endif // USE_LEDS + InitializeConfiguration(); + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); +} + +//-------------------------------------------------- +// Support commands that get handled immediately w/o waiting for EOL +// handled as immediate command, do not append to buffer +void on_immediate_0x7b() // Unicode (U+007B) { LEFT CURLY BRACKET +{ +#if HAS_BUTTON2_DEMO_INTERRUPT + onButton2FallingEdge(); +#endif +} + +//-------------------------------------------------- +// Support commands that get handled immediately w/o waiting for EOL +// handled as immediate command, do not append to buffer +void on_immediate_0x7d() // Unicode (U+007D) } RIGHT CURLY BRACKET +{ +#if HAS_BUTTON1_DEMO_INTERRUPT + onButton1FallingEdge(); +#endif +} + +//---------------------------------------- +// example code main function +int main() +{ + // Configure serial ports + cmdLine_serial.clear(); + //~ cmdLine_serial.serial().printf("\r\n cmdLine_serial.serial().printf test\r\n"); + cmdLine_serial.onEOLcommandParser = main_menu_onEOLcommandParser; + cmdLine_serial.diagnostic_led_EOF = diagnostic_led_EOF; + /// CmdLine::set_immediate_handler(char, functionPointer_void_void_on_immediate_0x21); + cmdLine_serial.on_immediate_0x21 = on_immediate_0x21; + cmdLine_serial.on_immediate_0x7b = on_immediate_0x7b; + cmdLine_serial.on_immediate_0x7d = on_immediate_0x7d; +# if HAS_DAPLINK_SERIAL + cmdLine_DAPLINKserial.clear(); + //~ cmdLine_DAPLINKserial.serial().printf("\r\n cmdLine_DAPLINKserial.serial().printf test\r\n"); + cmdLine_DAPLINKserial.onEOLcommandParser = main_menu_onEOLcommandParser; + /// @todo CmdLine::set_immediate_handler(char, functionPointer_void_void_on_immediate_0x21); + cmdLine_DAPLINKserial.on_immediate_0x21 = on_immediate_0x21; + cmdLine_DAPLINKserial.on_immediate_0x7b = on_immediate_0x7b; + cmdLine_DAPLINKserial.on_immediate_0x7d = on_immediate_0x7d; +# endif + + + //print_banner(); + + + +#if USE_LEDS +#if defined(TARGET_MAX32630) + led1 = LED_ON; led2 = LED_OFF; led3 = LED_OFF; // diagnostic rbg led RED + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); + led1 = LED_OFF; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led GREEN + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); + led1 = LED_OFF; led2 = LED_OFF; led3 = LED_ON; // diagnostic rbg led BLUE + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); + led1 = LED_ON; led2 = LED_ON; led3 = LED_ON; // diagnostic rbg led RED+GREEN+BLUE=WHITE + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); + led1 = LED_OFF; led2 = LED_ON; led3 = LED_ON; // diagnostic rbg led GREEN+BLUE=CYAN + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); + led1 = LED_ON; led2 = LED_OFF; led3 = LED_ON; // diagnostic rbg led RED+BLUE=MAGENTA + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); + led1 = LED_ON; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led RED+GREEN=YELLOW + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); + led1 = LED_OFF; led2 = LED_OFF; led3 = LED_OFF; // diagnostic rbg led BLACK + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); +#elif defined(TARGET_MAX32625MBED) + led1 = LED_ON; led2 = LED_OFF; led3 = LED_OFF; // diagnostic rbg led RED + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); + led1 = LED_OFF; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led GREEN + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); + led1 = LED_OFF; led2 = LED_OFF; led3 = LED_ON; // diagnostic rbg led BLUE + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); + led1 = LED_ON; led2 = LED_ON; led3 = LED_ON; // diagnostic rbg led RED+GREEN+BLUE=WHITE + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); + led1 = LED_OFF; led2 = LED_ON; led3 = LED_ON; // diagnostic rbg led GREEN+BLUE=CYAN + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); + led1 = LED_ON; led2 = LED_OFF; led3 = LED_ON; // diagnostic rbg led RED+BLUE=MAGENTA + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); + led1 = LED_ON; led2 = LED_ON; led3 = LED_OFF; // diagnostic rbg led RED+GREEN=YELLOW + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); + led1 = LED_OFF; led2 = LED_OFF; led3 = LED_OFF; // diagnostic rbg led BLACK + ThisThread::sleep_for(125); // [since mbed-os-5.10] vs Thread::wait(125); +#else // not defined(TARGET_LPC1768 etc.) + led1 = LED_ON; + led2 = LED_OFF; + led3 = LED_OFF; + led4 = LED_OFF; + ThisThread::sleep_for(75); // [since mbed-os-5.10] vs Thread::wait(75); + //led1 = LED_ON; + led2 = LED_ON; + ThisThread::sleep_for(75); // [since mbed-os-5.10] vs Thread::wait(75); + led1 = LED_OFF; + //led2 = LED_ON; + led3 = LED_ON; + ThisThread::sleep_for(75); // [since mbed-os-5.10] vs Thread::wait(75); + led2 = LED_OFF; + //led3 = LED_ON; + led4 = LED_ON; + ThisThread::sleep_for(75); // [since mbed-os-5.10] vs Thread::wait(75); + led3 = LED_OFF; + led4 = LED_ON; + // +#endif // target definition +#endif + + // cmd_TE(); + +// #if USE_LEDS +// rgb_led.white(); // diagnostic rbg led RED+GREEN+BLUE=WHITE +// #endif // USE_LEDS + led1 = LED_ON; + led2 = LED_ON; + led3 = LED_ON; + + InitializeConfiguration(); + // CODE GENERATOR: example code: member function Init + g_MAX11043_device.Init(); + + // example code: serial port banner message + #if defined(TARGET_MAX32625MBED) + serial.printf("MAX32625MBED "); + #elif defined(TARGET_MAX32600MBED) + serial.printf("MAX32600MBED "); + #elif defined(TARGET_NUCLEO_F446RE) + serial.printf("NUCLEO_F446RE "); + #endif + serial.printf("MAX11043BOB\r\n"); + + + while (1) { +#if HAS_BUTTON1_DEMO_INTERRUPT_POLLING + // avoid runtime error on button1 press [mbed-os-5.11] + // instead of using InterruptIn, use DigitalIn and poll in main while(1) +# if HAS_BUTTON1_DEMO_INTERRUPT + static int button1_value_prev = 1; + static int button1_value_now = 1; + button1_value_prev = button1_value_now; + button1_value_now = button1.read(); + if ((button1_value_prev - button1_value_now) == 1) + { + // on button1 falling edge (button1 press) + onButton1FallingEdge(); + } +# endif // HAS_BUTTON1_DEMO_INTERRUPT +# if HAS_BUTTON2_DEMO_INTERRUPT + static int button2_value_prev = 1; + static int button2_value_now = 1; + button2_value_prev = button2_value_now; + button2_value_now = button2.read(); + if ((button2_value_prev - button2_value_now) == 1) + { + // on button2 falling edge (button2 press) + onButton2FallingEdge(); + } +# endif // HAS_BUTTON2_DEMO_INTERRUPT +#endif + # if HAS_DAPLINK_SERIAL + if (DAPLINKserial.readable()) { + cmdLine_DAPLINKserial.append(DAPLINKserial.getc()); + } + # endif // HAS_DAPLINK_SERIAL + if (serial.readable()) { + int c = serial.getc(); + cmdLine_serial.append(c); +#if IGNORE_AT_COMMANDS +# if HAS_DAPLINK_SERIAL + cmdLine_DAPLINKserial.serial().printf("%c", c); +# endif // HAS_DAPLINK_SERIAL +#endif // IGNORE_AT_COMMANDS + // + } + } // while(1) +} +//---------- CODE GENERATOR: end testMainCppCodeList
--- a/Test_Menu_MAX11043.cpp Tue Feb 11 01:16:34 2020 +0000 +++ b/Test_Menu_MAX11043.cpp Tue Feb 11 09:01:20 2020 +0000 @@ -627,4 +627,3 @@ } // end bool MAX11043_menu_onEOLcommandParser(CmdLine & cmdLine) // CODE GENERATOR: class declaration statement close -