onewire 1-wire ds18x20 ds2450 multi-channel

Dependents:   ibutton

Committer:
fblanc
Date:
Fri Mar 02 08:29:49 2012 +0000
Revision:
0:8c4e1841eb30
v1.1 onewire multi-channel

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fblanc 0:8c4e1841eb30 1 /**
fblanc 0:8c4e1841eb30 2 * @file DS2450.c
fblanc 0:8c4e1841eb30 3 * @brief library of DS2450 1-Wire Quad A/D Converter (http://www.maxim-ic.com/datasheet/index.mvp/id/2921)
fblanc 0:8c4e1841eb30 4 * @author Frederic BLANC (Published 01/03/2012 www.mbed.org)
fblanc 0:8c4e1841eb30 5 */
fblanc 0:8c4e1841eb30 6 #include "mbed.h"
fblanc 0:8c4e1841eb30 7 #include "onewire.h"
fblanc 0:8c4e1841eb30 8 #include "DS2450.h"
fblanc 0:8c4e1841eb30 9 #include "crc8.h"
fblanc 0:8c4e1841eb30 10 #include "crc16.h"
fblanc 0:8c4e1841eb30 11 #include "utils.h"
fblanc 0:8c4e1841eb30 12 //**********************************************************************************************************
fblanc 0:8c4e1841eb30 13 //* DS2450_read_ADC
fblanc 0:8c4e1841eb30 14 //**********************************************************************************************************
fblanc 0:8c4e1841eb30 15
fblanc 0:8c4e1841eb30 16 /**
fblanc 0:8c4e1841eb30 17 * @brief lancement lecture DS2450 ADC
fblanc 0:8c4e1841eb30 18 * @param [in] id[] tableau d'identifiant OW
fblanc 0:8c4e1841eb30 19 * @param [out] adc[] tableau des valeurs des adc
fblanc 0:8c4e1841eb30 20 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:8c4e1841eb30 21 * @date 20/06/2011
fblanc 0:8c4e1841eb30 22 *
fblanc 0:8c4e1841eb30 23 */
fblanc 0:8c4e1841eb30 24 uint8_t DS2450_read_ADC(uint8_t id[], uint16_t adc[]) {
fblanc 0:8c4e1841eb30 25 uint8_t i,j;
fblanc 0:8c4e1841eb30 26 uint8_t error;
fblanc 0:8c4e1841eb30 27 uint8_t sp[DS2450_SP_SIZE];
fblanc 0:8c4e1841eb30 28 //waiting for convertion time ( nbchannel x resolution x 80�s +160�s)
fblanc 0:8c4e1841eb30 29
fblanc 0:8c4e1841eb30 30 error=DS2450_read_page(&id[0],DS2450_PAGE0,&sp[0]); //read data
fblanc 0:8c4e1841eb30 31 if (error)
fblanc 0:8c4e1841eb30 32 return error;
fblanc 0:8c4e1841eb30 33 j=0;
fblanc 0:8c4e1841eb30 34 for (i=0;i<8;i+=2)
fblanc 0:8c4e1841eb30 35 adc[j++]=uint8_to_uint16(sp[i+3],sp[i+4]); //sp[i+3] LSB ,sp[i+4] MSB
fblanc 0:8c4e1841eb30 36 return OW_OK;
fblanc 0:8c4e1841eb30 37 }
fblanc 0:8c4e1841eb30 38
fblanc 0:8c4e1841eb30 39
fblanc 0:8c4e1841eb30 40 /**
fblanc 0:8c4e1841eb30 41 * @brief lancement lecture DS2450 ADC
fblanc 0:8c4e1841eb30 42 * @param [in] n num bus onewire
fblanc 0:8c4e1841eb30 43 * @param [in] id[] tableau d'identifiant OW
fblanc 0:8c4e1841eb30 44 * @param [out] adc[] tableau des valeurs des adc
fblanc 0:8c4e1841eb30 45 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:8c4e1841eb30 46 * @date 07/09/2011
fblanc 0:8c4e1841eb30 47 *
fblanc 0:8c4e1841eb30 48 */
fblanc 0:8c4e1841eb30 49 uint8_t DS2450_read_ADC(uint8_t n,uint8_t id[], uint16_t adc[]) {
fblanc 0:8c4e1841eb30 50 uint8_t i,j;
fblanc 0:8c4e1841eb30 51 uint8_t error;
fblanc 0:8c4e1841eb30 52 uint8_t sp[DS2450_SP_SIZE];
fblanc 0:8c4e1841eb30 53 //waiting for convertion time ( nbchannel x resolution x 80&#65533;s +160&#65533;s)
fblanc 0:8c4e1841eb30 54
fblanc 0:8c4e1841eb30 55 error=DS2450_read_page(n,&id[0],DS2450_PAGE0,&sp[0]); //read data
fblanc 0:8c4e1841eb30 56 if (error)
fblanc 0:8c4e1841eb30 57 return error;
fblanc 0:8c4e1841eb30 58 j=0;
fblanc 0:8c4e1841eb30 59 for (i=0;i<8;i+=2)
fblanc 0:8c4e1841eb30 60 adc[j++]=uint8_to_uint16(sp[i+3],sp[i+4]); //sp[i+3] LSB ,sp[i+4] MSB
fblanc 0:8c4e1841eb30 61 return OW_OK;
fblanc 0:8c4e1841eb30 62 }
fblanc 0:8c4e1841eb30 63 //**********************************************************************************************************
fblanc 0:8c4e1841eb30 64 //* DS2450_start_and_read_ADC
fblanc 0:8c4e1841eb30 65 //**********************************************************************************************************
fblanc 0:8c4e1841eb30 66
fblanc 0:8c4e1841eb30 67 /**
fblanc 0:8c4e1841eb30 68 * @brief lancement & lecture DS2450 ADC
fblanc 0:8c4e1841eb30 69 * @param [in] id[] tableau d'identifiant OW
fblanc 0:8c4e1841eb30 70 * @param [out] adc[] tableau des valeurs des adc
fblanc 0:8c4e1841eb30 71 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:8c4e1841eb30 72 * @date 20/06/2011
fblanc 0:8c4e1841eb30 73 *
fblanc 0:8c4e1841eb30 74 */
fblanc 0:8c4e1841eb30 75 uint8_t DS2450_start_and_read_ADC(uint8_t id[], uint16_t adc[]) {
fblanc 0:8c4e1841eb30 76 uint8_t i,j;
fblanc 0:8c4e1841eb30 77 uint8_t error;
fblanc 0:8c4e1841eb30 78 uint8_t sp[DS2450_SP_SIZE];
fblanc 0:8c4e1841eb30 79
fblanc 0:8c4e1841eb30 80 error=DS2450_convert(&id[0],0x0F,0x00); //start convert
fblanc 0:8c4e1841eb30 81 if (error)
fblanc 0:8c4e1841eb30 82 return error;
fblanc 0:8c4e1841eb30 83
fblanc 0:8c4e1841eb30 84 wait_ms(15); //waiting for convertion time ( nbchannel x resolution x 80&#65533;s +160&#65533;s)
fblanc 0:8c4e1841eb30 85
fblanc 0:8c4e1841eb30 86 error=DS2450_read_page(&id[0],DS2450_PAGE0,&sp[0]); //read data
fblanc 0:8c4e1841eb30 87 if (error)
fblanc 0:8c4e1841eb30 88 return error;
fblanc 0:8c4e1841eb30 89
fblanc 0:8c4e1841eb30 90 j=0;
fblanc 0:8c4e1841eb30 91 for (i=0;i<8;i+=2)
fblanc 0:8c4e1841eb30 92 adc[j++]=uint8_to_uint16(sp[i+3],sp[i+4]); //sp[i+3] LSB ,sp[i+4] MSB
fblanc 0:8c4e1841eb30 93 return OW_OK;
fblanc 0:8c4e1841eb30 94 }
fblanc 0:8c4e1841eb30 95
fblanc 0:8c4e1841eb30 96 /**
fblanc 0:8c4e1841eb30 97 * @brief lancement & lecture DS2450 ADC
fblanc 0:8c4e1841eb30 98 * @param [in] n num bus onewire
fblanc 0:8c4e1841eb30 99 * @param [in] id[] tableau d'identifiant OW
fblanc 0:8c4e1841eb30 100 * @param [out] adc[] tableau des valeurs des adc
fblanc 0:8c4e1841eb30 101 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:8c4e1841eb30 102 * @date 07/09/2011
fblanc 0:8c4e1841eb30 103 *
fblanc 0:8c4e1841eb30 104 */
fblanc 0:8c4e1841eb30 105 uint8_t DS2450_start_and_read_ADC(uint8_t n,uint8_t id[], uint16_t adc[]) {
fblanc 0:8c4e1841eb30 106 uint8_t i,j;
fblanc 0:8c4e1841eb30 107 uint8_t error;
fblanc 0:8c4e1841eb30 108 uint8_t sp[DS2450_SP_SIZE];
fblanc 0:8c4e1841eb30 109
fblanc 0:8c4e1841eb30 110 error=DS2450_convert(n,&id[0],0x0F,0x00); //start convert
fblanc 0:8c4e1841eb30 111 if (error)
fblanc 0:8c4e1841eb30 112 return error;
fblanc 0:8c4e1841eb30 113
fblanc 0:8c4e1841eb30 114 wait_ms(15); //waiting for convertion time ( nbchannel x resolution x 80&#65533;s +160&#65533;s)
fblanc 0:8c4e1841eb30 115
fblanc 0:8c4e1841eb30 116 error=DS2450_read_page(n,&id[0],DS2450_PAGE0,&sp[0]); //read data
fblanc 0:8c4e1841eb30 117 if (error)
fblanc 0:8c4e1841eb30 118 return error;
fblanc 0:8c4e1841eb30 119
fblanc 0:8c4e1841eb30 120 j=0;
fblanc 0:8c4e1841eb30 121 for (i=0;i<8;i+=2)
fblanc 0:8c4e1841eb30 122 adc[j++]=uint8_to_uint16(sp[i+3],sp[i+4]); //sp[i+3] LSB ,sp[i+4] MSB
fblanc 0:8c4e1841eb30 123 return OW_OK;
fblanc 0:8c4e1841eb30 124 }
fblanc 0:8c4e1841eb30 125
fblanc 0:8c4e1841eb30 126 //**********************************************************************************************************
fblanc 0:8c4e1841eb30 127 //* DS2450_read_page
fblanc 0:8c4e1841eb30 128 //**********************************************************************************************************
fblanc 0:8c4e1841eb30 129
fblanc 0:8c4e1841eb30 130 /**
fblanc 0:8c4e1841eb30 131 * @brief lancement lecture page DS2450 ADC
fblanc 0:8c4e1841eb30 132 * @param [in] id[] tableau d'identifiant OW
fblanc 0:8c4e1841eb30 133 * @param [in] adresse de la page a lire
fblanc 0:8c4e1841eb30 134 * @param [out] uint16_t sp tableau des valeurs de la page
fblanc 0:8c4e1841eb30 135 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:8c4e1841eb30 136 * @date 20/06/2011
fblanc 0:8c4e1841eb30 137 *
fblanc 0:8c4e1841eb30 138 */
fblanc 0:8c4e1841eb30 139 uint8_t DS2450_read_page(uint8_t id[], uint8_t adresse,
fblanc 0:8c4e1841eb30 140 uint8_t *sp) {
fblanc 0:8c4e1841eb30 141 uint8_t i;
fblanc 0:8c4e1841eb30 142 if (id[0] == DS2450_ID) {
fblanc 0:8c4e1841eb30 143 if (ow_reset()) //reset OW
fblanc 0:8c4e1841eb30 144 return OW_SHORT_CIRCUIT;
fblanc 0:8c4e1841eb30 145 sp[0]=DS2450_READ_MEMORY; // command
fblanc 0:8c4e1841eb30 146 sp[1]=adresse; //adress page LSB
fblanc 0:8c4e1841eb30 147 sp[2]=0; //adress page MSB
fblanc 0:8c4e1841eb30 148 ow_command(sp[0], &id[0]);
fblanc 0:8c4e1841eb30 149 ow_byte_wr(sp[1]);
fblanc 0:8c4e1841eb30 150 ow_byte_wr(sp[2]);
fblanc 0:8c4e1841eb30 151
fblanc 0:8c4e1841eb30 152 for ( i=3 ; i< DS2450_SP_SIZE; i++ ) { //read 8xdata + CRC16
fblanc 0:8c4e1841eb30 153 sp[i]=ow_byte_rd();
fblanc 0:8c4e1841eb30 154 }
fblanc 0:8c4e1841eb30 155
fblanc 0:8c4e1841eb30 156 if (ctrl_crc16( &sp[0], DS2450_SP_SIZE ) ) { //CRC16 (command+adress page LSB+adress page MSB+8xdata)
fblanc 0:8c4e1841eb30 157 wait_ms(100); //wait 100ms if error
fblanc 0:8c4e1841eb30 158 if ((sp[DS2450_SP_SIZE-1]==0xFF) && (sp[DS2450_SP_SIZE-2]==0xFF))
fblanc 0:8c4e1841eb30 159 return OW_ERROR; // bus error
fblanc 0:8c4e1841eb30 160 if ((sp[DS2450_SP_SIZE-1]==0x00) && (sp[DS2450_SP_SIZE-2]==0x00))
fblanc 0:8c4e1841eb30 161 return OW_BUSY;
fblanc 0:8c4e1841eb30 162
fblanc 0:8c4e1841eb30 163 return OW_ERROR_CRC; // data error
fblanc 0:8c4e1841eb30 164 }
fblanc 0:8c4e1841eb30 165 return OW_OK;
fblanc 0:8c4e1841eb30 166 }
fblanc 0:8c4e1841eb30 167 return OW_ERROR_BAD_ID;
fblanc 0:8c4e1841eb30 168 }
fblanc 0:8c4e1841eb30 169 /**
fblanc 0:8c4e1841eb30 170 * @brief lancement lecture page DS2450 ADC
fblanc 0:8c4e1841eb30 171 * @param [in] n num bus onewire
fblanc 0:8c4e1841eb30 172 * @param [in] id[] tableau d'identifiant OW
fblanc 0:8c4e1841eb30 173 * @param [in] adresse de la page a lire
fblanc 0:8c4e1841eb30 174 * @param [out] sp tableau des valeurs de la page
fblanc 0:8c4e1841eb30 175 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:8c4e1841eb30 176 * @date 07/09/2011
fblanc 0:8c4e1841eb30 177 *
fblanc 0:8c4e1841eb30 178 */
fblanc 0:8c4e1841eb30 179 uint8_t DS2450_read_page(uint8_t n,uint8_t id[], uint8_t adresse,
fblanc 0:8c4e1841eb30 180 uint8_t *sp) {
fblanc 0:8c4e1841eb30 181 uint8_t i;
fblanc 0:8c4e1841eb30 182 if (id[0] == DS2450_ID) {
fblanc 0:8c4e1841eb30 183 if (ow_reset(n)) //reset OW
fblanc 0:8c4e1841eb30 184 return OW_SHORT_CIRCUIT;
fblanc 0:8c4e1841eb30 185 sp[0]=DS2450_READ_MEMORY; // command
fblanc 0:8c4e1841eb30 186 sp[1]=adresse; //adress page LSB
fblanc 0:8c4e1841eb30 187 sp[2]=0; //adress page MSB
fblanc 0:8c4e1841eb30 188 ow_command(n,sp[0], &id[0]);
fblanc 0:8c4e1841eb30 189 ow_byte_wr(n,sp[1]);
fblanc 0:8c4e1841eb30 190 ow_byte_wr(n,sp[2]);
fblanc 0:8c4e1841eb30 191
fblanc 0:8c4e1841eb30 192 for ( i=3 ; i< DS2450_SP_SIZE; i++ ) { //read 8xdata + CRC16
fblanc 0:8c4e1841eb30 193 sp[i]=ow_byte_rd(n);
fblanc 0:8c4e1841eb30 194 }
fblanc 0:8c4e1841eb30 195
fblanc 0:8c4e1841eb30 196 if (ctrl_crc16( &sp[0], DS2450_SP_SIZE ) ) { //CRC16 (command+adress page LSB+adress page MSB+8xdata)
fblanc 0:8c4e1841eb30 197 wait_ms(100); //wait 100ms if error
fblanc 0:8c4e1841eb30 198 if ((sp[DS2450_SP_SIZE-1]==0xFF) && (sp[DS2450_SP_SIZE-2]==0xFF))
fblanc 0:8c4e1841eb30 199 return OW_ERROR; // bus error
fblanc 0:8c4e1841eb30 200 if ((sp[DS2450_SP_SIZE-1]==0x00) && (sp[DS2450_SP_SIZE-2]==0x00))
fblanc 0:8c4e1841eb30 201 return OW_BUSY;
fblanc 0:8c4e1841eb30 202
fblanc 0:8c4e1841eb30 203 return OW_ERROR_CRC; // data error
fblanc 0:8c4e1841eb30 204 }
fblanc 0:8c4e1841eb30 205 return OW_OK;
fblanc 0:8c4e1841eb30 206 }
fblanc 0:8c4e1841eb30 207 return OW_ERROR_BAD_ID;
fblanc 0:8c4e1841eb30 208 }
fblanc 0:8c4e1841eb30 209 //**********************************************************************************************************
fblanc 0:8c4e1841eb30 210 //* DS2450_convert
fblanc 0:8c4e1841eb30 211 //**********************************************************************************************************
fblanc 0:8c4e1841eb30 212
fblanc 0:8c4e1841eb30 213 /**
fblanc 0:8c4e1841eb30 214 * @brief lancement convertion DS2450 ADC
fblanc 0:8c4e1841eb30 215 * @param [in] uint8_t id[] tableau d'identifiant OW
fblanc 0:8c4e1841eb30 216 * @param [in] uint8_t input_select_mask
fblanc 0:8c4e1841eb30 217 * @param [in] uint8_t read_out_control
fblanc 0:8c4e1841eb30 218 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:8c4e1841eb30 219 * @date 20/06/2011
fblanc 0:8c4e1841eb30 220 *
fblanc 0:8c4e1841eb30 221 */
fblanc 0:8c4e1841eb30 222 uint8_t DS2450_convert(uint8_t id[], uint8_t input_select_mask,uint8_t read_out_control) {
fblanc 0:8c4e1841eb30 223 uint8_t i;
fblanc 0:8c4e1841eb30 224 uint8_t sp[5];
fblanc 0:8c4e1841eb30 225 if (id[0] == DS2450_ID) {
fblanc 0:8c4e1841eb30 226 if (ow_reset()) //reset OW
fblanc 0:8c4e1841eb30 227 return OW_SHORT_CIRCUIT;
fblanc 0:8c4e1841eb30 228 sp[0]=DS2450_CONVERT; // command
fblanc 0:8c4e1841eb30 229 sp[1]=input_select_mask; //mask
fblanc 0:8c4e1841eb30 230 sp[2]=read_out_control; //control
fblanc 0:8c4e1841eb30 231 ow_command(sp[0], &id[0]);
fblanc 0:8c4e1841eb30 232 ow_byte_wr(sp[1]);
fblanc 0:8c4e1841eb30 233 ow_byte_wr(sp[2]);
fblanc 0:8c4e1841eb30 234 for ( i=3 ; i< 5; i++ ) { // read CRC16
fblanc 0:8c4e1841eb30 235 sp[i]=ow_byte_rd();
fblanc 0:8c4e1841eb30 236 }
fblanc 0:8c4e1841eb30 237
fblanc 0:8c4e1841eb30 238 if (ctrl_crc16( &sp[0], 5 ) ) { //CRC16 (command+mask LSB+control)
fblanc 0:8c4e1841eb30 239 if ((sp[3]==0xFF) && (sp[3]==0xFF))
fblanc 0:8c4e1841eb30 240 return OW_ERROR;
fblanc 0:8c4e1841eb30 241 return OW_ERROR_CRC;
fblanc 0:8c4e1841eb30 242 }
fblanc 0:8c4e1841eb30 243 return OW_OK;
fblanc 0:8c4e1841eb30 244 }
fblanc 0:8c4e1841eb30 245 return OW_ERROR_BAD_ID;
fblanc 0:8c4e1841eb30 246 }
fblanc 0:8c4e1841eb30 247 /**
fblanc 0:8c4e1841eb30 248 * @brief lancement convertion DS2450 ADC
fblanc 0:8c4e1841eb30 249 * @param [in] n num bus onewire
fblanc 0:8c4e1841eb30 250 * @param [in] uint8_t id[] tableau d'identifiant OW
fblanc 0:8c4e1841eb30 251 * @param [in] uint8_t input_select_mask
fblanc 0:8c4e1841eb30 252 * @param [in] uint8_t read_out_control
fblanc 0:8c4e1841eb30 253 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:8c4e1841eb30 254 * @date 07/09/2011
fblanc 0:8c4e1841eb30 255 *
fblanc 0:8c4e1841eb30 256 */
fblanc 0:8c4e1841eb30 257 uint8_t DS2450_convert(uint8_t n,uint8_t id[], uint8_t input_select_mask,uint8_t read_out_control) {
fblanc 0:8c4e1841eb30 258 uint8_t i;
fblanc 0:8c4e1841eb30 259 uint8_t sp[5];
fblanc 0:8c4e1841eb30 260 if (id[0] == DS2450_ID) {
fblanc 0:8c4e1841eb30 261 if (ow_reset(n)) //reset OW
fblanc 0:8c4e1841eb30 262 return OW_SHORT_CIRCUIT;
fblanc 0:8c4e1841eb30 263 sp[0]=DS2450_CONVERT; // command
fblanc 0:8c4e1841eb30 264 sp[1]=input_select_mask; //mask
fblanc 0:8c4e1841eb30 265 sp[2]=read_out_control; //control
fblanc 0:8c4e1841eb30 266 ow_command(n,sp[0], &id[0]);
fblanc 0:8c4e1841eb30 267 ow_byte_wr(n,sp[1]);
fblanc 0:8c4e1841eb30 268 ow_byte_wr(n,sp[2]);
fblanc 0:8c4e1841eb30 269 for ( i=3 ; i< 5; i++ ) { // read CRC16
fblanc 0:8c4e1841eb30 270 sp[i]=ow_byte_rd(n);
fblanc 0:8c4e1841eb30 271 }
fblanc 0:8c4e1841eb30 272
fblanc 0:8c4e1841eb30 273 if (ctrl_crc16( &sp[0], 5 ) ) { //CRC16 (command+mask LSB+control)
fblanc 0:8c4e1841eb30 274 if ((sp[3]==0xFF) && (sp[3]==0xFF))
fblanc 0:8c4e1841eb30 275 return OW_ERROR;
fblanc 0:8c4e1841eb30 276 return OW_ERROR_CRC;
fblanc 0:8c4e1841eb30 277 }
fblanc 0:8c4e1841eb30 278 return OW_OK;
fblanc 0:8c4e1841eb30 279 }
fblanc 0:8c4e1841eb30 280 return OW_ERROR_BAD_ID;
fblanc 0:8c4e1841eb30 281 }
fblanc 0:8c4e1841eb30 282
fblanc 0:8c4e1841eb30 283 //**********************************************************************************************************
fblanc 0:8c4e1841eb30 284 //* DS2450_configure_channel_ADC
fblanc 0:8c4e1841eb30 285 //**********************************************************************************************************
fblanc 0:8c4e1841eb30 286
fblanc 0:8c4e1841eb30 287 /**
fblanc 0:8c4e1841eb30 288 * @brief configure canal ADC DS2450
fblanc 0:8c4e1841eb30 289 * @param [in] id[] tableau d'identifiant OW
fblanc 0:8c4e1841eb30 290 * @param [in] channel
fblanc 0:8c4e1841eb30 291 * @param [in] conflsb configuration OE-A OC-A 0 0 RC3-A RC2-A RC1-A RC0-A
fblanc 0:8c4e1841eb30 292 * @param [in] confmsb configuration POR 0 AFH-A AFL-A AEH-A AEL-A 0 IR-A
fblanc 0:8c4e1841eb30 293 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:8c4e1841eb30 294 * @date 20/06/2011
fblanc 0:8c4e1841eb30 295 *
fblanc 0:8c4e1841eb30 296 */
fblanc 0:8c4e1841eb30 297 uint8_t DS2450_configure_channel_ADC(uint8_t id[],uint8_t channel,uint8_t conflsb,uint8_t confmsb) {
fblanc 0:8c4e1841eb30 298 uint8_t i;
fblanc 0:8c4e1841eb30 299 uint8_t sp[7];
fblanc 0:8c4e1841eb30 300 if (id[0] == DS2450_ID) {
fblanc 0:8c4e1841eb30 301 if (ow_reset()) //reset OW
fblanc 0:8c4e1841eb30 302 return OW_SHORT_CIRCUIT;
fblanc 0:8c4e1841eb30 303 sp[0]=DS2450_WRITE_MEMORY; // command
fblanc 0:8c4e1841eb30 304 sp[1]=DS2450_PAGE1+channel; //adress page LSB
fblanc 0:8c4e1841eb30 305 sp[2]=0x00; //adress page MSB
fblanc 0:8c4e1841eb30 306 sp[3]=conflsb; //databyte
fblanc 0:8c4e1841eb30 307 ow_command(sp[0], &id[0]);
fblanc 0:8c4e1841eb30 308 ow_byte_wr(sp[1]);
fblanc 0:8c4e1841eb30 309 ow_byte_wr(sp[2]);
fblanc 0:8c4e1841eb30 310 ow_byte_wr(sp[3]);
fblanc 0:8c4e1841eb30 311 for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte
fblanc 0:8c4e1841eb30 312 sp[i]=ow_byte_rd();
fblanc 0:8c4e1841eb30 313 }
fblanc 0:8c4e1841eb30 314
fblanc 0:8c4e1841eb30 315 if (ctrl_crc16( &sp[0], 6 ) ) //CRC16 (command+adress page LSB+adress page MSB+databyte)
fblanc 0:8c4e1841eb30 316 return OW_ERROR_CRC;
fblanc 0:8c4e1841eb30 317 sp[3]=confmsb; //databyte
fblanc 0:8c4e1841eb30 318 ow_byte_wr(sp[3]);
fblanc 0:8c4e1841eb30 319 for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte
fblanc 0:8c4e1841eb30 320 sp[i]=ow_byte_rd();
fblanc 0:8c4e1841eb30 321 }
fblanc 0:8c4e1841eb30 322
fblanc 0:8c4e1841eb30 323 if (sp[3]!=sp[6] ) //control data
fblanc 0:8c4e1841eb30 324 return OW_ERROR_CRC;
fblanc 0:8c4e1841eb30 325 return OW_OK;
fblanc 0:8c4e1841eb30 326 }
fblanc 0:8c4e1841eb30 327 return OW_ERROR_BAD_ID;
fblanc 0:8c4e1841eb30 328 }
fblanc 0:8c4e1841eb30 329 /**
fblanc 0:8c4e1841eb30 330 * @brief configure canal ADC DS2450
fblanc 0:8c4e1841eb30 331 * @param [in] n num bus onewire
fblanc 0:8c4e1841eb30 332 * @param [in] id[] tableau d'identifiant OW
fblanc 0:8c4e1841eb30 333 * @param [in] channel
fblanc 0:8c4e1841eb30 334 * @param [in] conflsb configuration OE-A OC-A 0 0 RC3-A RC2-A RC1-A RC0-A
fblanc 0:8c4e1841eb30 335 * @param [in] confmsb configuration POR 0 AFH-A AFL-A AEH-A AEL-A 0 IR-A
fblanc 0:8c4e1841eb30 336 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:8c4e1841eb30 337 * @date 20/06/2011
fblanc 0:8c4e1841eb30 338 *
fblanc 0:8c4e1841eb30 339 */
fblanc 0:8c4e1841eb30 340 uint8_t DS2450_configure_channel_ADC(uint8_t n,uint8_t id[],uint8_t channel,uint8_t conflsb,uint8_t confmsb) {
fblanc 0:8c4e1841eb30 341 uint8_t i;
fblanc 0:8c4e1841eb30 342 uint8_t sp[7];
fblanc 0:8c4e1841eb30 343 if (id[0] == DS2450_ID) {
fblanc 0:8c4e1841eb30 344 if (ow_reset(n)) //reset OW
fblanc 0:8c4e1841eb30 345 return OW_SHORT_CIRCUIT;
fblanc 0:8c4e1841eb30 346 sp[0]=DS2450_WRITE_MEMORY; // command
fblanc 0:8c4e1841eb30 347 sp[1]=DS2450_PAGE1+channel; //adress page LSB
fblanc 0:8c4e1841eb30 348 sp[2]=0x00; //adress page MSB
fblanc 0:8c4e1841eb30 349 sp[3]=conflsb; //databyte
fblanc 0:8c4e1841eb30 350 ow_command(n,sp[0], &id[0]);
fblanc 0:8c4e1841eb30 351 ow_byte_wr(n,sp[1]);
fblanc 0:8c4e1841eb30 352 ow_byte_wr(n,sp[2]);
fblanc 0:8c4e1841eb30 353 ow_byte_wr(n,sp[3]);
fblanc 0:8c4e1841eb30 354 for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte
fblanc 0:8c4e1841eb30 355 sp[i]=ow_byte_rd(n);
fblanc 0:8c4e1841eb30 356 }
fblanc 0:8c4e1841eb30 357
fblanc 0:8c4e1841eb30 358 if (ctrl_crc16( &sp[0], 6 ) ) //CRC16 (command+adress page LSB+adress page MSB+databyte)
fblanc 0:8c4e1841eb30 359 return OW_ERROR_CRC;
fblanc 0:8c4e1841eb30 360 sp[3]=confmsb; //databyte
fblanc 0:8c4e1841eb30 361 ow_byte_wr(n,sp[3]);
fblanc 0:8c4e1841eb30 362 for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte
fblanc 0:8c4e1841eb30 363 sp[i]=ow_byte_rd(n);
fblanc 0:8c4e1841eb30 364 }
fblanc 0:8c4e1841eb30 365
fblanc 0:8c4e1841eb30 366 if (sp[3]!=sp[6] ) //control data
fblanc 0:8c4e1841eb30 367 return OW_ERROR_CRC;
fblanc 0:8c4e1841eb30 368 return OW_OK;
fblanc 0:8c4e1841eb30 369 }
fblanc 0:8c4e1841eb30 370 return OW_ERROR_BAD_ID;
fblanc 0:8c4e1841eb30 371 }
fblanc 0:8c4e1841eb30 372 //**********************************************************************************************************
fblanc 0:8c4e1841eb30 373 //* DS2450_configure_channel_ADC
fblanc 0:8c4e1841eb30 374 //**********************************************************************************************************
fblanc 0:8c4e1841eb30 375
fblanc 0:8c4e1841eb30 376 /**
fblanc 0:8c4e1841eb30 377 * @brief configure PAGE
fblanc 0:8c4e1841eb30 378 * @param [in] id[] tableau d'identifiant OW
fblanc 0:8c4e1841eb30 379 * @param [in] uint8_t adresse de la page a ecrire
fblanc 0:8c4e1841eb30 380 * @param [in] config_page tableau de 8 byte
fblanc 0:8c4e1841eb30 381 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:8c4e1841eb30 382 * @date 20/06/2011
fblanc 0:8c4e1841eb30 383 *
fblanc 0:8c4e1841eb30 384 */
fblanc 0:8c4e1841eb30 385 uint8_t DS2450_configure_page(uint8_t id[], uint8_t adresse,uint8_t configpage[]) {
fblanc 0:8c4e1841eb30 386 uint8_t i,j;
fblanc 0:8c4e1841eb30 387 uint8_t sp[7];
fblanc 0:8c4e1841eb30 388 if (id[0] == DS2450_ID) {
fblanc 0:8c4e1841eb30 389 if (ow_reset()) //reset OW
fblanc 0:8c4e1841eb30 390 return OW_SHORT_CIRCUIT;
fblanc 0:8c4e1841eb30 391 sp[0]=DS2450_WRITE_MEMORY; // command
fblanc 0:8c4e1841eb30 392 sp[1]=adresse; //adress page LSB
fblanc 0:8c4e1841eb30 393 sp[2]=0x00; //adress page MSB
fblanc 0:8c4e1841eb30 394 sp[3]=configpage[0]; //databyte
fblanc 0:8c4e1841eb30 395 ow_command(sp[0], &id[0]);
fblanc 0:8c4e1841eb30 396 ow_byte_wr(sp[1]);
fblanc 0:8c4e1841eb30 397 ow_byte_wr(sp[2]);
fblanc 0:8c4e1841eb30 398 ow_byte_wr(sp[3]);
fblanc 0:8c4e1841eb30 399 for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte
fblanc 0:8c4e1841eb30 400 sp[i]=ow_byte_rd();
fblanc 0:8c4e1841eb30 401 }
fblanc 0:8c4e1841eb30 402
fblanc 0:8c4e1841eb30 403 if (sp[3]!=sp[6] ) //control data
fblanc 0:8c4e1841eb30 404 return OW_ERROR_CRC;
fblanc 0:8c4e1841eb30 405
fblanc 0:8c4e1841eb30 406 for ( j=1 ; j< 7; j++ ) {
fblanc 0:8c4e1841eb30 407 sp[3]=configpage[j]; //databyte
fblanc 0:8c4e1841eb30 408 ow_byte_wr(sp[3]);
fblanc 0:8c4e1841eb30 409 for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte
fblanc 0:8c4e1841eb30 410 sp[i]=ow_byte_rd();
fblanc 0:8c4e1841eb30 411 }
fblanc 0:8c4e1841eb30 412 if (sp[3]!=sp[6] ) //control data
fblanc 0:8c4e1841eb30 413 return OW_ERROR_CRC;
fblanc 0:8c4e1841eb30 414
fblanc 0:8c4e1841eb30 415 }
fblanc 0:8c4e1841eb30 416 return OW_OK;
fblanc 0:8c4e1841eb30 417 }
fblanc 0:8c4e1841eb30 418 return OW_ERROR_BAD_ID;
fblanc 0:8c4e1841eb30 419 }
fblanc 0:8c4e1841eb30 420 /**
fblanc 0:8c4e1841eb30 421 * @brief configure PAGE
fblanc 0:8c4e1841eb30 422 * @param [in] n num bus onewire
fblanc 0:8c4e1841eb30 423 * @param [in] id[] tableau d'identifiant OW
fblanc 0:8c4e1841eb30 424 * @param [in] uint8_t adresse de la page a ecrire
fblanc 0:8c4e1841eb30 425 * @param [in] config_page tableau de 8 byte
fblanc 0:8c4e1841eb30 426 * @return OW_OK si erreur retourne OW_ERROR_CRC
fblanc 0:8c4e1841eb30 427 * @date 07/09/2011
fblanc 0:8c4e1841eb30 428 *
fblanc 0:8c4e1841eb30 429 */
fblanc 0:8c4e1841eb30 430 uint8_t DS2450_configure_page(uint8_t n,uint8_t id[], uint8_t adresse,uint8_t configpage[]) {
fblanc 0:8c4e1841eb30 431 uint8_t i,j;
fblanc 0:8c4e1841eb30 432 uint8_t sp[7];
fblanc 0:8c4e1841eb30 433 if (id[0] == DS2450_ID) {
fblanc 0:8c4e1841eb30 434 if (ow_reset(n)) //reset OW
fblanc 0:8c4e1841eb30 435 return OW_SHORT_CIRCUIT;
fblanc 0:8c4e1841eb30 436 sp[0]=DS2450_WRITE_MEMORY; // command
fblanc 0:8c4e1841eb30 437 sp[1]=adresse; //adress page LSB
fblanc 0:8c4e1841eb30 438 sp[2]=0x00; //adress page MSB
fblanc 0:8c4e1841eb30 439 sp[3]=configpage[0]; //databyte
fblanc 0:8c4e1841eb30 440 ow_command(n,sp[0], &id[0]);
fblanc 0:8c4e1841eb30 441 ow_byte_wr(n,sp[1]);
fblanc 0:8c4e1841eb30 442 ow_byte_wr(n,sp[2]);
fblanc 0:8c4e1841eb30 443 ow_byte_wr(n,sp[3]);
fblanc 0:8c4e1841eb30 444 for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte
fblanc 0:8c4e1841eb30 445 sp[i]=ow_byte_rd(n);
fblanc 0:8c4e1841eb30 446 }
fblanc 0:8c4e1841eb30 447
fblanc 0:8c4e1841eb30 448 if (sp[3]!=sp[6] ) //control data
fblanc 0:8c4e1841eb30 449 return OW_ERROR_CRC;
fblanc 0:8c4e1841eb30 450
fblanc 0:8c4e1841eb30 451 for ( j=1 ; j< 7; j++ ) {
fblanc 0:8c4e1841eb30 452 sp[3]=configpage[j]; //databyte
fblanc 0:8c4e1841eb30 453 ow_byte_wr(n,sp[3]);
fblanc 0:8c4e1841eb30 454 for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte
fblanc 0:8c4e1841eb30 455 sp[i]=ow_byte_rd(n);
fblanc 0:8c4e1841eb30 456 }
fblanc 0:8c4e1841eb30 457 if (sp[3]!=sp[6] ) //control data
fblanc 0:8c4e1841eb30 458 return OW_ERROR_CRC;
fblanc 0:8c4e1841eb30 459
fblanc 0:8c4e1841eb30 460 }
fblanc 0:8c4e1841eb30 461 return OW_OK;
fblanc 0:8c4e1841eb30 462 }
fblanc 0:8c4e1841eb30 463 return OW_ERROR_BAD_ID;
fblanc 0:8c4e1841eb30 464 }