Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Wed Jul 13 2022 05:20:57 by
1.7.2