A program for testing the MCP4725 library. This Test Application requires the following: * An MCP4725 connected to the IC2 bus of the mbed LPC1768. * The analog out of the MCP1768 connected to Pin15 (analog in) of the mbed LPC1768. * An optional LED & resistor connected to analog output for visual feedback of the running tests. This application tests the MCP4725 library's setting of the MCP4725's internal registers (including eeprom storage), it's analog output and power modes.

Dependencies:   mbed

Committer:
donalm
Date:
Sun Nov 03 11:22:01 2013 +0000
Revision:
4:092580187b59
Parent:
0:3e143a2e21c8
Added feedback test on DAC output.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donalm 0:3e143a2e21c8 1 #include <stdbool.h>
donalm 0:3e143a2e21c8 2 #include "mbed.h"
donalm 0:3e143a2e21c8 3 #include "mcp4725.h"
donalm 0:3e143a2e21c8 4
donalm 0:3e143a2e21c8 5 /**
donalm 4:092580187b59 6 * A test suite for the MCP4725 DAC Library. This Test Application requires the following:
donalm 4:092580187b59 7 * * An MCP4725 connected to the IC2 bus of the mbed LPC1768.
donalm 4:092580187b59 8 * * The analog out of the MCP1768 connected to Pin15 (analog in) of the mbed LPC1768.
donalm 4:092580187b59 9 * * An optional LED & resistor connected to analog output for visual feedback of the running tests.
donalm 4:092580187b59 10 *
donalm 4:092580187b59 11 * This application tests the MCP4725 library's setting of the MCP4725's internal registers (inclusing eeprom storage),
donalm 4:092580187b59 12 * it's analog output and power modes.
donalm 4:092580187b59 13 *
donalm 0:3e143a2e21c8 14 */
donalm 0:3e143a2e21c8 15
donalm 4:092580187b59 16 DigitalOut testLed(LED1);
donalm 0:3e143a2e21c8 17 Serial pc(USBTX, USBRX);
donalm 4:092580187b59 18 AnalogIn analogIn(p15);
donalm 0:3e143a2e21c8 19
donalm 0:3e143a2e21c8 20 void test_mcp4725_library(PinName sda, PinName scl, MCP4725::BusFrequency bus_frequency, int device_address_bits, char* testName);
donalm 0:3e143a2e21c8 21 int test_init(MCP4725* interface, char* testName);
donalm 4:092580187b59 22 int test_simple_read_write_no_eeprom(MCP4725* interface, enum MCP4725::PowerMode mode, float output_voltage);
donalm 4:092580187b59 23 int test_simple_read_write_with_eeprom(MCP4725* interface, enum MCP4725::PowerMode mode, float output_voltage);
donalm 4:092580187b59 24 int test_eeprom_write_status(MCP4725* interface);
donalm 0:3e143a2e21c8 25
donalm 0:3e143a2e21c8 26 int main()
donalm 0:3e143a2e21c8 27 {
donalm 0:3e143a2e21c8 28 pc.printf("Application for testing the MCP4725 interface library\r\n");
donalm 0:3e143a2e21c8 29
donalm 0:3e143a2e21c8 30 test_mcp4725_library(p9, p10, MCP4725::Standard100kHz, 0, "p9, p10, MCP4725::Standard100kHz");
donalm 0:3e143a2e21c8 31 test_mcp4725_library(p9, p10, MCP4725::Fast400kHz, 0, "p9, p10, MCP4725::Fast400kHz");
donalm 0:3e143a2e21c8 32 test_mcp4725_library(p9, p10, MCP4725::HighSpeed3_4Mhz, 0, "p9, p10, MCP4725::HighSpeed3_4Mhz");
donalm 0:3e143a2e21c8 33
donalm 0:3e143a2e21c8 34 while(1) {
donalm 4:092580187b59 35 testLed = 1;
donalm 0:3e143a2e21c8 36 wait(0.5);
donalm 4:092580187b59 37 testLed = 0;
donalm 0:3e143a2e21c8 38 wait(0.5);
donalm 0:3e143a2e21c8 39 }
donalm 0:3e143a2e21c8 40 }
donalm 0:3e143a2e21c8 41
donalm 0:3e143a2e21c8 42
donalm 0:3e143a2e21c8 43
donalm 0:3e143a2e21c8 44 /** Run a set of simple tests on the mcp4725 driver.
donalm 0:3e143a2e21c8 45 *
donalm 0:3e143a2e21c8 46 * @param sda I2C data line pin
donalm 0:3e143a2e21c8 47 * @param scl I2C clock line pin
donalm 0:3e143a2e21c8 48 * @param bus_frequency the frequency at which the I2C bus is running.
donalm 0:3e143a2e21c8 49 * @param device_address_bits The 3bit address bits of the device.
donalm 0:3e143a2e21c8 50 */
donalm 0:3e143a2e21c8 51 void test_mcp4725_library(PinName sda, PinName scl, MCP4725::BusFrequency bus_frequency, int device_address_bits, char* testName)
donalm 0:3e143a2e21c8 52 {
donalm 0:3e143a2e21c8 53 //Create our instance of the interface for test
donalm 0:3e143a2e21c8 54 MCP4725 mcp4725_interface(sda, scl, bus_frequency, device_address_bits);
donalm 0:3e143a2e21c8 55
donalm 0:3e143a2e21c8 56 if(test_init(&mcp4725_interface, testName) == 0)
donalm 0:3e143a2e21c8 57 {
donalm 4:092580187b59 58 test_simple_read_write_no_eeprom(&mcp4725_interface, MCP4725::Normal, 3.0);
donalm 4:092580187b59 59 test_simple_read_write_no_eeprom(&mcp4725_interface, MCP4725::PowerDown1k, 1.3);
donalm 4:092580187b59 60 test_simple_read_write_no_eeprom(&mcp4725_interface, MCP4725::PowerDown100k, 1.8);
donalm 4:092580187b59 61 test_simple_read_write_no_eeprom(&mcp4725_interface, MCP4725::PowerDown500k, 0.5);
donalm 4:092580187b59 62 test_simple_read_write_no_eeprom(&mcp4725_interface, MCP4725::Normal, 2.5);
donalm 0:3e143a2e21c8 63
donalm 4:092580187b59 64 test_simple_read_write_with_eeprom(&mcp4725_interface, MCP4725::Normal, 3.0);
donalm 4:092580187b59 65 test_simple_read_write_with_eeprom(&mcp4725_interface, MCP4725::PowerDown1k, 1.3);
donalm 4:092580187b59 66 test_simple_read_write_with_eeprom(&mcp4725_interface, MCP4725::PowerDown100k, 1.8);
donalm 4:092580187b59 67 test_simple_read_write_with_eeprom(&mcp4725_interface, MCP4725::PowerDown500k, 0.5);
donalm 4:092580187b59 68 test_simple_read_write_with_eeprom(&mcp4725_interface, MCP4725::Normal, 2.5);
donalm 0:3e143a2e21c8 69
donalm 0:3e143a2e21c8 70 test_eeprom_write_status(&mcp4725_interface);
donalm 0:3e143a2e21c8 71 }
donalm 0:3e143a2e21c8 72
donalm 0:3e143a2e21c8 73
donalm 0:3e143a2e21c8 74 }
donalm 0:3e143a2e21c8 75
donalm 0:3e143a2e21c8 76 /** Initialise the device registers & eeprom. */
donalm 0:3e143a2e21c8 77 int test_init(MCP4725* interface, char* testName)
donalm 0:3e143a2e21c8 78 {
donalm 0:3e143a2e21c8 79 int result;
donalm 0:3e143a2e21c8 80 pc.printf("Initialising test '%s': ", testName);
donalm 0:3e143a2e21c8 81
donalm 0:3e143a2e21c8 82 //Prime the device, including its eeprom.
donalm 0:3e143a2e21c8 83 result = interface->write(MCP4725::Normal, 0, true);
donalm 0:3e143a2e21c8 84 if(result == 0)
donalm 0:3e143a2e21c8 85 {
donalm 0:3e143a2e21c8 86 wait(0.5);
donalm 0:3e143a2e21c8 87 pc.printf("OK\r\n");
donalm 0:3e143a2e21c8 88 }
donalm 0:3e143a2e21c8 89 else
donalm 0:3e143a2e21c8 90 {
donalm 0:3e143a2e21c8 91 pc.printf("FAILED: %d\r\n", result);
donalm 0:3e143a2e21c8 92 }
donalm 0:3e143a2e21c8 93
donalm 0:3e143a2e21c8 94 return result;
donalm 0:3e143a2e21c8 95 }
donalm 0:3e143a2e21c8 96
donalm 0:3e143a2e21c8 97 /* Run a simple read/write test that does not write to eeprom. */
donalm 4:092580187b59 98 int test_simple_read_write_no_eeprom(MCP4725* interface, enum MCP4725::PowerMode mode, float output_voltage)
donalm 0:3e143a2e21c8 99 {
donalm 0:3e143a2e21c8 100 enum MCP4725::PowerMode read_mode;
donalm 0:3e143a2e21c8 101 enum MCP4725::PowerMode read_mode_eeprom;//, write_mode_eeprom;
donalm 0:3e143a2e21c8 102 int read_dac_value;
donalm 0:3e143a2e21c8 103 int read_dac_value_eeprom;//, write_dac_value_eeprom;
donalm 0:3e143a2e21c8 104 bool read_eeprom_write_in_progress;
donalm 0:3e143a2e21c8 105
donalm 4:092580187b59 106 int dac_value = (int) (0xFFF * (output_voltage/3.3) );
donalm 4:092580187b59 107
donalm 0:3e143a2e21c8 108 pc.printf("\tRead/write test without write to eeprom: ");
donalm 0:3e143a2e21c8 109
donalm 0:3e143a2e21c8 110 interface->write(mode, dac_value, false);
donalm 0:3e143a2e21c8 111 interface->read(&read_mode, &read_mode_eeprom, &read_dac_value, &read_dac_value_eeprom, &read_eeprom_write_in_progress);
donalm 0:3e143a2e21c8 112 if( (mode != read_mode) || (dac_value != read_dac_value) || (read_eeprom_write_in_progress == true) || (read_dac_value == read_dac_value_eeprom) )
donalm 0:3e143a2e21c8 113 {
donalm 0:3e143a2e21c8 114 pc.printf("Failed - mode=%d, read_mode=%d, dac_value=%d, read_dac_value=%d, eeprom_write_state:%d\r\n", (int)mode, (int)read_mode, dac_value, read_dac_value, read_eeprom_write_in_progress);
donalm 0:3e143a2e21c8 115 return 1;
donalm 0:3e143a2e21c8 116 }
donalm 0:3e143a2e21c8 117 else
donalm 0:3e143a2e21c8 118 {
donalm 4:092580187b59 119 // We need to wait a short period for the output to stabalise.
donalm 4:092580187b59 120 wait(0.2);
donalm 4:092580187b59 121
donalm 4:092580187b59 122 /* We check at mV resolution.
donalm 4:092580187b59 123 * Resolution of 12bit DAC is 0.8mV
donalm 4:092580187b59 124 * Resolution of 16bit ADC is 0.05mV
donalm 4:092580187b59 125 */
donalm 4:092580187b59 126 int read_value_mv = (analogIn.read() * 3.3) * 100;
donalm 4:092580187b59 127 int set_value_mv = ((int)(output_voltage*100));
donalm 4:092580187b59 128
donalm 4:092580187b59 129 if( (mode == MCP4725::Normal) && (read_value_mv != set_value_mv) )
donalm 4:092580187b59 130 {
donalm 4:092580187b59 131 pc.printf("Failed: set_value=%dmV, read_value=%dmV\r\n", read_value_mv, set_value_mv);
donalm 4:092580187b59 132 return 1;
donalm 4:092580187b59 133 }
donalm 4:092580187b59 134 else if ( (mode != MCP4725::Normal) && (read_value_mv != 0) )
donalm 4:092580187b59 135 {
donalm 4:092580187b59 136 pc.printf("Failed: read_value=%dmV, but DAC in PowerDown!\r\n", read_value_mv);
donalm 4:092580187b59 137 return 1;
donalm 4:092580187b59 138 }
donalm 4:092580187b59 139 else
donalm 4:092580187b59 140 {
donalm 4:092580187b59 141 pc.printf("Passed\r\n");
donalm 4:092580187b59 142 return 0;
donalm 4:092580187b59 143 }
donalm 0:3e143a2e21c8 144 }
donalm 0:3e143a2e21c8 145 }
donalm 0:3e143a2e21c8 146
donalm 0:3e143a2e21c8 147
donalm 0:3e143a2e21c8 148 /* Run a simple read/write test that does write to eeprom. */
donalm 4:092580187b59 149 int test_simple_read_write_with_eeprom(MCP4725* interface, enum MCP4725::PowerMode mode, float output_voltage)
donalm 0:3e143a2e21c8 150 {
donalm 0:3e143a2e21c8 151 enum MCP4725::PowerMode read_mode;
donalm 0:3e143a2e21c8 152 enum MCP4725::PowerMode read_mode_eeprom;//, write_mode_eeprom;
donalm 0:3e143a2e21c8 153 int read_dac_value;
donalm 0:3e143a2e21c8 154 int read_dac_value_eeprom;//, write_dac_value_eeprom;
donalm 0:3e143a2e21c8 155 bool read_eeprom_write_in_progress;
donalm 4:092580187b59 156 int dac_value = (int) (0xFFF * (output_voltage/3.3) );
donalm 0:3e143a2e21c8 157
donalm 0:3e143a2e21c8 158 pc.printf("\tRead/write test with write to eeprom: ");
donalm 0:3e143a2e21c8 159
donalm 0:3e143a2e21c8 160 interface->write(mode, dac_value, true);
donalm 0:3e143a2e21c8 161
donalm 0:3e143a2e21c8 162 wait(0.5); //Wait a short period for the eeprom write to complete.
donalm 0:3e143a2e21c8 163 interface->read(&read_mode, &read_mode_eeprom, &read_dac_value, &read_dac_value_eeprom, &read_eeprom_write_in_progress);
donalm 0:3e143a2e21c8 164
donalm 0:3e143a2e21c8 165 if( (mode != read_mode) || (dac_value != read_dac_value) || (read_eeprom_write_in_progress == true) || (read_dac_value != read_dac_value_eeprom) || (read_mode != read_mode_eeprom) )
donalm 0:3e143a2e21c8 166 {
donalm 0:3e143a2e21c8 167 pc.printf("Failed - mode=%d, read_mode=%d, dac_value=%d, read_dac_value=%d, eeprom_write_state:%d\r\n", (int)mode, (int)read_mode, dac_value, read_dac_value, read_eeprom_write_in_progress);
donalm 0:3e143a2e21c8 168 return 1;
donalm 0:3e143a2e21c8 169 }
donalm 0:3e143a2e21c8 170 else
donalm 0:3e143a2e21c8 171 {
donalm 0:3e143a2e21c8 172 pc.printf("Passed\r\n");
donalm 0:3e143a2e21c8 173 return 0;
donalm 0:3e143a2e21c8 174 }
donalm 0:3e143a2e21c8 175 }
donalm 0:3e143a2e21c8 176
donalm 0:3e143a2e21c8 177 /** Test to see if the eeprom write status bit is reported correctly. */
donalm 0:3e143a2e21c8 178 int test_eeprom_write_status(MCP4725* interface)
donalm 0:3e143a2e21c8 179 {
donalm 0:3e143a2e21c8 180 enum MCP4725::PowerMode read_mode;
donalm 0:3e143a2e21c8 181 enum MCP4725::PowerMode read_mode_eeprom;//, write_mode_eeprom;
donalm 0:3e143a2e21c8 182 int read_dac_value;
donalm 0:3e143a2e21c8 183 int read_dac_value_eeprom;//, write_dac_value_eeprom;
donalm 0:3e143a2e21c8 184 bool read_eeprom_write_in_progress;
donalm 0:3e143a2e21c8 185
donalm 0:3e143a2e21c8 186 pc.printf("\tTest eeprom write status: ");
donalm 0:3e143a2e21c8 187
donalm 0:3e143a2e21c8 188 interface->write(MCP4725::Normal, 4095, true);
donalm 0:3e143a2e21c8 189
donalm 0:3e143a2e21c8 190 //Immediately read the device
donalm 0:3e143a2e21c8 191 interface->read(&read_mode, &read_mode_eeprom, &read_dac_value, &read_dac_value_eeprom, &read_eeprom_write_in_progress);
donalm 0:3e143a2e21c8 192
donalm 0:3e143a2e21c8 193 if( read_eeprom_write_in_progress == false )
donalm 0:3e143a2e21c8 194 {
donalm 0:3e143a2e21c8 195 pc.printf("Failed - EEPROM Write not reported as in progress.\r\n");
donalm 0:3e143a2e21c8 196 return 1;
donalm 0:3e143a2e21c8 197 }
donalm 0:3e143a2e21c8 198 else
donalm 0:3e143a2e21c8 199 {
donalm 0:3e143a2e21c8 200 wait(0.5); //Wait a short period for the eeprom write to complete.
donalm 0:3e143a2e21c8 201 interface->read(&read_mode, &read_mode_eeprom, &read_dac_value, &read_dac_value_eeprom, &read_eeprom_write_in_progress);
donalm 0:3e143a2e21c8 202
donalm 0:3e143a2e21c8 203 if( read_eeprom_write_in_progress == false )
donalm 0:3e143a2e21c8 204 {
donalm 0:3e143a2e21c8 205 pc.printf("Passed\r\n");
donalm 0:3e143a2e21c8 206 return 0;
donalm 0:3e143a2e21c8 207 }
donalm 0:3e143a2e21c8 208 else
donalm 0:3e143a2e21c8 209 {
donalm 0:3e143a2e21c8 210 pc.printf("Failed - EEPROM Write reported as still in progress.\r\n");
donalm 0:3e143a2e21c8 211 return 1;
donalm 0:3e143a2e21c8 212 }
donalm 0:3e143a2e21c8 213 }
donalm 0:3e143a2e21c8 214 }