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 Oct 27 14:03:26 2013 +0000
Revision:
0:3e143a2e21c8
Child:
4:092580187b59
Tidy up before publishing.

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 0:3e143a2e21c8 6 * A basic test suite for the MCP4725 DAC Library.
donalm 0:3e143a2e21c8 7 */
donalm 0:3e143a2e21c8 8
donalm 0:3e143a2e21c8 9 DigitalOut myled(LED1);
donalm 0:3e143a2e21c8 10 Serial pc(USBTX, USBRX);
donalm 0:3e143a2e21c8 11
donalm 0:3e143a2e21c8 12 void test_mcp4725_library(PinName sda, PinName scl, MCP4725::BusFrequency bus_frequency, int device_address_bits, char* testName);
donalm 0:3e143a2e21c8 13 int test_init(MCP4725* interface, char* testName);
donalm 0:3e143a2e21c8 14 int test_simple_read_write_no_eeprom(MCP4725* interface, enum MCP4725::PowerMode mode, int dac_value);
donalm 0:3e143a2e21c8 15 int test_simple_read_write_with_eeprom(MCP4725* interface, enum MCP4725::PowerMode mode, int dac_value);
donalm 0:3e143a2e21c8 16 int test_eeprom_write_status(MCP4725* interface);
donalm 0:3e143a2e21c8 17
donalm 0:3e143a2e21c8 18 int main()
donalm 0:3e143a2e21c8 19 {
donalm 0:3e143a2e21c8 20 pc.printf("Application for testing the MCP4725 interface library\r\n");
donalm 0:3e143a2e21c8 21
donalm 0:3e143a2e21c8 22 test_mcp4725_library(p9, p10, MCP4725::Standard100kHz, 0, "p9, p10, MCP4725::Standard100kHz");
donalm 0:3e143a2e21c8 23 test_mcp4725_library(p9, p10, MCP4725::Fast400kHz, 0, "p9, p10, MCP4725::Fast400kHz");
donalm 0:3e143a2e21c8 24 test_mcp4725_library(p9, p10, MCP4725::HighSpeed3_4Mhz, 0, "p9, p10, MCP4725::HighSpeed3_4Mhz");
donalm 0:3e143a2e21c8 25
donalm 0:3e143a2e21c8 26 while(1) {
donalm 0:3e143a2e21c8 27 myled = 1;
donalm 0:3e143a2e21c8 28 wait(0.5);
donalm 0:3e143a2e21c8 29 myled = 0;
donalm 0:3e143a2e21c8 30 wait(0.5);
donalm 0:3e143a2e21c8 31 }
donalm 0:3e143a2e21c8 32 }
donalm 0:3e143a2e21c8 33
donalm 0:3e143a2e21c8 34
donalm 0:3e143a2e21c8 35
donalm 0:3e143a2e21c8 36 /** Run a set of simple tests on the mcp4725 driver.
donalm 0:3e143a2e21c8 37 *
donalm 0:3e143a2e21c8 38 * @param sda I2C data line pin
donalm 0:3e143a2e21c8 39 * @param scl I2C clock line pin
donalm 0:3e143a2e21c8 40 * @param bus_frequency the frequency at which the I2C bus is running.
donalm 0:3e143a2e21c8 41 * @param device_address_bits The 3bit address bits of the device.
donalm 0:3e143a2e21c8 42 */
donalm 0:3e143a2e21c8 43 void test_mcp4725_library(PinName sda, PinName scl, MCP4725::BusFrequency bus_frequency, int device_address_bits, char* testName)
donalm 0:3e143a2e21c8 44 {
donalm 0:3e143a2e21c8 45 //Create our instance of the interface for test
donalm 0:3e143a2e21c8 46 MCP4725 mcp4725_interface(sda, scl, bus_frequency, device_address_bits);
donalm 0:3e143a2e21c8 47
donalm 0:3e143a2e21c8 48 if(test_init(&mcp4725_interface, testName) == 0)
donalm 0:3e143a2e21c8 49 {
donalm 0:3e143a2e21c8 50 test_simple_read_write_no_eeprom(&mcp4725_interface, MCP4725::Normal, 3095);
donalm 0:3e143a2e21c8 51 test_simple_read_write_no_eeprom(&mcp4725_interface, MCP4725::PowerDown1k, 2094);
donalm 0:3e143a2e21c8 52 test_simple_read_write_no_eeprom(&mcp4725_interface, MCP4725::PowerDown100k, 2093);
donalm 0:3e143a2e21c8 53 test_simple_read_write_no_eeprom(&mcp4725_interface, MCP4725::PowerDown500k, 92);
donalm 0:3e143a2e21c8 54 test_simple_read_write_no_eeprom(&mcp4725_interface, MCP4725::Normal, 4095);
donalm 0:3e143a2e21c8 55
donalm 0:3e143a2e21c8 56 test_simple_read_write_with_eeprom(&mcp4725_interface, MCP4725::Normal, 3095);
donalm 0:3e143a2e21c8 57 test_simple_read_write_with_eeprom(&mcp4725_interface, MCP4725::PowerDown1k, 2094);
donalm 0:3e143a2e21c8 58 test_simple_read_write_with_eeprom(&mcp4725_interface, MCP4725::PowerDown100k, 2093);
donalm 0:3e143a2e21c8 59 test_simple_read_write_with_eeprom(&mcp4725_interface, MCP4725::PowerDown500k, 92);
donalm 0:3e143a2e21c8 60 test_simple_read_write_with_eeprom(&mcp4725_interface, MCP4725::Normal, 4095);
donalm 0:3e143a2e21c8 61
donalm 0:3e143a2e21c8 62 test_eeprom_write_status(&mcp4725_interface);
donalm 0:3e143a2e21c8 63 }
donalm 0:3e143a2e21c8 64
donalm 0:3e143a2e21c8 65
donalm 0:3e143a2e21c8 66 }
donalm 0:3e143a2e21c8 67
donalm 0:3e143a2e21c8 68 /** Initialise the device registers & eeprom. */
donalm 0:3e143a2e21c8 69 int test_init(MCP4725* interface, char* testName)
donalm 0:3e143a2e21c8 70 {
donalm 0:3e143a2e21c8 71 int result;
donalm 0:3e143a2e21c8 72 pc.printf("Initialising test '%s': ", testName);
donalm 0:3e143a2e21c8 73
donalm 0:3e143a2e21c8 74 //Prime the device, including its eeprom.
donalm 0:3e143a2e21c8 75 result = interface->write(MCP4725::Normal, 0, true);
donalm 0:3e143a2e21c8 76 if(result == 0)
donalm 0:3e143a2e21c8 77 {
donalm 0:3e143a2e21c8 78 wait(0.5);
donalm 0:3e143a2e21c8 79 pc.printf("OK\r\n");
donalm 0:3e143a2e21c8 80 }
donalm 0:3e143a2e21c8 81 else
donalm 0:3e143a2e21c8 82 {
donalm 0:3e143a2e21c8 83 pc.printf("FAILED: %d\r\n", result);
donalm 0:3e143a2e21c8 84 }
donalm 0:3e143a2e21c8 85
donalm 0:3e143a2e21c8 86 return result;
donalm 0:3e143a2e21c8 87 }
donalm 0:3e143a2e21c8 88
donalm 0:3e143a2e21c8 89 /* Run a simple read/write test that does not write to eeprom. */
donalm 0:3e143a2e21c8 90 int test_simple_read_write_no_eeprom(MCP4725* interface, enum MCP4725::PowerMode mode, int dac_value)
donalm 0:3e143a2e21c8 91 {
donalm 0:3e143a2e21c8 92 enum MCP4725::PowerMode read_mode;
donalm 0:3e143a2e21c8 93 enum MCP4725::PowerMode read_mode_eeprom;//, write_mode_eeprom;
donalm 0:3e143a2e21c8 94 int read_dac_value;
donalm 0:3e143a2e21c8 95 int read_dac_value_eeprom;//, write_dac_value_eeprom;
donalm 0:3e143a2e21c8 96 bool read_eeprom_write_in_progress;
donalm 0:3e143a2e21c8 97
donalm 0:3e143a2e21c8 98 pc.printf("\tRead/write test without write to eeprom: ");
donalm 0:3e143a2e21c8 99
donalm 0:3e143a2e21c8 100 interface->write(mode, dac_value, false);
donalm 0:3e143a2e21c8 101 interface->read(&read_mode, &read_mode_eeprom, &read_dac_value, &read_dac_value_eeprom, &read_eeprom_write_in_progress);
donalm 0:3e143a2e21c8 102 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 103 {
donalm 0:3e143a2e21c8 104 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 105 return 1;
donalm 0:3e143a2e21c8 106 }
donalm 0:3e143a2e21c8 107 else
donalm 0:3e143a2e21c8 108 {
donalm 0:3e143a2e21c8 109 pc.printf("Passed\r\n");
donalm 0:3e143a2e21c8 110 return 0;
donalm 0:3e143a2e21c8 111 }
donalm 0:3e143a2e21c8 112 }
donalm 0:3e143a2e21c8 113
donalm 0:3e143a2e21c8 114
donalm 0:3e143a2e21c8 115 /* Run a simple read/write test that does write to eeprom. */
donalm 0:3e143a2e21c8 116 int test_simple_read_write_with_eeprom(MCP4725* interface, enum MCP4725::PowerMode mode, int dac_value)
donalm 0:3e143a2e21c8 117 {
donalm 0:3e143a2e21c8 118 enum MCP4725::PowerMode read_mode;
donalm 0:3e143a2e21c8 119 enum MCP4725::PowerMode read_mode_eeprom;//, write_mode_eeprom;
donalm 0:3e143a2e21c8 120 int read_dac_value;
donalm 0:3e143a2e21c8 121 int read_dac_value_eeprom;//, write_dac_value_eeprom;
donalm 0:3e143a2e21c8 122 bool read_eeprom_write_in_progress;
donalm 0:3e143a2e21c8 123
donalm 0:3e143a2e21c8 124 pc.printf("\tRead/write test with write to eeprom: ");
donalm 0:3e143a2e21c8 125
donalm 0:3e143a2e21c8 126 interface->write(mode, dac_value, true);
donalm 0:3e143a2e21c8 127
donalm 0:3e143a2e21c8 128 wait(0.5); //Wait a short period for the eeprom write to complete.
donalm 0:3e143a2e21c8 129 interface->read(&read_mode, &read_mode_eeprom, &read_dac_value, &read_dac_value_eeprom, &read_eeprom_write_in_progress);
donalm 0:3e143a2e21c8 130
donalm 0:3e143a2e21c8 131 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 132 {
donalm 0:3e143a2e21c8 133 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 134 return 1;
donalm 0:3e143a2e21c8 135 }
donalm 0:3e143a2e21c8 136 else
donalm 0:3e143a2e21c8 137 {
donalm 0:3e143a2e21c8 138 pc.printf("Passed\r\n");
donalm 0:3e143a2e21c8 139 return 0;
donalm 0:3e143a2e21c8 140 }
donalm 0:3e143a2e21c8 141 }
donalm 0:3e143a2e21c8 142
donalm 0:3e143a2e21c8 143 /** Test to see if the eeprom write status bit is reported correctly. */
donalm 0:3e143a2e21c8 144 int test_eeprom_write_status(MCP4725* interface)
donalm 0:3e143a2e21c8 145 {
donalm 0:3e143a2e21c8 146 enum MCP4725::PowerMode read_mode;
donalm 0:3e143a2e21c8 147 enum MCP4725::PowerMode read_mode_eeprom;//, write_mode_eeprom;
donalm 0:3e143a2e21c8 148 int read_dac_value;
donalm 0:3e143a2e21c8 149 int read_dac_value_eeprom;//, write_dac_value_eeprom;
donalm 0:3e143a2e21c8 150 bool read_eeprom_write_in_progress;
donalm 0:3e143a2e21c8 151
donalm 0:3e143a2e21c8 152 pc.printf("\tTest eeprom write status: ");
donalm 0:3e143a2e21c8 153
donalm 0:3e143a2e21c8 154 interface->write(MCP4725::Normal, 4095, true);
donalm 0:3e143a2e21c8 155
donalm 0:3e143a2e21c8 156 //Immediately read the device
donalm 0:3e143a2e21c8 157 interface->read(&read_mode, &read_mode_eeprom, &read_dac_value, &read_dac_value_eeprom, &read_eeprom_write_in_progress);
donalm 0:3e143a2e21c8 158
donalm 0:3e143a2e21c8 159 if( read_eeprom_write_in_progress == false )
donalm 0:3e143a2e21c8 160 {
donalm 0:3e143a2e21c8 161 pc.printf("Failed - EEPROM Write not reported as in progress.\r\n");
donalm 0:3e143a2e21c8 162 return 1;
donalm 0:3e143a2e21c8 163 }
donalm 0:3e143a2e21c8 164 else
donalm 0:3e143a2e21c8 165 {
donalm 0:3e143a2e21c8 166 wait(0.5); //Wait a short period for the eeprom write to complete.
donalm 0:3e143a2e21c8 167 interface->read(&read_mode, &read_mode_eeprom, &read_dac_value, &read_dac_value_eeprom, &read_eeprom_write_in_progress);
donalm 0:3e143a2e21c8 168
donalm 0:3e143a2e21c8 169 if( read_eeprom_write_in_progress == false )
donalm 0:3e143a2e21c8 170 {
donalm 0:3e143a2e21c8 171 pc.printf("Passed\r\n");
donalm 0:3e143a2e21c8 172 return 0;
donalm 0:3e143a2e21c8 173 }
donalm 0:3e143a2e21c8 174 else
donalm 0:3e143a2e21c8 175 {
donalm 0:3e143a2e21c8 176 pc.printf("Failed - EEPROM Write reported as still in progress.\r\n");
donalm 0:3e143a2e21c8 177 return 1;
donalm 0:3e143a2e21c8 178 }
donalm 0:3e143a2e21c8 179 }
donalm 0:3e143a2e21c8 180 }