GROZEA ION / AD5235
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers AD5235.cpp Source File

AD5235.cpp

00001 #include <mbed.h>
00002 #include "AD5235.h"
00003  
00004 AD5235::AD5235(SPI& _spi, PinName _cs) : spi(_spi), cs(_cs)
00005 {
00006     spi.format(8,0);
00007     spi.frequency(1000000);
00008 }
00009  
00010 
00011 //1 - Restore EEMEM (A0) contents to RDAC (A0) register. See Table 16.
00012 void AD5235::storeEEMEM2RDAC(uint8_t w)
00013 {
00014     transferData(0x10 + w,  CMD_NOP);
00015 } 
00016 //2 - Store wiper setting. Store RDAC (A0) setting to EEMEM (A0). See Table 15. - Use a delay of 50ms!!!
00017 void AD5235::storeRDAC2EEMEM(uint8_t w)
00018 {
00019     transferData(0x20 + w,  CMD_NOP);
00020 }
00021 //3 - Store contents of Serial Register Data Byte 0 and Serial Register Data Bytes 1 (total 16 bits) to EEMEM (ADDR). See Table 18.
00022 //Use a delay of 50ms!!!/RDAC1 is 0, RDAC2 is 1, User1 is 2....User13 is 14 
00023 void AD5235::setEEMEM(uint8_t w, uint16_t v)
00024 {
00025     transferData(0x30 + w, v);
00026 } 
00027 //4 - Decrement by 6 dB. Right-shift contents of RDAC (A0) register, stop at all 0s.
00028 void AD5235::stepDown6Db(uint8_t w)
00029 {
00030     transferData(0x40 + w,  CMD_NOP);
00031 } 
00032 //5 - Decrement all by 6 dB. Right-shift contents of all RDAC registers, stop at all 0s.
00033 void AD5235::stepDownAll6Db(void)
00034 {
00035     transferData(0x50 , CMD_NOP);
00036 } 
00037 //6 - Decrement contents of RDAC (A0) by 1, stop at all 0s.
00038 void AD5235::stepDown1(uint8_t w)
00039 {
00040     transferData(0x60 + w, CMD_NOP);
00041 } 
00042 //7 - Decrement contents of all RDAC registers by 1, stop at all 0s.
00043 void AD5235::stepDown1All(void)
00044 {
00045     transferData(0x70, CMD_NOP);
00046 }
00047 //8 - Reset. Refresh all RDACs with their corresponding EEMEM previously stored values. - Use a delay of 30us!!!
00048 void AD5235::refreshAllRDAC(void)
00049 {
00050     transferData(0x80, CMD_NOP);
00051 }
00052 //9 - Read contents of EEMEM (ADDR) from SDO output in the next frame. See Table 19. - Use a delay of 30us!!!
00053 uint16_t AD5235::getEEMEM(uint8_t w)
00054 {
00055     transferData(0x90 + w, CMD_NOP);
00056     wait_us(30);
00057     return transferData(CMD_NOP, CMD_NOP);
00058 }
00059 //10 - Read RDAC wiper setting from SDO output in the next frame. See Table 20. - Use a delay of 30us!!!
00060 uint16_t AD5235::getWiper(uint8_t w)
00061 {
00062     transferData(0xA0 + w, CMD_NOP);
00063     wait_us(30);
00064     return transferData(CMD_NOP, CMD_NOP);
00065 } 
00066 //11 - Write contents of Serial Register Data Byte 0 and Serial Register Data Byte 1 (total 10 bits) to RDAC (A0). See Table 14.
00067 void AD5235::setWiper(uint8_t w, uint16_t v)
00068 {
00069     transferData(0xB0 + w, v);
00070 } 
00071 //12 - Increment by 6 dB: Left-shift contents of RDAC (A0),stop at all 1s. See Table 17.
00072 void stepUp6Db(uint8_t w)
00073 {
00074     //transferData(0xC0, CMD_NOP);
00075 } 
00076 //13 - Increment all by 6 dB. Left-shift contents of all RDAC registers, stop at all 1s.
00077 void AD5235::stepUpAll6Db(void)
00078 {
00079     transferData(0xD0, CMD_NOP);
00080 } 
00081 //14 - Increment contents of RDAC (A0) by 1, stop at all 1s. See Table 15.
00082 void AD5235::stepUp1(uint8_t w)
00083 {
00084     transferData(0xE0 + w, CMD_NOP);
00085 }
00086 //15 - Increment contents of all RDAC registers by 1, stop at all 1s.
00087  void AD5235::stepUp1All(void)
00088  {
00089     transferData(0xF0, CMD_NOP);
00090 }
00091 //16 - See page 21 in manual Another subtle feature of the AD5235 is that a subsequent CS strobe, without clock and data, repeats a previous command
00092 void AD5235::repeatCMD(void)
00093 {
00094     cs = 0;
00095     cs = 1;
00096 }
00097 
00098 float AD5235::getTolerance()
00099 {
00100     float tol = getEEMEM(15);
00101     int8_t b_1 = ((uint16_t)tol >> 8);
00102     int8_t b_0 = ((uint16_t)tol & 0xFF);
00103     if(b_1 > 127) //check if first bit in b_1 is 1
00104         b_1 -= 128;
00105     else
00106         b_1 = -b_1;
00107     for(uint8_t p = 0; p < 8; p++)
00108     {
00109         if((b_0 >> p) & 1)//check if but in position p is 1
00110         {
00111             tol =(float)b_1 + (float)b_0/ (float)(2 << p);//add the decimal part of the tolerance
00112             break;
00113         }
00114     }
00115     return tol;
00116 }
00117 
00118 uint16_t AD5235::transferData(uint8_t cmd, uint16_t val)
00119 {
00120     uint8_t bytes[1];
00121     cs = 0;
00122     bytes[0] = spi.write(cmd);
00123     bytes[0] = spi.write(val >> 8);
00124     bytes[1] = spi.write(val & 0xFF);
00125     cs = 1;
00126     return (uint16_t)(bytes[0] << 8) + bytes[1];
00127 }