CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug Reports on this forum. Send them to support@ccsinfo.com

MAX521 Driver

 
Post new topic   Reply to topic    CCS Forum Index -> Code Library
View previous topic :: View next topic  
Author Message
StuartH



Joined: 19 Aug 2005
Posts: 14
Location: W. Midlands, UK

View user's profile Send private message

MAX521 Driver
PostPosted: Tue Jul 11, 2006 4:22 pm     Reply with quote

This is a simple driver for the Maxim MAX521 8 channel digital to analogue converter (DAC). It assumes that I2C has been set up elsewhere in your program.


Code:

///////////////////////////////////////////////////////////////////////////////
///
/// MAX521.C
///
/// CCS C Driver for the Maxim MAX521 Octal DAC with 2-wire serial interface
/// (I2C compatible).
///
/// Stuart Hunter  28/04/2006
///
/// Comments:
///
/// Functions:
///
/// max521_init()
/// Call this function before using the device, and whenever you need to reset
/// the chip AND driver.
///
/// max521_reset()
/// Call this function to reset the DAC chip only.
///
/// max521_power_mode( int1 mode )
/// Call this to set normal or low power/standby operation. In standby mode, all
/// DAC outputs are floating and current consumption is reduced to around 4uA.
/// mode == MAX521_NORMAL or MAX521_STANDBY
/// Note: this setting will persist until the function is called again (or the
/// driver is reset with a max521_init() call ). The device and driver initialises
/// in the MAX521_NORMAL state.
///
/// max521_write_single_dac( int8 dac, int8 value )
/// Call this to immediately update a single specified DAC (0-7) with the supplied
/// value.
/// dac == DAC number, 0 to 7
/// value == DAC output value, 0 to 255
///
/// max521_load_dac( int8 dac, int8 value )
/// Call this to preload a specified DAC with the supplied value. This function
/// stores the value locally in the driver and does not pass it to the DAC
/// immediately. This is useful if you want all DAC outputs to change
/// simultaneously.
///
/// max521_write_dac()
/// Writes preloaded data to all DACs in the device. Only individual DACs which have
/// been preloaded since the last call to this function are updated. All affected
/// DAC outputs change simultaneously.
///
/// None of these functions returns anyhing; they are all of type void.
///

/******************************************************************************
****** T O D O : Set MAX521_DEVICE_ADDRESS to the actual address of the   *****
******          MAX521 in your system. It is an 8 bit number in the      *****
******           format 01010xx0, where xx refers to the setting of the   *****
******           AD1 and AD0 pins on the device.                          *****
******                                                     *****
******         I have not implemented any support for multiple MAX521   *****
******           devices (you can have up to four). It shouldn't be too   *****
******           difficult to modify this driver though, if you need      *****
******           that functionality.                                      *****
******************************************************************************/
#define MAX521_DEVICE_ADDRESS      0x50   //AD0 and AD1 both pulled LOW
/*****************************************************************************/

#define MAX521_NORMAL            0
#define MAX521_STANDBY            1

int8 max521_command;
int8 max521_dac[8];
int8 max521_bitfield;


///////////////////////////////////////////////////////////////////////////////
// Send a single command to the DAC. Internal use only.
///////////////////////////////////////////////////////////////////////////////
void max521_send_command( void )
{
   i2c_start();
   i2c_write( MAX521_DEVICE_ADDRESS );
   i2c_write( max521_command );
   i2c_stop();
}

///////////////////////////////////////////////////////////////////////////////
// Send a string of commands and data. Internal use only.
///////////////////////////////////////////////////////////////////////////////
void max521_send_data( int8 dac_bitfield )
{
   int8 n;
   i2c_start();
   i2c_write( MAX521_DEVICE_ADDRESS );
   for( n=0; n<8; n++ )
   {
      if( dac_bitfield & (1<<n) )
      {
         max521_command |= n;
         i2c_write( max521_command );
         i2c_write( max521_dac[n] );
         max521_command &= 0x18;      //reset 3 LSBs
      }
   }
   i2c_stop();

}

///////////////////////////////////////////////////////////////////////////////
// Set the power mode.
// Mode == MAX521_NORMAL or STANDBY
// Device supply current is reduced to 4uA in standby, but the outputs are
// nonfunctional (floating).
///////////////////////////////////////////////////////////////////////////////
void max521_power_mode( int1 mode )
{
   if( mode )
      max521_command |= 8;
   else
      max521_command &= 0xF7;
   max521_send_command();
}

///////////////////////////////////////////////////////////////////////////////
// Reset the DAC
///////////////////////////////////////////////////////////////////////////////
void max521_reset( void )
{
   int8 tmp;
   tmp = max521_command;
   max521_command = 0x10;
   max521_send_command();
   max521_command = tmp;
}

///////////////////////////////////////////////////////////////////////////////
// Call this routine to initialise the driver.
///////////////////////////////////////////////////////////////////////////////
void max521_init( void )
{
   int8 n;
   max521_command = 0;
   max521_bitfield = 0;
   for( n=0;n<8;n++ )
      max521_dac[n] = 0;
   max521_reset();
}

///////////////////////////////////////////////////////////////////////////////
// Call this function to update an individual DAC with the value supplied.
// dac == 0-7
// value == 0-255
///////////////////////////////////////////////////////////////////////////////
void max521_write_single_dac( int8 dac, int8 value )
{
   int8 bf;
   max521_dac[dac] = value;
   bf = 1<<dac;
   max521_send_data( bf );
}

///////////////////////////////////////////////////////////////////////////////
// Call this function to preload the DAC with data. Same arguments as
// max521_write_single_dac()
///////////////////////////////////////////////////////////////////////////////
void max521_load_dac( int8 dac, int8 value )
{
   int8 bf;
   max521_dac[dac] = value;
   bf = 1<<dac;
   max521_bitfield |= bf;
   //Note: this function does NOT
   //write anything to the DACs!!!
}

///////////////////////////////////////////////////////////////////////////////
// Call this function to write the preloaded data to the DACs. All outputs will
// change simultaneously.
///////////////////////////////////////////////////////////////////////////////
void max521_write_dac( void )
{
   max521_send_data( max521_bitfield );
   max521_bitfield = 0;
}

      


That's it.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> Code Library All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group