Analog Devices 16 channels, 1MSPS, 12bit ADC with SPI interface

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers AD7490.cpp Source File

AD7490.cpp

00001 //
00002 //  AD7490 ... Analog Devices 16 channels, 1MSPS, 12bit ADC
00003 //
00004 //  2012.08.29 ... Originaly written by Yoji KURODA
00005 //
00006 #include "mbed.h"
00007 #include "AD7490.h"
00008 
00009 AD7490::AD7490(SPI _spi, PinName _cs)
00010 :   spi(_spi),
00011     cs(_cs)
00012 {
00013     unsigned short x = 0;
00014 
00015     for(int i=0; i<3; i++){
00016  
00017         x = 0;    
00018         x |= CREG_WRITE;
00019     //    x |= CREG_SEQ;
00020     //    x |= CREG_SHADOW;
00021         x |= CREG_ADD3;
00022         x |= CREG_ADD2;
00023         x |= CREG_ADD1;
00024         x |= CREG_ADD0;
00025         x |= CREG_PM1;
00026         x |= CREG_PM0;
00027         x |= CREG_RANGE;
00028         x |= CREG_CODING;
00029      
00030         cs = 0;
00031         unsigned short ret = spi.write(x<<4);
00032         cs = 1;
00033     
00034 //        printf("INIT: send = 0x%X, ret = 0x%X\n", x, ret);
00035     }
00036 }
00037 
00038 unsigned short
00039 AD7490::convert(int ch)
00040 {
00041     unsigned short x = 0;
00042 
00043     x |= CREG_WRITE;
00044 //    x |= CREG_SEQ;
00045 //    x |= CREG_SHADOW;
00046 //    x |= CREG_ADD3;
00047 //    x |= CREG_ADD2;
00048 //    x |= CREG_ADD1;
00049     x |= (CREG_ADD0|CREG_ADD1|CREG_ADD2|CREG_ADD3) & (ch<<6);
00050 
00051     x |= CREG_PM1;
00052     x |= CREG_PM0;
00053     x |= CREG_RANGE;
00054     x |= CREG_CODING;
00055 
00056     cs = 0;
00057     unsigned short ret = spi.write(x<<4);
00058     cs = 1;
00059 
00060 //    printf("send = 0x%X, ch = %2d, ret = %d\n", x, (ret>>12)&0xF, ret&0xFFF);
00061 
00062     return ret;
00063 }
00064 
00065 void
00066 AD7490::convert(short data[])
00067 {
00068     for(int ch=0; ch<16; ch++) data[ch]=0;
00069     for(int ch=0; ch<16; ch++){
00070         unsigned short ret = convert(ch);
00071 
00072         data[ ret>>12&0xF ] = ret&0xFFF;
00073     }
00074 }
00075 
00076 
00077 unsigned short
00078 AD7490::sequential(int ch)
00079 {
00080     unsigned short x = 0;
00081 
00082     x |= CREG_WRITE;
00083     x |= CREG_SEQ;
00084     x |= CREG_SHADOW;
00085 //    x |= CREG_ADD3;
00086 //    x |= CREG_ADD2;
00087 //    x |= CREG_ADD1;
00088     x |= (CREG_ADD0|CREG_ADD1|CREG_ADD2|CREG_ADD3) & (ch<<6);
00089 
00090     x |= CREG_PM1;
00091     x |= CREG_PM0;
00092     x |= CREG_RANGE;
00093     x |= CREG_CODING;
00094 
00095     cs = 0;
00096     unsigned short ret = spi.write(x<<4);
00097     cs = 1;
00098 
00099     return ret;
00100 }
00101 
00102 
00103 
00104 unsigned short
00105 AD7490::read(void)
00106 {
00107     unsigned short x = 0;
00108 
00109 //    x |= CREG_WRITE;
00110 //    x |= CREG_SEQ;
00111 //    x |= CREG_SHADOW;
00112 //    x |= CREG_ADD3;
00113 //    x |= CREG_ADD2;
00114 //    x |= CREG_ADD1;
00115 //    x |= (CREG_ADD0|CREG_ADD1|CREG_ADD2|CREG_ADD3) & (ch<<6);
00116 
00117 //    x |= CREG_PM1;
00118 //    x |= CREG_PM0;
00119 //    x |= CREG_RANGE;
00120 //    x |= CREG_CODING;
00121 
00122     cs = 0;
00123     unsigned short ret = spi.write(x<<4);
00124     cs = 1;
00125 
00126 //    printf("send = 0x%X, ch = %2d, ret = %d\n", x, (ret>>12)&0xF, ret&0xFFF);
00127 
00128     return ret;
00129 }
00130 
00131 void
00132 AD7490::read(short data[])
00133 {
00134     for(int ch=0; ch<16; ch++) data[ch]=0;
00135     for(int ch=0; ch<16; ch++){
00136         unsigned short ret = read();
00137 
00138         data[ ret>>12&0xF ] = ret&0xFFF;
00139     }
00140 }