pizzo

Dependencies:   MCP4725 mbed

Fork of MCP4725_Library_Test by Donal Morrissey

Committer:
donalm
Date:
Sun Nov 03 11:22:01 2013 +0000
Revision:
4:092580187b59
Parent:
0:3e143a2e21c8
Child:
5:03662d049f69
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 }