Diff: MCP4725.cpp
- Revision:
- 2:e09b7dd7c1dd
- Parent:
- 0:b03a293ceb8d
- Child:
- 3:2d28c56053cd
--- a/MCP4725.cpp Thu Sep 07 19:55:40 2017 +0000
+++ b/MCP4725.cpp Thu Sep 07 20:12:56 2017 +0000
@@ -0,0 +1,302 @@
+/**
+ * @brief MCP4725.c
+ * @details 12-Bit Digital-to-Analog Converter with EEPROM Memory.
+ * Functions file.
+ *
+ *
+ * @return NA
+ *
+ * @author Manuel Caballero
+ * @date 7/September/2017
+ * @version 7/September/2017 The ORIGIN
+ * @pre NaN.
+ * @warning NaN
+ * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
+ */
+
+#include "MCP4725.h"
+
+
+MCP4725::MCP4725 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
+ : i2c ( sda, scl )
+ , MCP4725_Addr ( addr )
+{
+ i2c.frequency( freq );
+}
+
+
+MCP4725::~MCP4725()
+{
+}
+
+
+
+/**
+ * @brief MCP4725_Reset ( void )
+ *
+ * @details It performs an internal reset similar to a power-on-reset ( POR ).
+ *
+ * @param[in] NaN.
+ *
+ * @param[out] NaN.
+ *
+ *
+ * @return Status of MCP4725_Reset.
+ *
+ *
+ * @author Manuel Caballero
+ * @date 7/September/2017
+ * @version 7/September/2017 The ORIGIN
+ * @pre NaN
+ * @warning The user MUST respect the time it takes this instruction to be
+ * performed ( max. 50ms ).
+ */
+MCP4725::MCP4725_status_t MCP4725::MCP4725_Reset ( void )
+{
+ char cmd = MCP4725_GENERAL_CALL_RESET;
+ uint32_t aux = 0;
+
+
+ aux = i2c.write ( MCP4725_GENERAL_CALL, &cmd, 1 );
+
+
+
+ if ( aux == I2C_SUCCESS )
+ return MCP4725_SUCCESS;
+ else
+ return MCP4725_FAILURE;
+}
+
+
+
+/**
+ * @brief MCP4725_WakeUp ( void )
+ *
+ * @details The power-down bits of the DAC register are set to a normal operation.
+ *
+ * @param[in] NaN.
+ *
+ * @param[out] NaN.
+ *
+ *
+ * @return Status of MCP4725_WakeUp.
+ *
+ *
+ * @author Manuel Caballero
+ * @date 7/September/2017
+ * @version 7/September/2017 The ORIGIN
+ * @pre NaN
+ * @warning NaN.
+ */
+MCP4725::MCP4725_status_t MCP4725::MCP4725_WakeUp ( void )
+{
+ char cmd = MCP4725_GENERAL_CALL_WAKE_UP;
+ uint32_t aux = 0;
+
+
+ aux = i2c.write ( MCP4725_GENERAL_CALL, &cmd, 1 );
+
+
+
+ if ( aux == I2C_SUCCESS )
+ return MCP4725_SUCCESS;
+ else
+ return MCP4725_FAILURE;
+}
+
+
+/**
+ * @brief MCP4725_PowerMode ( MCP4725_write_command_type_t , MCP4725_operation_mode_t )
+ *
+ * @details It configures the power mode of the device.
+ *
+ * @param[in] myWriteCMD: It writes the command into the DAC or EEPROM/DAC.
+ * @param[in] myPowerMode: Normal Mode or one of the Power-Down available modes.
+ *
+ * @param[out] NaN.
+ *
+ *
+ * @return Status of MCP4725_PowerMode.
+ *
+ *
+ * @author Manuel Caballero
+ * @date 7/September/2017
+ * @version 7/September/2017 The ORIGIN
+ * @pre NaN
+ * @warning NaN.
+ */
+MCP4725::MCP4725_status_t MCP4725::MCP4725_PowerMode ( MCP4725_write_command_type_t myWriteCMD, MCP4725_operation_mode_t myPowerMode )
+{
+ char cmd[] = { 0, 0, 0, 0, 0, 0 };
+ uint32_t aux = 0;
+ uint32_t dataTX = 3;
+
+
+ // Read the device to mask the default value
+ aux = i2c.read ( MCP4725_Addr, &cmd[0], 5 );
+
+
+
+ // Choose the power mode
+ switch ( myPowerMode ){
+ default:
+ case NORMAL_MODE:
+ cmd[0] = 0;
+ break;
+
+ case POWER_DOWN_1KOHM_RESISTIVE_LOAD_MODE:
+ cmd[0] = 0x01;
+ break;
+
+ case POWER_DOWN_100KOHM_RESISTIVE_LOAD_MODE:
+ cmd[0] = 0x02;
+ break;
+
+ case POWER_DOWN_500KOHM_RESISTIVE_LOAD_MODE:
+ cmd[0] = 0x03;
+ break;
+ }
+
+
+ // Prepare the data according to the write mode
+ switch ( myWriteCMD ){
+ default:
+ case FAST_MODE:
+ cmd[0] <<= 4;
+ cmd[0] |= ( ( cmd[1] & 0xF0 ) >> 4 );
+ cmd[1] = ( ( cmd[1] & 0x0F ) << 4 );
+ cmd[1] |= ( ( cmd[2] & 0xF0 ) >> 4 );
+
+ dataTX = 2;
+ break;
+
+ case WRITE_DAC_REGISTER_MODE:
+ cmd[0] <<= 1;
+ cmd[0] |= 0x40;
+ break;
+
+ case WRITE_DAC_AND_EEPROM_REGISTER_MODE:
+ cmd[0] <<= 1;
+ cmd[0] |= 0x60;
+ break;
+ }
+
+
+
+ aux = i2c.write ( MCP4725_Addr, &cmd[0], dataTX );
+
+
+
+ if ( aux == I2C_SUCCESS )
+ return MCP4725_SUCCESS;
+ else
+ return MCP4725_FAILURE;
+}
+
+
+
+/**
+ * @brief MCP4725_SetNewValue ( MCP4725_write_command_type_t , uint32_t )
+ *
+ * @details It sends a new output value.
+ *
+ * @param[in] myWriteCMD: It writes the command into the DAC or EEPROM/DAC.
+ * @param[in] myDACNewValue: New output value.
+ *
+ * @param[out] NaN.
+ *
+ *
+ * @return Status of MCP4725_SetNewValue.
+ *
+ *
+ * @author Manuel Caballero
+ * @date 7/September/2017
+ * @version 7/September/2017 The ORIGIN
+ * @pre NaN
+ * @warning NaN.
+ */
+MCP4725::MCP4725_status_t MCP4725::MCP4725_SetNewValue ( MCP4725_write_command_type_t myWriteCMD, uint32_t myDACNewValue )
+{
+ char cmd[] = { 0, 0, 0 };
+ uint32_t aux = 0;
+ uint32_t dataTX = 3;
+
+
+ // 12-Bit of resolution ONLY!
+ if ( myDACNewValue > 4095 )
+ return MCP4725_FAILURE;
+
+
+ // Prepare the data according to the write mode
+ cmd[1] |= ( ( myDACNewValue & 0xFF0 ) >> 4 );
+ cmd[2] |= ( ( myDACNewValue & 0x00F ) << 4 );
+
+ switch ( myWriteCMD ){
+ default:
+ case FAST_MODE:
+ cmd[0] |= ( ( myDACNewValue & 0xF00 ) >> 8 );
+ cmd[1] = ( myDACNewValue & 0x0FF );
+
+ dataTX = 2;
+ break;
+
+ case WRITE_DAC_REGISTER_MODE:
+ cmd[0] |= 0x40;
+ break;
+
+ case WRITE_DAC_AND_EEPROM_REGISTER_MODE:
+ cmd[0] |= 0x60;
+ break;
+ }
+
+
+
+ aux = i2c.write ( MCP4725_Addr, &cmd[0], dataTX );
+
+
+
+ if ( aux == I2C_SUCCESS )
+ return MCP4725_SUCCESS;
+ else
+ return MCP4725_FAILURE;
+}
+
+
+
+/**
+ * @brief MCP4725_EEPROM_Status ( MCP4725_eeprom_status_t )
+ *
+ * @details It gets the eeprom status.
+ *
+ * @param[in] myEEPROM_Status: EEPROM status.
+ *
+ * @param[out] NaN.
+ *
+ *
+ * @return Status of MCP4725_EEPROM_Status.
+ *
+ *
+ * @author Manuel Caballero
+ * @date 7/September/2017
+ * @version 7/September/2017 The ORIGIN
+ * @pre NaN
+ * @warning NaN.
+ */
+MCP4725::MCP4725_status_t MCP4725::MCP4725_EEPROM_Status ( MCP4725_eeprom_status_t* myEEPROM_Status )
+{
+ char cmd[] = { 0, 0, 0, 0, 0 };
+ uint32_t aux = 0;
+
+ // Read command
+ aux = i2c.read ( MCP4725_Addr, &cmd[0], 5 );
+
+ // Update EEPROM status
+ *myEEPROM_Status = ( MCP4725_eeprom_status_t )( ( cmd[0] & 0x80 ) >> 7 );
+
+
+
+ if ( aux == I2C_SUCCESS )
+ return MCP4725_SUCCESS;
+ else
+ return MCP4725_FAILURE;
+}