From f94c9f659be11340b80476cec8c0f713e4bba02c Mon Sep 17 00:00:00 2001 From: Marti Bolivar Date: Fri, 22 Jun 2012 13:58:25 -0400 Subject: Add I2C example for MCP4725 DAC. Signed-off-by: Marti Bolivar --- examples/i2c-mcp4725-dac.cpp | 145 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 examples/i2c-mcp4725-dac.cpp (limited to 'examples/i2c-mcp4725-dac.cpp') diff --git a/examples/i2c-mcp4725-dac.cpp b/examples/i2c-mcp4725-dac.cpp new file mode 100644 index 0000000..e757bd1 --- /dev/null +++ b/examples/i2c-mcp4725-dac.cpp @@ -0,0 +1,145 @@ +// i2c-mcp4725-dac.cpp +// +// Written by Andrew Meyer +// Modified by Marti Bolivar +// +// Simple program showing how to control an MCP4725 DAC using the +// libmaple I2C interface. There's an MCP4725 breakout board available +// on SparkFun: +// +// http://www.sparkfun.com/products/8736 +// +// How to use: +// +// 1. Connect the DAC SDA and SCL pins to I2C2, with a pullup +// resistor (1 KOhm should work) to VCC. +// 2. Load the sketch and connect to SerialUSB. +// 3. Press the button. +// +// The program then makes sure the DAC is connected properly (during +// setup()), then has the DAC output a sawtooth wave (with loop()). + +#include +#include + +#define MCP_ADDR 0x60 +#define MCP_WRITE_DAC 0b01000000 +#define MCP_WRITE_EEPROM 0b01100000 +#define MCP_PD_NORMAL 0b00000000 +#define MCP_PD_1K 0b00000010 +#define MCP_PD_100K 0b00000100 +#define MCP_PD_500K 0b00000110 + +static uint8 write_msg_data[3]; +static i2c_msg write_msg; + +static uint8 read_msg_data[5]; +static i2c_msg read_msg; + +/* + * DAC control routines + */ + +void mcp_i2c_setup(void) { + write_msg.addr = MCP_ADDR; + write_msg.flags = 0; // write, 7 bit address + write_msg.length = sizeof(write_msg_data); + write_msg.xferred = 0; + write_msg.data = write_msg_data; + + read_msg.addr = MCP_ADDR; + read_msg.flags = I2C_MSG_READ; + read_msg.length = sizeof(read_msg_data); + read_msg.xferred = 0; + read_msg.data = read_msg_data; +} + +void mcp_write_val(uint16 val) { + write_msg_data[0] = MCP_WRITE_DAC | MCP_PD_NORMAL; + uint16 tmp = val >> 4; + write_msg_data[1] = tmp; + tmp = (val << 4) & 0x00FF; + write_msg_data[2] = tmp; + + i2c_master_xfer(I2C2, &write_msg, 1, 0); +} + +uint16 mcp_read_val() { + uint16 tmp = 0; + + i2c_master_xfer(I2C2, &read_msg, 1, 2); + + /* We don't care about the status and EEPROM bytes (0, 3, and 4). */ + tmp = (read_msg_data[1] << 4); + tmp += (read_msg_data[2] >> 4); + return tmp; +} + +int mcp_test() { + uint16 val; + uint16 test_val = 0x0101; + + SerialUSB.println("Testing the MCP4725..."); + /* Read the value of the register (should be 0x0800 if factory fresh) */ + val = mcp_read_val(); + SerialUSB.print("DAC Register = 0x"); + SerialUSB.println(val, HEX); + + mcp_write_val(test_val); + SerialUSB.print("Wrote 0x"); + SerialUSB.print(test_val, HEX); + SerialUSB.println(" to the DAC"); + + val = mcp_read_val(); + SerialUSB.print("DAC Register = 0x"); + SerialUSB.println(val, HEX); + + if (val != test_val) { + SerialUSB.println("ERROR: MCP4725 not responding correctly"); + return 0; + } + + SerialUSB.println("MCP4725 seems to be working"); + return 1; +} + +/* + * setup() and loop() + */ + +void setup() { + pinMode(BOARD_BUTTON_PIN, INPUT); + i2c_master_enable(I2C2, 0); + mcp_i2c_setup(); + + waitForButtonPress(); + ASSERT(mcp_test()); + + SerialUSB.println("Starting sawtooth wave"); +} + +void loop() { + static uint16 dout = 0; + + mcp_write_val(dout); + + dout += 50; + if (dout >= 32768) { + dout = 0; + } +} + +// -- init() and main() ------------------------------------------------------- + +__attribute__((constructor)) void premain() { + init(); +} + +int main(void) { + setup(); + + while (true) { + loop(); + } + return 0; +} -- cgit v1.2.3 From e397f7c18b775aacf40223a7cc91cba547e819e7 Mon Sep 17 00:00:00 2001 From: Marti Bolivar Date: Fri, 22 Jun 2012 14:47:45 -0400 Subject: i2c-mcp4725-dac.cpp: Fix whitespace. Signed-off-by: Marti Bolivar --- examples/i2c-mcp4725-dac.cpp | 118 +++++++++++++++++++++---------------------- 1 file changed, 59 insertions(+), 59 deletions(-) (limited to 'examples/i2c-mcp4725-dac.cpp') diff --git a/examples/i2c-mcp4725-dac.cpp b/examples/i2c-mcp4725-dac.cpp index e757bd1..da9a34e 100644 --- a/examples/i2c-mcp4725-dac.cpp +++ b/examples/i2c-mcp4725-dac.cpp @@ -41,66 +41,66 @@ static i2c_msg read_msg; */ void mcp_i2c_setup(void) { - write_msg.addr = MCP_ADDR; - write_msg.flags = 0; // write, 7 bit address - write_msg.length = sizeof(write_msg_data); - write_msg.xferred = 0; - write_msg.data = write_msg_data; - - read_msg.addr = MCP_ADDR; - read_msg.flags = I2C_MSG_READ; - read_msg.length = sizeof(read_msg_data); - read_msg.xferred = 0; - read_msg.data = read_msg_data; + write_msg.addr = MCP_ADDR; + write_msg.flags = 0; // write, 7 bit address + write_msg.length = sizeof(write_msg_data); + write_msg.xferred = 0; + write_msg.data = write_msg_data; + + read_msg.addr = MCP_ADDR; + read_msg.flags = I2C_MSG_READ; + read_msg.length = sizeof(read_msg_data); + read_msg.xferred = 0; + read_msg.data = read_msg_data; } void mcp_write_val(uint16 val) { - write_msg_data[0] = MCP_WRITE_DAC | MCP_PD_NORMAL; - uint16 tmp = val >> 4; - write_msg_data[1] = tmp; - tmp = (val << 4) & 0x00FF; - write_msg_data[2] = tmp; + write_msg_data[0] = MCP_WRITE_DAC | MCP_PD_NORMAL; + uint16 tmp = val >> 4; + write_msg_data[1] = tmp; + tmp = (val << 4) & 0x00FF; + write_msg_data[2] = tmp; - i2c_master_xfer(I2C2, &write_msg, 1, 0); + i2c_master_xfer(I2C2, &write_msg, 1, 0); } uint16 mcp_read_val() { - uint16 tmp = 0; + uint16 tmp = 0; - i2c_master_xfer(I2C2, &read_msg, 1, 2); + i2c_master_xfer(I2C2, &read_msg, 1, 2); - /* We don't care about the status and EEPROM bytes (0, 3, and 4). */ - tmp = (read_msg_data[1] << 4); - tmp += (read_msg_data[2] >> 4); - return tmp; + /* We don't care about the status and EEPROM bytes (0, 3, and 4). */ + tmp = (read_msg_data[1] << 4); + tmp += (read_msg_data[2] >> 4); + return tmp; } int mcp_test() { - uint16 val; - uint16 test_val = 0x0101; - - SerialUSB.println("Testing the MCP4725..."); - /* Read the value of the register (should be 0x0800 if factory fresh) */ - val = mcp_read_val(); - SerialUSB.print("DAC Register = 0x"); - SerialUSB.println(val, HEX); - - mcp_write_val(test_val); - SerialUSB.print("Wrote 0x"); - SerialUSB.print(test_val, HEX); - SerialUSB.println(" to the DAC"); - - val = mcp_read_val(); - SerialUSB.print("DAC Register = 0x"); - SerialUSB.println(val, HEX); - - if (val != test_val) { - SerialUSB.println("ERROR: MCP4725 not responding correctly"); - return 0; - } + uint16 val; + uint16 test_val = 0x0101; + + SerialUSB.println("Testing the MCP4725..."); + /* Read the value of the register (should be 0x0800 if factory fresh) */ + val = mcp_read_val(); + SerialUSB.print("DAC Register = 0x"); + SerialUSB.println(val, HEX); + + mcp_write_val(test_val); + SerialUSB.print("Wrote 0x"); + SerialUSB.print(test_val, HEX); + SerialUSB.println(" to the DAC"); + + val = mcp_read_val(); + SerialUSB.print("DAC Register = 0x"); + SerialUSB.println(val, HEX); + + if (val != test_val) { + SerialUSB.println("ERROR: MCP4725 not responding correctly"); + return 0; + } - SerialUSB.println("MCP4725 seems to be working"); - return 1; + SerialUSB.println("MCP4725 seems to be working"); + return 1; } /* @@ -108,25 +108,25 @@ int mcp_test() { */ void setup() { - pinMode(BOARD_BUTTON_PIN, INPUT); - i2c_master_enable(I2C2, 0); - mcp_i2c_setup(); + pinMode(BOARD_BUTTON_PIN, INPUT); + i2c_master_enable(I2C2, 0); + mcp_i2c_setup(); - waitForButtonPress(); - ASSERT(mcp_test()); + waitForButtonPress(); + ASSERT(mcp_test()); - SerialUSB.println("Starting sawtooth wave"); + SerialUSB.println("Starting sawtooth wave"); } void loop() { - static uint16 dout = 0; + static uint16 dout = 0; - mcp_write_val(dout); + mcp_write_val(dout); - dout += 50; - if (dout >= 32768) { - dout = 0; - } + dout += 50; + if (dout >= 32768) { + dout = 0; + } } // -- init() and main() ------------------------------------------------------- -- cgit v1.2.3