MCP41XXX/42XXX. Single/Dual Digital Potentiometer with SPI™ Interface

Committer:
mcm
Date:
Tue Aug 21 15:44:32 2018 +0000
Revision:
2:81f5716e32f7
Parent:
1:ba1b5b4001f7
cs pin was forgotten, now the chip selects works as expected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 1:ba1b5b4001f7 1 /**
mcm 1:ba1b5b4001f7 2 * @brief MCP41XXX_42XXX.cpp
mcm 1:ba1b5b4001f7 3 * @details Single/Dual Digital Potentiometer with SPI™ Interface.
mcm 1:ba1b5b4001f7 4 * Function file.
mcm 1:ba1b5b4001f7 5 *
mcm 1:ba1b5b4001f7 6 *
mcm 1:ba1b5b4001f7 7 * @return N/A
mcm 1:ba1b5b4001f7 8 *
mcm 1:ba1b5b4001f7 9 * @author Manuel Caballero
mcm 1:ba1b5b4001f7 10 * @date 21/August/2018
mcm 1:ba1b5b4001f7 11 * @version 21/August/2018 The ORIGIN
mcm 1:ba1b5b4001f7 12 * @pre N/A.
mcm 1:ba1b5b4001f7 13 * @warning N/A
mcm 1:ba1b5b4001f7 14 * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
mcm 1:ba1b5b4001f7 15 */
mcm 1:ba1b5b4001f7 16
mcm 1:ba1b5b4001f7 17 #include "MCP41XXX_42XXX.h"
mcm 1:ba1b5b4001f7 18
mcm 1:ba1b5b4001f7 19
mcm 1:ba1b5b4001f7 20 MCP41XXX_42XXX::MCP41XXX_42XXX ( PinName mosi, PinName miso, PinName sclk, PinName cs, uint32_t freq )
mcm 1:ba1b5b4001f7 21 : _spi ( mosi, miso, sclk )
mcm 1:ba1b5b4001f7 22 , _cs ( cs )
mcm 1:ba1b5b4001f7 23 {
mcm 1:ba1b5b4001f7 24 _spi.frequency( freq );
mcm 1:ba1b5b4001f7 25 _spi.format ( 8, 0 ); // 8-bits, mode0: CPOL = 0 | CPHA = 0
mcm 1:ba1b5b4001f7 26 }
mcm 1:ba1b5b4001f7 27
mcm 1:ba1b5b4001f7 28
mcm 1:ba1b5b4001f7 29 MCP41XXX_42XXX::~MCP41XXX_42XXX()
mcm 1:ba1b5b4001f7 30 {
mcm 1:ba1b5b4001f7 31 }
mcm 1:ba1b5b4001f7 32
mcm 1:ba1b5b4001f7 33
mcm 1:ba1b5b4001f7 34
mcm 1:ba1b5b4001f7 35 /**
mcm 1:ba1b5b4001f7 36 * @brief MCP41XXX_42XXX_SetWiper ( MCP41XXX_42XXX_potentiometer_selection_bits_t , MCP41XXX_42XXX_vector_data_t )
mcm 1:ba1b5b4001f7 37 *
mcm 1:ba1b5b4001f7 38 * @details It updates the wiper value on the given channel.
mcm 1:ba1b5b4001f7 39 *
mcm 1:ba1b5b4001f7 40 * @param[in] myChannel: Potentiometer 0/1/both.
mcm 1:ba1b5b4001f7 41 * @param[in] myWiperValue: New wiper value.
mcm 1:ba1b5b4001f7 42 *
mcm 1:ba1b5b4001f7 43 * @param[out] N/A.
mcm 1:ba1b5b4001f7 44 *
mcm 1:ba1b5b4001f7 45 *
mcm 1:ba1b5b4001f7 46 * @return Status of MCP41XXX_42XXX_SetWiper.
mcm 1:ba1b5b4001f7 47 *
mcm 1:ba1b5b4001f7 48 *
mcm 1:ba1b5b4001f7 49 * @author Manuel Caballero
mcm 1:ba1b5b4001f7 50 * @date 21/August/2018
mcm 1:ba1b5b4001f7 51 * @version 21/August/2018 The ORIGIN
mcm 1:ba1b5b4001f7 52 * @pre The MCP42XXX contains two independent channels in a 14-pin PDIP, SOIC or TSSOP package while the MCP41XXX is a single-channel device
mcm 1:ba1b5b4001f7 53 * and is offered in an 8-pin PDIP or SOIC package.
mcm 1:ba1b5b4001f7 54 * @warning N/A.
mcm 1:ba1b5b4001f7 55 */
mcm 1:ba1b5b4001f7 56 MCP41XXX_42XXX::MCP41XXX_42XXX_status_t MCP41XXX_42XXX::MCP41XXX_42XXX_SetWiper ( MCP41XXX_42XXX_potentiometer_selection_bits_t myChannel, MCP41XXX_42XXX_vector_data_t myWiperValue )
mcm 1:ba1b5b4001f7 57 {
mcm 1:ba1b5b4001f7 58 char cmd[] = { 0, 0 };
mcm 1:ba1b5b4001f7 59 int mySPI_status;
mcm 1:ba1b5b4001f7 60
mcm 1:ba1b5b4001f7 61
mcm 1:ba1b5b4001f7 62 /* Make the command byte and the new wiper value, update the register then */
mcm 1:ba1b5b4001f7 63 cmd[0] = (char)( MCP41XXX_42XXX_COMMAND_WRITE_DATA | myChannel );
mcm 1:ba1b5b4001f7 64 cmd[1] = (char)myWiperValue.Dn;
mcm 2:81f5716e32f7 65 _cs = 0;
mcm 1:ba1b5b4001f7 66 mySPI_status = _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
mcm 2:81f5716e32f7 67 _cs = 1;
mcm 1:ba1b5b4001f7 68
mcm 1:ba1b5b4001f7 69
mcm 1:ba1b5b4001f7 70
mcm 1:ba1b5b4001f7 71
mcm 1:ba1b5b4001f7 72 if ( mySPI_status == SPI_SUCCESS )
mcm 1:ba1b5b4001f7 73 {
mcm 1:ba1b5b4001f7 74 return MCP41XXX_42XXX_SUCCESS;
mcm 1:ba1b5b4001f7 75 }
mcm 1:ba1b5b4001f7 76 else
mcm 1:ba1b5b4001f7 77 {
mcm 1:ba1b5b4001f7 78 return MCP41XXX_42XXX_FAILURE;
mcm 1:ba1b5b4001f7 79 }
mcm 1:ba1b5b4001f7 80 }
mcm 1:ba1b5b4001f7 81
mcm 1:ba1b5b4001f7 82
mcm 1:ba1b5b4001f7 83
mcm 1:ba1b5b4001f7 84 /**
mcm 1:ba1b5b4001f7 85 * @brief MCP41XXX_42XXX_SoftwareShutdown ( MCP41XXX_42XXX_potentiometer_selection_bits_t )
mcm 1:ba1b5b4001f7 86 *
mcm 1:ba1b5b4001f7 87 * @details It performs a software shutdown.
mcm 1:ba1b5b4001f7 88 *
mcm 1:ba1b5b4001f7 89 * @param[in] myChannel: Potentiometer 0/1/both.
mcm 1:ba1b5b4001f7 90 *
mcm 1:ba1b5b4001f7 91 * @param[out] N/A.
mcm 1:ba1b5b4001f7 92 *
mcm 1:ba1b5b4001f7 93 *
mcm 1:ba1b5b4001f7 94 * @return Status of MCP41XXX_42XXX_SoftwareShutdown.
mcm 1:ba1b5b4001f7 95 *
mcm 1:ba1b5b4001f7 96 *
mcm 1:ba1b5b4001f7 97 * @author Manuel Caballero
mcm 1:ba1b5b4001f7 98 * @date 21/August/2018
mcm 1:ba1b5b4001f7 99 * @version 21/August/2018 The ORIGIN
mcm 1:ba1b5b4001f7 100 * @pre The MCP42XXX contains two independent channels in a 14-pin PDIP, SOIC or TSSOP package while the MCP41XXX is a single-channel device
mcm 1:ba1b5b4001f7 101 * and is offered in an 8-pin PDIP or SOIC package.
mcm 1:ba1b5b4001f7 102 * @warning N/A.
mcm 1:ba1b5b4001f7 103 */
mcm 1:ba1b5b4001f7 104 MCP41XXX_42XXX::MCP41XXX_42XXX_status_t MCP41XXX_42XXX::MCP41XXX_42XXX_SoftwareShutdown ( MCP41XXX_42XXX_potentiometer_selection_bits_t myChannel )
mcm 1:ba1b5b4001f7 105 {
mcm 1:ba1b5b4001f7 106 char cmd[] = { 0, 0 };
mcm 1:ba1b5b4001f7 107 int mySPI_status;
mcm 1:ba1b5b4001f7 108
mcm 1:ba1b5b4001f7 109
mcm 1:ba1b5b4001f7 110 /* Make the command byte, the new wiper value does not take place, update the register then */
mcm 1:ba1b5b4001f7 111 cmd[0] = (char)( MCP41XXX_42XXX_COMMAND_SHUTDOWN | myChannel );
mcm 1:ba1b5b4001f7 112 cmd[1] = 0;
mcm 2:81f5716e32f7 113 _cs = 0;
mcm 1:ba1b5b4001f7 114 mySPI_status = _spi.write ( &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), &cmd[0], 0 );
mcm 2:81f5716e32f7 115 _cs = 1;
mcm 1:ba1b5b4001f7 116
mcm 1:ba1b5b4001f7 117
mcm 1:ba1b5b4001f7 118
mcm 1:ba1b5b4001f7 119
mcm 1:ba1b5b4001f7 120 if ( mySPI_status == SPI_SUCCESS )
mcm 1:ba1b5b4001f7 121 {
mcm 1:ba1b5b4001f7 122 return MCP41XXX_42XXX_SUCCESS;
mcm 1:ba1b5b4001f7 123 }
mcm 1:ba1b5b4001f7 124 else
mcm 1:ba1b5b4001f7 125 {
mcm 1:ba1b5b4001f7 126 return MCP41XXX_42XXX_FAILURE;
mcm 1:ba1b5b4001f7 127 }
mcm 1:ba1b5b4001f7 128 }