onewire DS18B20 DS2450

Dependencies:   mbed

Committer:
fblanc
Date:
Thu Jun 30 13:18:22 2011 +0000
Revision:
0:df0e3c8895f4
2011_06_30

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fblanc 0:df0e3c8895f4 1 /**
fblanc 0:df0e3c8895f4 2 * @file DS2450.c
fblanc 0:df0e3c8895f4 3 * @brief library of DS2450 1-Wire Quad A/D Converter (http://www.maxim-ic.com/datasheet/index.mvp/id/2921)
fblanc 0:df0e3c8895f4 4 * @author Frederic BLANC
fblanc 0:df0e3c8895f4 5 */
fblanc 0:df0e3c8895f4 6 #include "mbed.h"
fblanc 0:df0e3c8895f4 7 #include "onewire.h"
fblanc 0:df0e3c8895f4 8 #include "DS2450.h"
fblanc 0:df0e3c8895f4 9 #include "crc8.h"
fblanc 0:df0e3c8895f4 10 #include "crc16.h"
fblanc 0:df0e3c8895f4 11 #include "utils.h"
fblanc 0:df0e3c8895f4 12
fblanc 0:df0e3c8895f4 13 /**
fblanc 0:df0e3c8895f4 14 * @brief lancement lecture DS2450 ADC
fblanc 0:df0e3c8895f4 15 * @param [in] id[] tableau d'identifiant OW
fblanc 0:df0e3c8895f4 16 * @param [out] adc[] tableau des valeurs des adc
fblanc 0:df0e3c8895f4 17 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:df0e3c8895f4 18 * @date 20/06/2011
fblanc 0:df0e3c8895f4 19 *
fblanc 0:df0e3c8895f4 20 */
fblanc 0:df0e3c8895f4 21 uint8_t DS2450_read_ADC(uint8_t id[], uint16_t adc[]) {
fblanc 0:df0e3c8895f4 22 uint8_t i,j;
fblanc 0:df0e3c8895f4 23 uint8_t error;
fblanc 0:df0e3c8895f4 24 uint8_t sp[DS2450_SP_SIZE];
fblanc 0:df0e3c8895f4 25 //waiting for convertion time ( nbchannel x resolution x 80�s +160�s)
fblanc 0:df0e3c8895f4 26
fblanc 0:df0e3c8895f4 27 error=DS2450_read_page(&id[0],DS2450_PAGE0,&sp[0]); //read data
fblanc 0:df0e3c8895f4 28 if (error)
fblanc 0:df0e3c8895f4 29 return error;
fblanc 0:df0e3c8895f4 30 j=0;
fblanc 0:df0e3c8895f4 31 for (i=0;i<8;i+=2)
fblanc 0:df0e3c8895f4 32 adc[j++]=uint8_to_uint16(sp[i+3],sp[i+4]); //sp[i+3] LSB ,sp[i+4] MSB
fblanc 0:df0e3c8895f4 33 return OW_OK;
fblanc 0:df0e3c8895f4 34 }
fblanc 0:df0e3c8895f4 35 /**
fblanc 0:df0e3c8895f4 36 * @brief lancement & lecture DS2450 ADC
fblanc 0:df0e3c8895f4 37 * @param [in] id[] tableau d'identifiant OW
fblanc 0:df0e3c8895f4 38 * @param [out] adc[] tableau des valeurs des adc
fblanc 0:df0e3c8895f4 39 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:df0e3c8895f4 40 * @date 20/06/2011
fblanc 0:df0e3c8895f4 41 *
fblanc 0:df0e3c8895f4 42 */
fblanc 0:df0e3c8895f4 43 uint8_t DS2450_start_and_read_ADC(uint8_t id[], uint16_t adc[]) {
fblanc 0:df0e3c8895f4 44 uint8_t i,j;
fblanc 0:df0e3c8895f4 45 uint8_t error;
fblanc 0:df0e3c8895f4 46 uint8_t sp[DS2450_SP_SIZE];
fblanc 0:df0e3c8895f4 47
fblanc 0:df0e3c8895f4 48 error=DS2450_convert(&id[0],0x0F,0x00); //start convert
fblanc 0:df0e3c8895f4 49 if (error)
fblanc 0:df0e3c8895f4 50 return error;
fblanc 0:df0e3c8895f4 51
fblanc 0:df0e3c8895f4 52 wait_ms(15); //waiting for convertion time ( nbchannel x resolution x 80&#65533;s +160&#65533;s)
fblanc 0:df0e3c8895f4 53
fblanc 0:df0e3c8895f4 54 error=DS2450_read_page(&id[0],DS2450_PAGE0,&sp[0]); //read data
fblanc 0:df0e3c8895f4 55 if (error)
fblanc 0:df0e3c8895f4 56 return error;
fblanc 0:df0e3c8895f4 57
fblanc 0:df0e3c8895f4 58 j=0;
fblanc 0:df0e3c8895f4 59 for (i=0;i<8;i+=2)
fblanc 0:df0e3c8895f4 60 adc[j++]=uint8_to_uint16(sp[i+3],sp[i+4]); //sp[i+3] LSB ,sp[i+4] MSB
fblanc 0:df0e3c8895f4 61 return OW_OK;
fblanc 0:df0e3c8895f4 62 }
fblanc 0:df0e3c8895f4 63 /**
fblanc 0:df0e3c8895f4 64 * @brief lancement lecture page DS2450 ADC
fblanc 0:df0e3c8895f4 65 * @param [in] uint8_t id[] tableau d'identifiant OW
fblanc 0:df0e3c8895f4 66 * @param [in] uint8_t adresse de la page a lire
fblanc 0:df0e3c8895f4 67 * @param [out] uint8_t uint16_t sp tableau des valeurs de la page
fblanc 0:df0e3c8895f4 68 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:df0e3c8895f4 69 * @date 20/06/2011
fblanc 0:df0e3c8895f4 70 *
fblanc 0:df0e3c8895f4 71 */
fblanc 0:df0e3c8895f4 72 uint8_t DS2450_read_page(uint8_t id[], uint8_t adresse,
fblanc 0:df0e3c8895f4 73 uint8_t *sp) {
fblanc 0:df0e3c8895f4 74 uint8_t i;
fblanc 0:df0e3c8895f4 75 if (id[0] == DS2450_ID) {
fblanc 0:df0e3c8895f4 76 if (ow_reset()) //reset OW
fblanc 0:df0e3c8895f4 77 return OW_SHORT_CIRCUIT;
fblanc 0:df0e3c8895f4 78 sp[0]=DS2450_READ_MEMORY; // command
fblanc 0:df0e3c8895f4 79 sp[1]=adresse; //adress page LSB
fblanc 0:df0e3c8895f4 80 sp[2]=0; //adress page MSB
fblanc 0:df0e3c8895f4 81 ow_command(sp[0], &id[0]);
fblanc 0:df0e3c8895f4 82 ow_byte_wr(sp[1]);
fblanc 0:df0e3c8895f4 83 ow_byte_wr(sp[2]);
fblanc 0:df0e3c8895f4 84
fblanc 0:df0e3c8895f4 85 for ( i=3 ; i< DS2450_SP_SIZE; i++ ) { //read 8xdata + CRC16
fblanc 0:df0e3c8895f4 86 sp[i]=ow_byte_rd();
fblanc 0:df0e3c8895f4 87 }
fblanc 0:df0e3c8895f4 88 #ifdef DEBUG
fblanc 0:df0e3c8895f4 89 printf( "\n" );
fblanc 0:df0e3c8895f4 90 for ( i=0 ; i< DS2450_SP_SIZE; i++ )
fblanc 0:df0e3c8895f4 91 printf(":%2.2X",sp[i]);
fblanc 0:df0e3c8895f4 92 printf( "\n" );
fblanc 0:df0e3c8895f4 93 #endif
fblanc 0:df0e3c8895f4 94 if (ctrl_crc16( &sp[0], DS2450_SP_SIZE ) ) { //CRC16 (command+adress page LSB+adress page MSB+8xdata)
fblanc 0:df0e3c8895f4 95 wait_ms(100); //wait 100ms if error
fblanc 0:df0e3c8895f4 96 if ((sp[DS2450_SP_SIZE-1]==0xFF) && (sp[DS2450_SP_SIZE-2]==0xFF))
fblanc 0:df0e3c8895f4 97 return OW_ERROR; // bus error
fblanc 0:df0e3c8895f4 98 if ((sp[DS2450_SP_SIZE-1]==0x00) && (sp[DS2450_SP_SIZE-2]==0x00))
fblanc 0:df0e3c8895f4 99 return OW_BUSY;
fblanc 0:df0e3c8895f4 100 #ifdef DEBUG_L1
fblanc 0:df0e3c8895f4 101 printf( "\n" );
fblanc 0:df0e3c8895f4 102 for ( i=0 ; i< DS2450_SP_SIZE; i++ )
fblanc 0:df0e3c8895f4 103 printf(":%2.2X",sp[i]);
fblanc 0:df0e3c8895f4 104 printf( "\n" );
fblanc 0:df0e3c8895f4 105 #endif
fblanc 0:df0e3c8895f4 106 return OW_ERROR_CRC; // data error
fblanc 0:df0e3c8895f4 107 }
fblanc 0:df0e3c8895f4 108 return OW_OK;
fblanc 0:df0e3c8895f4 109 }
fblanc 0:df0e3c8895f4 110 return OW_ERROR_BAD_ID;
fblanc 0:df0e3c8895f4 111 }
fblanc 0:df0e3c8895f4 112
fblanc 0:df0e3c8895f4 113 /**
fblanc 0:df0e3c8895f4 114 * @brief lancement convertion DS2450 ADC
fblanc 0:df0e3c8895f4 115 * @param [in] uint8_t id[] tableau d'identifiant OW
fblanc 0:df0e3c8895f4 116 * @param [in] uint8_t input_select_mask
fblanc 0:df0e3c8895f4 117 * @param [in] uint8_t read_out_control
fblanc 0:df0e3c8895f4 118 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:df0e3c8895f4 119 * @date 20/06/2011
fblanc 0:df0e3c8895f4 120 *
fblanc 0:df0e3c8895f4 121 */
fblanc 0:df0e3c8895f4 122 uint8_t DS2450_convert(uint8_t id[], uint8_t input_select_mask,uint8_t read_out_control) {
fblanc 0:df0e3c8895f4 123 uint8_t i;
fblanc 0:df0e3c8895f4 124 uint8_t sp[5];
fblanc 0:df0e3c8895f4 125 if (id[0] == DS2450_ID) {
fblanc 0:df0e3c8895f4 126 if (ow_reset()) //reset OW
fblanc 0:df0e3c8895f4 127 return OW_SHORT_CIRCUIT;
fblanc 0:df0e3c8895f4 128 sp[0]=DS2450_CONVERT; // command
fblanc 0:df0e3c8895f4 129 sp[1]=input_select_mask; //mask
fblanc 0:df0e3c8895f4 130 sp[2]=read_out_control; //control
fblanc 0:df0e3c8895f4 131 ow_command(sp[0], &id[0]);
fblanc 0:df0e3c8895f4 132 ow_byte_wr(sp[1]);
fblanc 0:df0e3c8895f4 133 ow_byte_wr(sp[2]);
fblanc 0:df0e3c8895f4 134 for ( i=3 ; i< 5; i++ ) { // read CRC16
fblanc 0:df0e3c8895f4 135 sp[i]=ow_byte_rd();
fblanc 0:df0e3c8895f4 136 }
fblanc 0:df0e3c8895f4 137 #ifdef DEBUG
fblanc 0:df0e3c8895f4 138 printf( "\n" );
fblanc 0:df0e3c8895f4 139 for ( i=0 ; i< 5; i++ )
fblanc 0:df0e3c8895f4 140 printf(":%2.2X",sp[i]);
fblanc 0:df0e3c8895f4 141 printf( "\n" );
fblanc 0:df0e3c8895f4 142 #endif
fblanc 0:df0e3c8895f4 143 if (ctrl_crc16( &sp[0], 5 ) ) { //CRC16 (command+mask LSB+control)
fblanc 0:df0e3c8895f4 144 if ((sp[3]==0xFF) && (sp[3]==0xFF))
fblanc 0:df0e3c8895f4 145 return OW_ERROR;
fblanc 0:df0e3c8895f4 146 return OW_ERROR_CRC;
fblanc 0:df0e3c8895f4 147 }
fblanc 0:df0e3c8895f4 148 return OW_OK;
fblanc 0:df0e3c8895f4 149 }
fblanc 0:df0e3c8895f4 150 return OW_ERROR_BAD_ID;
fblanc 0:df0e3c8895f4 151 }
fblanc 0:df0e3c8895f4 152
fblanc 0:df0e3c8895f4 153 /**
fblanc 0:df0e3c8895f4 154 * @brief configure canal ADC DS2450
fblanc 0:df0e3c8895f4 155 * @param [in] id[] tableau d'identifiant OW
fblanc 0:df0e3c8895f4 156 * @param [in] channel
fblanc 0:df0e3c8895f4 157 * @param [in] conflsb configuration OE-A OC-A 0 0 RC3-A RC2-A RC1-A RC0-A
fblanc 0:df0e3c8895f4 158 * @param [in] confmsb configuration POR 0 AFH-A AFL-A AEH-A AEL-A 0 IR-A
fblanc 0:df0e3c8895f4 159 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:df0e3c8895f4 160 * @date 20/06/2011
fblanc 0:df0e3c8895f4 161 *
fblanc 0:df0e3c8895f4 162 */
fblanc 0:df0e3c8895f4 163 uint8_t DS2450_configure_channel_ADC(uint8_t id[],uint8_t channel,uint8_t conflsb,uint8_t confmsb) {
fblanc 0:df0e3c8895f4 164 uint8_t i;
fblanc 0:df0e3c8895f4 165 uint8_t sp[7];
fblanc 0:df0e3c8895f4 166 if (id[0] == DS2450_ID) {
fblanc 0:df0e3c8895f4 167 if (ow_reset()) //reset OW
fblanc 0:df0e3c8895f4 168 return OW_SHORT_CIRCUIT;
fblanc 0:df0e3c8895f4 169 sp[0]=DS2450_WRITE_MEMORY; // command
fblanc 0:df0e3c8895f4 170 sp[1]=DS2450_PAGE1+channel; //adress page LSB
fblanc 0:df0e3c8895f4 171 sp[2]=0x00; //adress page MSB
fblanc 0:df0e3c8895f4 172 sp[3]=conflsb; //databyte
fblanc 0:df0e3c8895f4 173 ow_command(sp[0], &id[0]);
fblanc 0:df0e3c8895f4 174 ow_byte_wr(sp[1]);
fblanc 0:df0e3c8895f4 175 ow_byte_wr(sp[2]);
fblanc 0:df0e3c8895f4 176 ow_byte_wr(sp[3]);
fblanc 0:df0e3c8895f4 177 for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte
fblanc 0:df0e3c8895f4 178 sp[i]=ow_byte_rd();
fblanc 0:df0e3c8895f4 179 }
fblanc 0:df0e3c8895f4 180 #ifdef DEBUG
fblanc 0:df0e3c8895f4 181 printf( "\n" );
fblanc 0:df0e3c8895f4 182 for ( i=0 ; i< 7; i++ )
fblanc 0:df0e3c8895f4 183 printf(":%2.2X",sp[i]);
fblanc 0:df0e3c8895f4 184 printf( "\n" );
fblanc 0:df0e3c8895f4 185 #endif
fblanc 0:df0e3c8895f4 186 if (ctrl_crc16( &sp[0], 6 ) ) //CRC16 (command+adress page LSB+adress page MSB+databyte)
fblanc 0:df0e3c8895f4 187 return OW_ERROR_CRC;
fblanc 0:df0e3c8895f4 188 sp[3]=confmsb; //databyte
fblanc 0:df0e3c8895f4 189 ow_byte_wr(sp[3]);
fblanc 0:df0e3c8895f4 190 for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte
fblanc 0:df0e3c8895f4 191 sp[i]=ow_byte_rd();
fblanc 0:df0e3c8895f4 192 }
fblanc 0:df0e3c8895f4 193 #ifdef DEBUG
fblanc 0:df0e3c8895f4 194 printf( "\n" );
fblanc 0:df0e3c8895f4 195 for ( i=0 ; i< 7; i++ )
fblanc 0:df0e3c8895f4 196 printf(":%2.2X",sp[i]);
fblanc 0:df0e3c8895f4 197 printf( "\n" );
fblanc 0:df0e3c8895f4 198 #endif
fblanc 0:df0e3c8895f4 199 if (sp[3]!=sp[6] ) //control data
fblanc 0:df0e3c8895f4 200 return OW_ERROR_CRC;
fblanc 0:df0e3c8895f4 201 return OW_OK;
fblanc 0:df0e3c8895f4 202 }
fblanc 0:df0e3c8895f4 203 return OW_ERROR_BAD_ID;
fblanc 0:df0e3c8895f4 204 }
fblanc 0:df0e3c8895f4 205 /**
fblanc 0:df0e3c8895f4 206 * @brief configure PAGE
fblanc 0:df0e3c8895f4 207 * @param [in] id[] tableau d'identifiant OW
fblanc 0:df0e3c8895f4 208 * @param [in] uint8_t adresse de la page a ecrire
fblanc 0:df0e3c8895f4 209 * @param [in] config_page tableau de 8 byte
fblanc 0:df0e3c8895f4 210 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:df0e3c8895f4 211 * @date 20/06/2011
fblanc 0:df0e3c8895f4 212 *
fblanc 0:df0e3c8895f4 213 */
fblanc 0:df0e3c8895f4 214 uint8_t DS2450_configure_page(uint8_t id[], uint8_t adresse,uint8_t configpage[]) {
fblanc 0:df0e3c8895f4 215 uint8_t i,j;
fblanc 0:df0e3c8895f4 216 uint8_t sp[7];
fblanc 0:df0e3c8895f4 217 if (id[0] == DS2450_ID) {
fblanc 0:df0e3c8895f4 218 if (ow_reset()) //reset OW
fblanc 0:df0e3c8895f4 219 return OW_SHORT_CIRCUIT;
fblanc 0:df0e3c8895f4 220 sp[0]=DS2450_WRITE_MEMORY; // command
fblanc 0:df0e3c8895f4 221 sp[1]=adresse; //adress page LSB
fblanc 0:df0e3c8895f4 222 sp[2]=0x00; //adress page MSB
fblanc 0:df0e3c8895f4 223 sp[3]=configpage[0]; //databyte
fblanc 0:df0e3c8895f4 224 ow_command(sp[0], &id[0]);
fblanc 0:df0e3c8895f4 225 ow_byte_wr(sp[1]);
fblanc 0:df0e3c8895f4 226 ow_byte_wr(sp[2]);
fblanc 0:df0e3c8895f4 227 ow_byte_wr(sp[3]);
fblanc 0:df0e3c8895f4 228 for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte
fblanc 0:df0e3c8895f4 229 sp[i]=ow_byte_rd();
fblanc 0:df0e3c8895f4 230 }
fblanc 0:df0e3c8895f4 231 #ifdef DEBUG
fblanc 0:df0e3c8895f4 232 printf( "\n" );
fblanc 0:df0e3c8895f4 233 for ( i=0 ; i< 7; i++ )
fblanc 0:df0e3c8895f4 234 printf(":%2.2X",sp[i]);
fblanc 0:df0e3c8895f4 235 printf( "\n" );
fblanc 0:df0e3c8895f4 236 #endif
fblanc 0:df0e3c8895f4 237 if (sp[3]!=sp[6] ) //control data
fblanc 0:df0e3c8895f4 238 return OW_ERROR_CRC;
fblanc 0:df0e3c8895f4 239
fblanc 0:df0e3c8895f4 240 for ( j=1 ; j< 7; j++ ) {
fblanc 0:df0e3c8895f4 241 sp[3]=configpage[j]; //databyte
fblanc 0:df0e3c8895f4 242 ow_byte_wr(sp[3]);
fblanc 0:df0e3c8895f4 243 for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte
fblanc 0:df0e3c8895f4 244 sp[i]=ow_byte_rd();
fblanc 0:df0e3c8895f4 245 }
fblanc 0:df0e3c8895f4 246 if (sp[3]!=sp[6] ) //control data
fblanc 0:df0e3c8895f4 247 return OW_ERROR_CRC;
fblanc 0:df0e3c8895f4 248
fblanc 0:df0e3c8895f4 249 #ifdef DEBUG
fblanc 0:df0e3c8895f4 250 printf( "\n" );
fblanc 0:df0e3c8895f4 251 for ( i=0 ; i< 7; i++ )
fblanc 0:df0e3c8895f4 252 printf(":%2.2X",sp[i]);
fblanc 0:df0e3c8895f4 253 printf( "\n" );
fblanc 0:df0e3c8895f4 254 #endif
fblanc 0:df0e3c8895f4 255 }
fblanc 0:df0e3c8895f4 256 return OW_OK;
fblanc 0:df0e3c8895f4 257 }
fblanc 0:df0e3c8895f4 258 return OW_ERROR_BAD_ID;
fblanc 0:df0e3c8895f4 259 }