Simple library for SPI DAC MCP4801

Dependents:   DAC_MCP4801_example

Committer:
JohnnyK
Date:
Tue Mar 03 20:08:59 2020 +0000
Revision:
0:886b1ee1370b
First release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JohnnyK 0:886b1ee1370b 1 #include "mbed.h"
JohnnyK 0:886b1ee1370b 2 #include "MCP4801.h"
JohnnyK 0:886b1ee1370b 3
JohnnyK 0:886b1ee1370b 4 MCP4801::MCP4801(SPI &spi, PinName ssel, PinName ldacLowPin,PinName shutdownLowPin): _slaveSelectLow(ssel), _ldacLow(ldacLowPin),_shutdownLow(shutdownLowPin){
JohnnyK 0:886b1ee1370b 5 //initialize pins
JohnnyK 0:886b1ee1370b 6 _slaveSelectLow = 1;
JohnnyK 0:886b1ee1370b 7 _spi = &spi;
JohnnyK 0:886b1ee1370b 8 _spi->format(8,0);
JohnnyK 0:886b1ee1370b 9 _spi->frequency(1000000);
JohnnyK 0:886b1ee1370b 10 if(_ldacLow.is_connected()) _ldacLow = 0;
JohnnyK 0:886b1ee1370b 11 if(_shutdownLow.is_connected()) _shutdownLow = 0;
JohnnyK 0:886b1ee1370b 12 }
JohnnyK 0:886b1ee1370b 13
JohnnyK 0:886b1ee1370b 14 void MCP4801::setOutput_state(uint8_t state, bool soft){
JohnnyK 0:886b1ee1370b 15 if(soft){
JohnnyK 0:886b1ee1370b 16 shutdown = state;
JohnnyK 0:886b1ee1370b 17 }else{
JohnnyK 0:886b1ee1370b 18 if(_shutdownLow.is_connected()) _shutdownLow = state;
JohnnyK 0:886b1ee1370b 19 }
JohnnyK 0:886b1ee1370b 20
JohnnyK 0:886b1ee1370b 21 }
JohnnyK 0:886b1ee1370b 22
JohnnyK 0:886b1ee1370b 23 void MCP4801::updateOutput(){
JohnnyK 0:886b1ee1370b 24 if(_ldacLow.is_connected()){
JohnnyK 0:886b1ee1370b 25 _ldacLow = 1;
JohnnyK 0:886b1ee1370b 26 wait_us(5000);
JohnnyK 0:886b1ee1370b 27 _ldacLow = 0;
JohnnyK 0:886b1ee1370b 28 }
JohnnyK 0:886b1ee1370b 29 }
JohnnyK 0:886b1ee1370b 30
JohnnyK 0:886b1ee1370b 31
JohnnyK 0:886b1ee1370b 32 int MCP4801::setVOutput(float voltage){
JohnnyK 0:886b1ee1370b 33 uint8_t gain_bit = 0;
JohnnyK 0:886b1ee1370b 34 unsigned short int value = 0;
JohnnyK 0:886b1ee1370b 35 int error;
JohnnyK 0:886b1ee1370b 36
JohnnyK 0:886b1ee1370b 37 //auto choose range
JohnnyK 0:886b1ee1370b 38 if(voltage < VREF){
JohnnyK 0:886b1ee1370b 39 gain_bit = 1; //gain 1
JohnnyK 0:886b1ee1370b 40 value = voltage/VREF*RES8BIT;
JohnnyK 0:886b1ee1370b 41 }else{
JohnnyK 0:886b1ee1370b 42 gain_bit = 0; //gain 2
JohnnyK 0:886b1ee1370b 43 value = 0.5*voltage/VREF*RES8BIT;
JohnnyK 0:886b1ee1370b 44 }
JohnnyK 0:886b1ee1370b 45 char packet[]= {0x00,0x00};
JohnnyK 0:886b1ee1370b 46 packet[0] = value >> 4;
JohnnyK 0:886b1ee1370b 47 packet[1] = value << 4;
JohnnyK 0:886b1ee1370b 48 packet[0] |= shutdown << 4; //shutdown - output state
JohnnyK 0:886b1ee1370b 49 packet[0] |= gain_bit << 5; //gain
JohnnyK 0:886b1ee1370b 50
JohnnyK 0:886b1ee1370b 51 _slaveSelectLow = 0; //set chip as listener
JohnnyK 0:886b1ee1370b 52 error = _spi->write(packet, sizeof(packet), NULL, 0); //send packet (const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length)
JohnnyK 0:886b1ee1370b 53 _slaveSelectLow = 1; //release chip select
JohnnyK 0:886b1ee1370b 54 if(_ldacLow.is_connected()) _ldacLow = 0; //pull latch down
JohnnyK 0:886b1ee1370b 55 wait_us(1);
JohnnyK 0:886b1ee1370b 56 if(_ldacLow.is_connected()) _ldacLow = 1; //pull latch up
JohnnyK 0:886b1ee1370b 57
JohnnyK 0:886b1ee1370b 58 return error;
JohnnyK 0:886b1ee1370b 59 }