frederic blanc
/
MAX31850_HelloWorld
test MAX31850
Revision 4:031e71e61e80, committed 2016-09-28
- Comitter:
- fblanc
- Date:
- Wed Sep 28 06:46:10 2016 +0000
- Parent:
- 3:b4277f7c538e
- Commit message:
- test
Changed in this revision
diff -r b4277f7c538e -r 031e71e61e80 OneWire.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OneWire.lib Wed Sep 28 06:46:10 2016 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/fblanc/code/OneWireFB/#9acbbb021a43
diff -r b4277f7c538e -r 031e71e61e80 OneWire/DS18X20.cpp --- a/OneWire/DS18X20.cpp Mon Jun 02 13:17:18 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,350 +0,0 @@ -/** -* @file DS18x20.c -* @brief library of DS18X20 1-Wire digital thermometer (http://www.maxim-ic.com/datasheet/index.mvp/id/2812) -* @author Maciej Rajtar (Published 10 May 2010 www.mbed.org) -* @author Frederic BLANC (Published 01/03/2012 www.mbed.org) -*/ -#include "mbed.h" -#include "onewire.h" -#include "DS18X20.h" -#include "crc8.h" -#include "utils.h" -//********************************************************************************************************** -//* DS18X20_show_temp -//********************************************************************************************************** - -/** -* @brief DS18X20_show_temp -* @param [in] id[] = rom_code -* @param [in] n number of id[n] -* @param [out] text temp in degre celsius - -* @date 20/06/2011 -*/ -void DS18X20_show_temp(uint8_t subzero, uint8_t cel, uint8_t cel_frac_bits,char *text) { - uint16_t decicelsius; - char s[10]; - float temperature; - sprintf(text,""); - sprintf(s,"%s", (subzero)?"-":""); - strcat(text,s); - decicelsius = DS18X20_temp_to_decicel(subzero, cel, cel_frac_bits); - temperature = decicelsius; - temperature = temperature/10; - sprintf(s,"%4.1f", temperature); - strcat(text,s); - -} -/** -* @brief DS18X20_show_temp -* @param [in] id[] = rom_code -* @param [in] n number of id[n] -* @return temp in degre celsius - -* @date 21/10/2011 -*/ -float DS18X20_temp(uint8_t subzero, uint8_t cel, uint8_t cel_frac_bits) { - return ((subzero)?-1:1)*DS18X20_temp_to_decicel(subzero, cel, cel_frac_bits)/10; -} -//********************************************************************************************************** -//* DS18X20_get_power_status -//********************************************************************************************************** - -/** -* @brief get power status of DS18x20 -* @param [in] id[] = rom_code -* @return DS18X20_POWER_EXTERN or DS18X20_POWER_PARASITE -* @date 20/06/2011 -*/ -uint8_t DS18X20_get_power_status(uint8_t id[]) { - uint8_t pstat; - ow_reset(); - ow_command(DS18X20_READ_POWER_SUPPLY, id); - pstat=ow_bit_io(1); // pstat 0=is parasite/ !=0 ext. powered - ow_reset(); - return (pstat) ? DS18X20_POWER_EXTERN:DS18X20_POWER_PARASITE; -} - -/** -* @brief get power status of DS18x20 -* @param [in] n num bus onewire -* @param [in] id[] = rom_code -* @return DS18X20_POWER_EXTERN or DS18X20_POWER_PARASITE -* @date 6/09/2011 -*/ -uint8_t DS18X20_get_power_status(uint8_t n,uint8_t id[]) { - uint8_t pstat; - ow_reset(n); - ow_command(n,DS18X20_READ_POWER_SUPPLY, id); - pstat=ow_bit_io(n,1); // pstat 0=is parasite/ !=0 ext. powered - ow_reset(n); - return (pstat) ? DS18X20_POWER_EXTERN:DS18X20_POWER_PARASITE; -} -//********************************************************************************************************** -//* DS18X20_start_meas -//********************************************************************************************************** -/** -* @brief reads temperature (scratchpad) of sensor with rom-code id - output: subzero==1 if temp.<0, cel: full celsius, mcel: frac - in millicelsius*0.1 - i.e.: subzero=1, cel=18, millicel=5000 = -18,5000�C -* @param [in] n num bus onewire -* @param [in] id[] = rom_code -* @param [out] temperature -* @return DS18X20_OK or DS18X20_ERROR_CRC -* @date 07/12/2012 -*/ -uint8_t DS18X20_read_meas(uint8_t n,uint8_t id[], float* temperature) { - uint8_t i; - uint8_t sp[DS18X20_SP_SIZE]; - uint8_t subzero; - uint8_t cel; - uint8_t cel_frac_bits; - - ow_reset(n); - ow_command(n,DS18X20_READ, id); - for ( i=0 ; i< DS18X20_SP_SIZE; i++ ) - sp[i]=ow_byte_rd(n); - if ( crc8( &sp[0], DS18X20_SP_SIZE ) ){ - if ((sp[DS18X20_SP_SIZE-1]==0xFF) && (sp[DS18X20_SP_SIZE-2]==0xFF)) - return OW_ERROR; // bus error - return DS18X20_ERROR_CRC; // data error - } - - DS18X20_meas_to_cel(id[0], sp, &subzero, &cel, &cel_frac_bits); - *temperature = cel_frac_bits*.0625; - *temperature += cel; - if (subzero) - *temperature *= -1; - return DS18X20_OK; -} -/** -* @brief start measurement (CONVERT_T) for all sensors if input id==NULL - or for single sensor. then id is the rom-code -* @param [in] with_power_extern -* @param [in] rom_code -* @return DS18X20_OK or DS18X20_START_FAIL -* @date 20/06/2011 -*/ -uint8_t DS18X20_start_meas( uint8_t with_power_extern, uint8_t id[]) { - ow_reset(); //** - if ( ow_test_pin() ) { // only send if bus is "idle" = high - ow_command( DS18X20_CONVERT_T, id ); - if (with_power_extern != DS18X20_POWER_EXTERN) - ow_parasite_enable(); - return DS18X20_OK; - } - return DS18X20_START_FAIL; - -} -/** -* @brief start measurement (CONVERT_T) for all sensors if input id==NULL - or for single sensor. then id is the rom-code -* @param [in] n num bus onewire -* @param [in] with_power_extern -* @param [in] rom_code -* @return DS18X20_OK or DS18X20_START_FAIL -* @date 06/09/2011 -*/ -uint8_t DS18X20_start_meas(uint8_t n, uint8_t with_power_extern, uint8_t id[]) { - ow_reset(n); //** - if ( ow_test_pin(n) ) { // only send if bus is "idle" = high - ow_command(n, DS18X20_CONVERT_T, id ); - if (with_power_extern != DS18X20_POWER_EXTERN) - ow_parasite_enable(n); - return DS18X20_OK; - } - return DS18X20_START_FAIL; - -} -//********************************************************************************************************** -//* DS18X20_read_meas -//********************************************************************************************************** - -/** -* @brief reads temperature (scratchpad) of sensor with rom-code id - output: subzero==1 if temp.<0, cel: full celsius, mcel: frac - in millicelsius*0.1 - i.e.: subzero=1, cel=18, millicel=5000 = -18,5000�C -* @param [in] id[] = rom_code -* @param [out] subzero -* @param [out] cel -* @param [out] cel_frac_bits -* @return DS18X20_OK or DS18X20_ERROR_CRC -* @date 20/06/2011 -*/ -uint8_t DS18X20_read_meas(uint8_t id[], uint8_t *subzero, - uint8_t *cel, uint8_t *cel_frac_bits) { - uint8_t i; - uint8_t sp[DS18X20_SP_SIZE]; - - ow_reset(); - ow_command(DS18X20_READ, id); - for ( i=0 ; i< DS18X20_SP_SIZE; i++ ) - sp[i]=ow_byte_rd(); - if ( crc8( &sp[0], DS18X20_SP_SIZE ) ){ - if ((sp[DS18X20_SP_SIZE-1]==0xFF) && (sp[DS18X20_SP_SIZE-2]==0xFF)) - return OW_ERROR; // bus error - return DS18X20_ERROR_CRC; // data error - } - - DS18X20_meas_to_cel(id[0], sp, subzero, cel, cel_frac_bits); - return DS18X20_OK; -} -/** -* @brief reads temperature (scratchpad) of sensor with rom-code id - output: subzero==1 if temp.<0, cel: full celsius, mcel: frac - in millicelsius*0.1 - i.e.: subzero=1, cel=18, millicel=5000 = -18,5000�C -* @param [in] n num bus onewire -* @param [in] id[] = rom_code -* @param [out] subzero -* @param [out] cel -* @param [out] cel_frac_bits -* @return DS18X20_OK or DS18X20_ERROR_CRC -* @date 06/09/2011 -*/ -uint8_t DS18X20_read_meas(uint8_t n,uint8_t id[], uint8_t *subzero, - uint8_t *cel, uint8_t *cel_frac_bits) { - uint8_t i; - uint8_t sp[DS18X20_SP_SIZE]; - - ow_reset(n); - ow_command(n,DS18X20_READ, id); - for ( i=0 ; i< DS18X20_SP_SIZE; i++ ) - sp[i]=ow_byte_rd(n); - if ( crc8( &sp[0], DS18X20_SP_SIZE ) ){ - if ((sp[DS18X20_SP_SIZE-1]==0xFF) && (sp[DS18X20_SP_SIZE-2]==0xFF)) - return OW_ERROR; // bus error - return DS18X20_ERROR_CRC; // data error - } - - DS18X20_meas_to_cel(id[0], sp, subzero, cel, cel_frac_bits); - return DS18X20_OK; -} -/** -* @brief convert raw value from DS18x20 to Celsius - input is: - - familycode fc (0x10/0x28 see header) - - scratchpad-buffer - output is: - - cel full celsius - - fractions of celsius in millicelsius*(10^-1)/625 (the 4 LS-Bits) - - subzero =0 positiv / 1 negativ - always returns DS18X20_OK - TODO invalid-values detection (but should be covered by CRC) -* @param [in] fc -* @param [in] sp -* @param [out] subzero -* @param [out] cel -* @param [out] cel_frac_bits -* @return DS18X20_OK -* @date 20/06/2011 -*/ -uint8_t DS18X20_meas_to_cel( uint8_t fc, uint8_t *sp, - uint8_t* subzero, uint8_t* cel, uint8_t* cel_frac_bits) { - uint16_t meas; - uint8_t i; - - meas = sp[0]; // LSB - meas |= ((uint16_t)sp[1])<<8; // MSB - //meas = 0xff5e; meas = 0xfe6f; - - // only work on 12bit-base - if ( fc == DS18S20_ID ) { // 9 -> 12 bit if 18S20 - /* Extended measurements for DS18S20 contributed by Carsten Foss */ - meas &= (uint16_t) 0xfffe; // Discard LSB , needed for later extended precicion calc - meas <<= 3; // Convert to 12-bit , now degrees are in 1/16 degrees units - meas += (16 - sp[6]) - 4; // Add the compensation , and remember to subtract 0.25 degree (4/16) - } - - // check for negative - if ( meas & 0x8000 ) { - *subzero=1; // mark negative - meas ^= 0xffff; // convert to positive => (twos complement)++ - meas++; - } else *subzero=0; - - // clear undefined bits for B != 12bit - if ( fc == DS18B20_ID ) { // check resolution 18B20 - i = sp[DS18B20_CONF_REG]; - if ( (i & DS18B20_12_BIT) == DS18B20_12_BIT ) ; - else if ( (i & DS18B20_11_BIT) == DS18B20_11_BIT ) - meas &= ~(DS18B20_11_BIT_UNDF); - else if ( (i & DS18B20_10_BIT) == DS18B20_10_BIT ) - meas &= ~(DS18B20_10_BIT_UNDF); - else { // if ( (i & DS18B20_9_BIT) == DS18B20_9_BIT ) { - meas &= ~(DS18B20_9_BIT_UNDF); - } - } - - *cel = (uint8_t)(meas >> 4); - *cel_frac_bits = (uint8_t)(meas & 0x000F); - - return DS18X20_OK; -} - -/** -* @brief converts to decicelsius - input is ouput from meas_to_cel - i.e.: sz=0, c=28, frac=15 returns 289 (=28.9�C) -0 0 0 -1 625 625 1 -2 1250 250 -3 1875 875 3 -4 2500 500 4 -5 3125 125 -6 3750 750 6 -7 4375 375 -8 5000 0 -9 5625 625 9 -10 6250 250 -11 6875 875 11 -12 7500 500 12 -13 8125 125 -14 8750 750 14 -15 9375 375 -* @param [in] subzero -* @param [in] cel -* @param [in] cel_frac_bits -* @return absolute value of temperatur in decicelsius -* @date 20/06/2011 -*/ -uint16_t DS18X20_temp_to_decicel(uint8_t subzero, uint8_t cel, - uint8_t cel_frac_bits) { - uint16_t h; - uint8_t i; - uint8_t need_rounding[] = { 1, 3, 4, 6, 9, 11, 12, 14 }; - - h = cel_frac_bits*DS18X20_FRACCONV/1000; - h += cel*10; - if (!subzero) { - for (i=0; i<sizeof(need_rounding); i++) { - if ( cel_frac_bits == need_rounding[i] ) { - h++; - break; - } - } - } - return h; -} -/** -* @brief compare temperature values (full celsius only) -* @param [in] subzero1 -* @param [in] cel1 -* @param [in] subzero2 -* @param [in] cel2 -* @return -1 if param-pair1 < param-pair2 - 0 if == - 1 if > -* @date 20/06/2011 -*/ -int8_t DS18X20_temp_cmp(uint8_t subzero1, uint16_t cel1, - uint8_t subzero2, uint16_t cel2) { - int16_t t1 = (subzero1) ? (cel1*(-1)) : (cel1); - int16_t t2 = (subzero2) ? (cel2*(-1)) : (cel2); - - if (t1<t2) return -1; - if (t1>t2) return 1; - return 0; -} \ No newline at end of file
diff -r b4277f7c538e -r 031e71e61e80 OneWire/DS18X20.h --- a/OneWire/DS18X20.h Mon Jun 02 13:17:18 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -/* DS18X20 specific values (see datasheet www.maxim-ic.com/datasheet/index.mvp/id/2812) */ -#ifndef _DS18X20_ -#define _DS18X20_ -#define DS18S20_ID 0x10 -#define DS18B20_ID 0x28 - -#define DS18X20_POWER_PARASITE 0x00 -#define DS18X20_POWER_EXTERN 0x01 -#define DS18X20_CONVERT_T 0x44 -#define DS18X20_READ 0xBE -#define DS18X20_WRITE 0x4E -#define DS18X20_EE_WRITE 0x48 -#define DS18X20_EE_RECALL 0xB8 -#define DS18X20_READ_POWER_SUPPLY 0xB4 - -#define DS18X20_OK 0x00 -#define DS18X20_ERROR 0x01 -#define DS18X20_START_FAIL 0x02 -#define DS18X20_ERROR_CRC 0x03 - -#define DS18B20_CONF_REG 4 -#define DS18B20_9_BIT 0 -#define DS18B20_10_BIT (1<<5) -#define DS18B20_11_BIT (1<<6) -#define DS18B20_12_BIT ((1<<6)|(1<<5)) - -// indefined bits in LSB if 18B20 != 12bit -#define DS18B20_9_BIT_UNDF ((1<<0)|(1<<1)|(1<<2)) -#define DS18B20_10_BIT_UNDF ((1<<0)|(1<<1)) -#define DS18B20_11_BIT_UNDF ((1<<0)) -#define DS18B20_12_BIT_UNDF 0 - -// conversion times in ms -#define DS18B20_TCONV_12BIT 750 -#define DS18B20_TCONV_11BIT DS18B20_TCONV_12_BIT/2 -#define DS18B20_TCONV_10BIT DS18B20_TCONV_12_BIT/4 -#define DS18B20_TCONV_9BIT DS18B20_TCONV_12_BIT/8 -#define DS18S20_TCONV DS18B20_TCONV_12_BIT - -// constant to convert the fraction bits to cel*(10^-4) -#define DS18X20_FRACCONV 625 - -#define DS18X20_SP_SIZE 9 - -// DS18X20 EEPROM-Support -#define DS18X20_WRITE_SCRATCHPAD 0x4E -#define DS18X20_COPY_SCRATCHPAD 0x48 -#define DS18X20_RECALL_E2 0xB8 -#define DS18X20_COPYSP_DELAY 10 /* ms */ -#define DS18X20_TH_REG 2 -#define DS18X20_TL_REG 3 - -void DS18X20_show_temp(uint8_t subzero, uint8_t cel, uint8_t cel_frac_bits,char *text); -float DS18X20_temp(uint8_t subzero, uint8_t cel, uint8_t cel_frac_bits); -uint8_t DS18X20_get_power_status(uint8_t id[]); -uint8_t DS18X20_get_power_status(uint8_t n,uint8_t id[]); -uint8_t DS18X20_start_meas( uint8_t with_external, uint8_t id[]); -uint8_t DS18X20_start_meas(uint8_t n, uint8_t with_external, uint8_t id[]); -uint8_t DS18X20_read_meas(uint8_t id[], uint8_t *subzero, uint8_t *cel, uint8_t *cel_frac_bits); -uint8_t DS18X20_read_meas(uint8_t n, uint8_t id[], uint8_t *subzero, uint8_t *cel, uint8_t *cel_frac_bits); -uint8_t DS18X20_read_meas_single(uint8_t familycode, uint8_t *subzero, uint8_t *cel, uint8_t *cel_frac_bits); -uint8_t DS18X20_meas_to_cel( uint8_t fc, uint8_t *sp, uint8_t* subzero, uint8_t* cel, uint8_t* cel_frac_bits); -uint8_t DS18X20_read_meas(uint8_t n,uint8_t id[], float* temperature); -uint16_t DS18X20_temp_to_decicel(uint8_t subzero, uint8_t cel, uint8_t cel_frac_bits); -int8_t DS18X20_temp_cmp(uint8_t subzero1, uint16_t cel1, uint8_t subzero2, uint16_t cel2); -#endif \ No newline at end of file
diff -r b4277f7c538e -r 031e71e61e80 OneWire/DS2450.cpp --- a/OneWire/DS2450.cpp Mon Jun 02 13:17:18 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,464 +0,0 @@ -/** -* @file DS2450.c -* @brief library of DS2450 1-Wire Quad A/D Converter (http://www.maxim-ic.com/datasheet/index.mvp/id/2921) -* @author Frederic BLANC (Published 01/03/2012 www.mbed.org) -*/ -#include "mbed.h" -#include "onewire.h" -#include "DS2450.h" -#include "crc8.h" -#include "crc16.h" -#include "utils.h" -//********************************************************************************************************** -//* DS2450_read_ADC -//********************************************************************************************************** - -/** - * @brief lancement lecture DS2450 ADC - * @param [in] id[] tableau d'identifiant OW - * @param [out] adc[] tableau des valeurs des adc - * @return OW_OK si erreur retourne OW_ERROR_CRC - * @date 20/06/2011 - * - */ -uint8_t DS2450_read_ADC(uint8_t id[], uint16_t adc[]) { - uint8_t i,j; - uint8_t error; - uint8_t sp[DS2450_SP_SIZE]; - //waiting for convertion time ( nbchannel x resolution x 80�s +160�s) - - error=DS2450_read_page(&id[0],DS2450_PAGE0,&sp[0]); //read data - if (error) - return error; - j=0; - for (i=0;i<8;i+=2) - adc[j++]=uint8_to_uint16(sp[i+3],sp[i+4]); //sp[i+3] LSB ,sp[i+4] MSB - return OW_OK; -} - - -/** - * @brief lancement lecture DS2450 ADC - * @param [in] n num bus onewire - * @param [in] id[] tableau d'identifiant OW - * @param [out] adc[] tableau des valeurs des adc - * @return OW_OK si erreur retourne OW_ERROR_CRC - * @date 07/09/2011 - * - */ -uint8_t DS2450_read_ADC(uint8_t n,uint8_t id[], uint16_t adc[]) { - uint8_t i,j; - uint8_t error; - uint8_t sp[DS2450_SP_SIZE]; - //waiting for convertion time ( nbchannel x resolution x 80�s +160�s) - - error=DS2450_read_page(n,&id[0],DS2450_PAGE0,&sp[0]); //read data - if (error) - return error; - j=0; - for (i=0;i<8;i+=2) - adc[j++]=uint8_to_uint16(sp[i+3],sp[i+4]); //sp[i+3] LSB ,sp[i+4] MSB - return OW_OK; -} -//********************************************************************************************************** -//* DS2450_start_and_read_ADC -//********************************************************************************************************** - -/** - * @brief lancement & lecture DS2450 ADC - * @param [in] id[] tableau d'identifiant OW - * @param [out] adc[] tableau des valeurs des adc - * @return OW_OK si erreur retourne OW_ERROR_CRC - * @date 20/06/2011 - * - */ -uint8_t DS2450_start_and_read_ADC(uint8_t id[], uint16_t adc[]) { - uint8_t i,j; - uint8_t error; - uint8_t sp[DS2450_SP_SIZE]; - - error=DS2450_convert(&id[0],0x0F,0x00); //start convert - if (error) - return error; - - wait_ms(15); //waiting for convertion time ( nbchannel x resolution x 80�s +160�s) - - error=DS2450_read_page(&id[0],DS2450_PAGE0,&sp[0]); //read data - if (error) - return error; - - j=0; - for (i=0;i<8;i+=2) - adc[j++]=uint8_to_uint16(sp[i+3],sp[i+4]); //sp[i+3] LSB ,sp[i+4] MSB - return OW_OK; -} - -/** - * @brief lancement & lecture DS2450 ADC - * @param [in] n num bus onewire - * @param [in] id[] tableau d'identifiant OW - * @param [out] adc[] tableau des valeurs des adc - * @return OW_OK si erreur retourne OW_ERROR_CRC - * @date 07/09/2011 - * - */ -uint8_t DS2450_start_and_read_ADC(uint8_t n,uint8_t id[], uint16_t adc[]) { - uint8_t i,j; - uint8_t error; - uint8_t sp[DS2450_SP_SIZE]; - - error=DS2450_convert(n,&id[0],0x0F,0x00); //start convert - if (error) - return error; - - wait_ms(15); //waiting for convertion time ( nbchannel x resolution x 80�s +160�s) - - error=DS2450_read_page(n,&id[0],DS2450_PAGE0,&sp[0]); //read data - if (error) - return error; - - j=0; - for (i=0;i<8;i+=2) - adc[j++]=uint8_to_uint16(sp[i+3],sp[i+4]); //sp[i+3] LSB ,sp[i+4] MSB - return OW_OK; -} - -//********************************************************************************************************** -//* DS2450_read_page -//********************************************************************************************************** - -/** - * @brief lancement lecture page DS2450 ADC - * @param [in] id[] tableau d'identifiant OW - * @param [in] adresse de la page a lire - * @param [out] uint16_t sp tableau des valeurs de la page - * @return OW_OK si erreur retourne OW_ERROR_CRC - * @date 20/06/2011 - * - */ -uint8_t DS2450_read_page(uint8_t id[], uint8_t adresse, - uint8_t *sp) { - uint8_t i; - if (id[0] == DS2450_ID) { - if (ow_reset()) //reset OW - return OW_SHORT_CIRCUIT; - sp[0]=DS2450_READ_MEMORY; // command - sp[1]=adresse; //adress page LSB - sp[2]=0; //adress page MSB - ow_command(sp[0], &id[0]); - ow_byte_wr(sp[1]); - ow_byte_wr(sp[2]); - - for ( i=3 ; i< DS2450_SP_SIZE; i++ ) { //read 8xdata + CRC16 - sp[i]=ow_byte_rd(); - } - - if (ctrl_crc16( &sp[0], DS2450_SP_SIZE ) ) { //CRC16 (command+adress page LSB+adress page MSB+8xdata) - wait_ms(100); //wait 100ms if error - if ((sp[DS2450_SP_SIZE-1]==0xFF) && (sp[DS2450_SP_SIZE-2]==0xFF)) - return OW_ERROR; // bus error - if ((sp[DS2450_SP_SIZE-1]==0x00) && (sp[DS2450_SP_SIZE-2]==0x00)) - return OW_BUSY; - - return OW_ERROR_CRC; // data error - } - return OW_OK; - } - return OW_ERROR_BAD_ID; -} -/** - * @brief lancement lecture page DS2450 ADC - * @param [in] n num bus onewire - * @param [in] id[] tableau d'identifiant OW - * @param [in] adresse de la page a lire - * @param [out] sp tableau des valeurs de la page - * @return OW_OK si erreur retourne OW_ERROR_CRC - * @date 07/09/2011 - * - */ -uint8_t DS2450_read_page(uint8_t n,uint8_t id[], uint8_t adresse, - uint8_t *sp) { - uint8_t i; - if (id[0] == DS2450_ID) { - if (ow_reset(n)) //reset OW - return OW_SHORT_CIRCUIT; - sp[0]=DS2450_READ_MEMORY; // command - sp[1]=adresse; //adress page LSB - sp[2]=0; //adress page MSB - ow_command(n,sp[0], &id[0]); - ow_byte_wr(n,sp[1]); - ow_byte_wr(n,sp[2]); - - for ( i=3 ; i< DS2450_SP_SIZE; i++ ) { //read 8xdata + CRC16 - sp[i]=ow_byte_rd(n); - } - - if (ctrl_crc16( &sp[0], DS2450_SP_SIZE ) ) { //CRC16 (command+adress page LSB+adress page MSB+8xdata) - wait_ms(100); //wait 100ms if error - if ((sp[DS2450_SP_SIZE-1]==0xFF) && (sp[DS2450_SP_SIZE-2]==0xFF)) - return OW_ERROR; // bus error - if ((sp[DS2450_SP_SIZE-1]==0x00) && (sp[DS2450_SP_SIZE-2]==0x00)) - return OW_BUSY; - - return OW_ERROR_CRC; // data error - } - return OW_OK; - } - return OW_ERROR_BAD_ID; -} -//********************************************************************************************************** -//* DS2450_convert -//********************************************************************************************************** - -/** - * @brief lancement convertion DS2450 ADC - * @param [in] uint8_t id[] tableau d'identifiant OW - * @param [in] uint8_t input_select_mask - * @param [in] uint8_t read_out_control - * @return OW_OK si erreur retourne OW_ERROR_CRC - * @date 20/06/2011 - * - */ -uint8_t DS2450_convert(uint8_t id[], uint8_t input_select_mask,uint8_t read_out_control) { - uint8_t i; - uint8_t sp[5]; - if (id[0] == DS2450_ID) { - if (ow_reset()) //reset OW - return OW_SHORT_CIRCUIT; - sp[0]=DS2450_CONVERT; // command - sp[1]=input_select_mask; //mask - sp[2]=read_out_control; //control - ow_command(sp[0], &id[0]); - ow_byte_wr(sp[1]); - ow_byte_wr(sp[2]); - for ( i=3 ; i< 5; i++ ) { // read CRC16 - sp[i]=ow_byte_rd(); - } - - if (ctrl_crc16( &sp[0], 5 ) ) { //CRC16 (command+mask LSB+control) - if ((sp[3]==0xFF) && (sp[3]==0xFF)) - return OW_ERROR; - return OW_ERROR_CRC; - } - return OW_OK; - } - return OW_ERROR_BAD_ID; -} -/** - * @brief lancement convertion DS2450 ADC - * @param [in] n num bus onewire - * @param [in] uint8_t id[] tableau d'identifiant OW - * @param [in] uint8_t input_select_mask - * @param [in] uint8_t read_out_control - * @return OW_OK si erreur retourne OW_ERROR_CRC - * @date 07/09/2011 - * - */ -uint8_t DS2450_convert(uint8_t n,uint8_t id[], uint8_t input_select_mask,uint8_t read_out_control) { - uint8_t i; - uint8_t sp[5]; - if (id[0] == DS2450_ID) { - if (ow_reset(n)) //reset OW - return OW_SHORT_CIRCUIT; - sp[0]=DS2450_CONVERT; // command - sp[1]=input_select_mask; //mask - sp[2]=read_out_control; //control - ow_command(n,sp[0], &id[0]); - ow_byte_wr(n,sp[1]); - ow_byte_wr(n,sp[2]); - for ( i=3 ; i< 5; i++ ) { // read CRC16 - sp[i]=ow_byte_rd(n); - } - - if (ctrl_crc16( &sp[0], 5 ) ) { //CRC16 (command+mask LSB+control) - if ((sp[3]==0xFF) && (sp[3]==0xFF)) - return OW_ERROR; - return OW_ERROR_CRC; - } - return OW_OK; - } - return OW_ERROR_BAD_ID; -} - -//********************************************************************************************************** -//* DS2450_configure_channel_ADC -//********************************************************************************************************** - -/** - * @brief configure canal ADC DS2450 - * @param [in] id[] tableau d'identifiant OW - * @param [in] channel - * @param [in] conflsb configuration OE-A OC-A 0 0 RC3-A RC2-A RC1-A RC0-A - * @param [in] confmsb configuration POR 0 AFH-A AFL-A AEH-A AEL-A 0 IR-A - * @return OW_OK si erreur retourne OW_ERROR_CRC - * @date 20/06/2011 - * - */ -uint8_t DS2450_configure_channel_ADC(uint8_t id[],uint8_t channel,uint8_t conflsb,uint8_t confmsb) { - uint8_t i; - uint8_t sp[7]; - if (id[0] == DS2450_ID) { - if (ow_reset()) //reset OW - return OW_SHORT_CIRCUIT; - sp[0]=DS2450_WRITE_MEMORY; // command - sp[1]=DS2450_PAGE1+channel; //adress page LSB - sp[2]=0x00; //adress page MSB - sp[3]=conflsb; //databyte - ow_command(sp[0], &id[0]); - ow_byte_wr(sp[1]); - ow_byte_wr(sp[2]); - ow_byte_wr(sp[3]); - for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte - sp[i]=ow_byte_rd(); - } - - if (ctrl_crc16( &sp[0], 6 ) ) //CRC16 (command+adress page LSB+adress page MSB+databyte) - return OW_ERROR_CRC; - sp[3]=confmsb; //databyte - ow_byte_wr(sp[3]); - for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte - sp[i]=ow_byte_rd(); - } - - if (sp[3]!=sp[6] ) //control data - return OW_ERROR_CRC; - return OW_OK; - } - return OW_ERROR_BAD_ID; -} -/** - * @brief configure canal ADC DS2450 - * @param [in] n num bus onewire - * @param [in] id[] tableau d'identifiant OW - * @param [in] channel - * @param [in] conflsb configuration OE-A OC-A 0 0 RC3-A RC2-A RC1-A RC0-A - * @param [in] confmsb configuration POR 0 AFH-A AFL-A AEH-A AEL-A 0 IR-A - * @return OW_OK si erreur retourne OW_ERROR_CRC - * @date 20/06/2011 - * - */ -uint8_t DS2450_configure_channel_ADC(uint8_t n,uint8_t id[],uint8_t channel,uint8_t conflsb,uint8_t confmsb) { - uint8_t i; - uint8_t sp[7]; - if (id[0] == DS2450_ID) { - if (ow_reset(n)) //reset OW - return OW_SHORT_CIRCUIT; - sp[0]=DS2450_WRITE_MEMORY; // command - sp[1]=DS2450_PAGE1+channel; //adress page LSB - sp[2]=0x00; //adress page MSB - sp[3]=conflsb; //databyte - ow_command(n,sp[0], &id[0]); - ow_byte_wr(n,sp[1]); - ow_byte_wr(n,sp[2]); - ow_byte_wr(n,sp[3]); - for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte - sp[i]=ow_byte_rd(n); - } - - if (ctrl_crc16( &sp[0], 6 ) ) //CRC16 (command+adress page LSB+adress page MSB+databyte) - return OW_ERROR_CRC; - sp[3]=confmsb; //databyte - ow_byte_wr(n,sp[3]); - for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte - sp[i]=ow_byte_rd(n); - } - - if (sp[3]!=sp[6] ) //control data - return OW_ERROR_CRC; - return OW_OK; - } - return OW_ERROR_BAD_ID; -} -//********************************************************************************************************** -//* DS2450_configure_channel_ADC -//********************************************************************************************************** - -/** - * @brief configure PAGE - * @param [in] id[] tableau d'identifiant OW - * @param [in] uint8_t adresse de la page a ecrire - * @param [in] config_page tableau de 8 byte - * @return OW_OK si erreur retourne OW_ERROR_CRC - * @date 20/06/2011 - * - */ -uint8_t DS2450_configure_page(uint8_t id[], uint8_t adresse,uint8_t configpage[]) { - uint8_t i,j; - uint8_t sp[7]; - if (id[0] == DS2450_ID) { - if (ow_reset()) //reset OW - return OW_SHORT_CIRCUIT; - sp[0]=DS2450_WRITE_MEMORY; // command - sp[1]=adresse; //adress page LSB - sp[2]=0x00; //adress page MSB - sp[3]=configpage[0]; //databyte - ow_command(sp[0], &id[0]); - ow_byte_wr(sp[1]); - ow_byte_wr(sp[2]); - ow_byte_wr(sp[3]); - for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte - sp[i]=ow_byte_rd(); - } - - if (sp[3]!=sp[6] ) //control data - return OW_ERROR_CRC; - - for ( j=1 ; j< 7; j++ ) { - sp[3]=configpage[j]; //databyte - ow_byte_wr(sp[3]); - for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte - sp[i]=ow_byte_rd(); - } - if (sp[3]!=sp[6] ) //control data - return OW_ERROR_CRC; - - } - return OW_OK; - } - return OW_ERROR_BAD_ID; -} -/** - * @brief configure PAGE - * @param [in] n num bus onewire - * @param [in] id[] tableau d'identifiant OW - * @param [in] uint8_t adresse de la page a ecrire - * @param [in] config_page tableau de 8 byte - * @return OW_OK si erreur retourne OW_ERROR_CRC - * @date 07/09/2011 - * - */ -uint8_t DS2450_configure_page(uint8_t n,uint8_t id[], uint8_t adresse,uint8_t configpage[]) { - uint8_t i,j; - uint8_t sp[7]; - if (id[0] == DS2450_ID) { - if (ow_reset(n)) //reset OW - return OW_SHORT_CIRCUIT; - sp[0]=DS2450_WRITE_MEMORY; // command - sp[1]=adresse; //adress page LSB - sp[2]=0x00; //adress page MSB - sp[3]=configpage[0]; //databyte - ow_command(n,sp[0], &id[0]); - ow_byte_wr(n,sp[1]); - ow_byte_wr(n,sp[2]); - ow_byte_wr(n,sp[3]); - for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte - sp[i]=ow_byte_rd(n); - } - - if (sp[3]!=sp[6] ) //control data - return OW_ERROR_CRC; - - for ( j=1 ; j< 7; j++ ) { - sp[3]=configpage[j]; //databyte - ow_byte_wr(n,sp[3]); - for ( i=4 ; i< 7; i++ ) { //read CRC16+databyte - sp[i]=ow_byte_rd(n); - } - if (sp[3]!=sp[6] ) //control data - return OW_ERROR_CRC; - - } - return OW_OK; - } - return OW_ERROR_BAD_ID; -} \ No newline at end of file
diff -r b4277f7c538e -r 031e71e61e80 OneWire/DS2450.h --- a/OneWire/DS2450.h Mon Jun 02 13:17:18 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -/* DS2450 specific values (see datasheet www.maxim-ic.com/datasheet/index.mvp/id/2921) */ -#ifndef _DS2450_ -#define _DS2450_ -#define DS2450_ID 0x20 -#define DS2450_READ_MEMORY 0xAA -#define DS2450_WRITE_MEMORY 0x55 -#define DS2450_CONVERT 0x3C - -#define DS2450_SP_SIZE 13 -#define DS2450_PAGE0 0x00 -#define DS2450_PAGE1 0x08 -#define DS2450_PAGE2 0x10 -#define DS2450_PAGE3 0x18 - -#define DS2450_ADCA 0x00 //channel A -#define DS2450_ADCB 0x02 //channel B -#define DS2450_ADCC 0x04 //channel C -#define DS2450_ADCD 0x06 //channel D - -#define DS2450_IR_2V5 0x00 //input voltage range 2.55V -#define DS2450_IR_5V1 0x01 //input voltage range 5.1V -#define DS2450_AFH 0x20 //flag alarm value higher -#define DS2450_AFL 0x10 //flag alarm value lower -#define DS2450_AEH_ENABLE 0x08 //alarm value higher enable -#define DS2450_AEL_ENABLE 0x04 //alarm value lower enable - -#define DS2450_DISABLE_OUT 0x00 //disable ouput -#define DS2450_ENABLE_OUT 0x80//enable ouput - -#define DS2450_16_BIT 0x00 //ADC 16bits enable ouput -#define DS2450_15_BIT 0x0F //ADC 15bits enable ouput -#define DS2450_12_BIT 0x0C //ADC 12bits enable ouput -#define DS2450_8_BIT 0x08 //ADC 8bits enable ouput -#define DS2450_1_BIT 0x01 //ADC 1bits enable ouput -uint8_t DS2450_read_page(uint8_t id[], uint8_t adresse, uint8_t *val); -uint8_t DS2450_read_page(uint8_t n,uint8_t id[], uint8_t adresse, uint8_t *val); -uint8_t DS2450_convert(uint8_t id[], uint8_t input_select_mask,uint8_t read_out_control); -uint8_t DS2450_convert(uint8_t n,uint8_t id[], uint8_t input_select_mask,uint8_t read_out_control); -uint8_t DS2450_read_ADC(uint8_t id[], uint16_t adc[]); -uint8_t DS2450_read_ADC(uint8_t n,uint8_t id[], uint16_t adc[]); -uint8_t DS2450_start_and_read_ADC(uint8_t id[], uint16_t adc[]); -uint8_t DS2450_start_and_read_ADC(uint8_t n,uint8_t id[], uint16_t adc[]); -uint8_t DS2450_configure_channel_ADC(uint8_t id[],uint8_t channel,uint8_t conflsb,uint8_t confmsb); -uint8_t DS2450_configure_channel_ADC(uint8_t n,uint8_t id[],uint8_t channel,uint8_t conflsb,uint8_t confmsb); -uint8_t DS2450_configure_page(uint8_t id[], uint8_t adresse,uint8_t configpage[]); -uint8_t DS2450_configure_page(uint8_t n,uint8_t id[], uint8_t adresse,uint8_t configpage[]); -#endif \ No newline at end of file
diff -r b4277f7c538e -r 031e71e61e80 OneWire/Horner_ITS90.h --- a/OneWire/Horner_ITS90.h Mon Jun 02 13:17:18 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -#ifndef __Horner_ITS90_H__ -#define __Horner_ITS90_H__ - -const double ITS90_TCK_subzero[] = -{ - - -0.0, -2.5173462E-2, --1.1662878E-6, --1.0833638E-9, --8.9773540E-13, --3.7342377E-16, --8.6632643E-20, --1.0450598E-23, --5.1920577E-28, -0.0 - -}; -const double ITS90_TCK_sub500[] = -{ -0.0, -2.508355E-02, -7.860106E-08, --2.503131E-10, -8.315270E-14, --1.228034E-17, -9.804036E-22, --4.413030E-26, -1.057734E-30, --1.052755E-35 -}; - -const double ITS90_TCK_sub1372[] = -{ --1.318058E+02, -4.830222E-02, --1.646031E-06, -5.464731E-11, --9.650715E-16, -8.802193E-21, --3.110810E-26, -0.0, -0.0, -0.0 - -}; - -#endif
diff -r b4277f7c538e -r 031e71e61e80 OneWire/MAX31850.cpp --- a/OneWire/MAX31850.cpp Mon Jun 02 13:17:18 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,125 +0,0 @@ -/** -* @file MAX31850.cpp -* @brief library of MAX31850 1-Wire Thermocouple-to-Digital Converters,Cold-Junction Compensated (http://www.maximintegrated.com/datasheet/index.mvp/id/7953) -* @author Frederic BLANC -* @date 2014_01_15 -*/ -#include "mbed.h" -#include "onewire.h" -#include "MAX31850.h" -#include "crc8.h" -#include "Horner_ITS90.h" -int MAX31850_Read_Scratch(uint8_t id[],uint8_t sp[],uint8_t n) -{ - if (id[0] == MAX31850_ID) { - if (ow_reset(n)) //reset OW - return OW_SHORT_CIRCUIT; - sp[0]=MAX31850_READ; // command - ow_command(n,sp[0], &id[0]); - for ( int i=0 ; i< MAX31850_SP_SIZE; i++ ) { //read 8xdata + CRC16 - sp[i]=ow_byte_rd(n); - } - if(sp[8]!=crc8(sp,8)) - return OW_ERROR_CRC; - return OW_OK; - } - return OW_ERROR_BAD_ID; -} - -int MAX31850_Temp_TRUE(uint8_t *sp,double *temp) -{ - - - float temp_cj,temp_tc; - double vtc; - int err; - - err = MAX31850_Temp_TC(sp,&temp_tc); - if(err) { - return err; - } - MAX31850_Temp_CJ(sp,&temp_cj); - - vtc = MAX31850_K * temp_tc ; - *temp=0; - if(temp_tc < 0.0) { - for(int i=0;i<10;++i) - { - - *temp+=ITS90_TCK_subzero[i]*pow(vtc,i); - } - } else if(temp_tc < 500.0) { - for(int i=0;i<10;++i) - { - - *temp+=ITS90_TCK_sub500[i]*pow(vtc,i); - } - } else { - for(int i=0;i<10;++i) - { - - *temp+=ITS90_TCK_sub1372[i]*pow(vtc,i); - } - } - return OW_OK; -} - - -int MAX31850_Temp_TC(uint8_t *sp,float *temp) -{ - - uint8_t *ptr_meas; - uint16_t meas; - - if(sp[0]& 1) - return MAX31850_ERR_FAULT; - if(sp[2]& (1<<1)) - return MAX31850_ERR_OPEN_CIRCUIT; - if(sp[2]& (1<<2)) - return MAX31850_ERR_SHORT2GND; - if(sp[2]& (1<<3)) - return MAX31850_ERR_SHORT2VDD; - ptr_meas=(uint8_t*) &meas; - *ptr_meas = sp[0] ; // LSB - *++ptr_meas = sp[1]; // MSB - if ( meas & 0x8000 ) { - - meas ^= 0xffff; // convert to positive => (twos complement)++ - meas++; - *temp= -1.0 * MAX31850_ADC_TEMP_TC_UNIT * (float)(meas>>2); - } else { - *temp= MAX31850_ADC_TEMP_TC_UNIT * (float)(meas>>2); - } - - return OW_OK; -} - -int MAX31850_Temp_CJ(uint8_t *sp,float *temp) -{ - uint8_t *ptr_meas; - uint16_t meas; - - ptr_meas=(uint8_t*) &meas; - *ptr_meas = sp[2] ; // LSB - *++ptr_meas = sp[3]; // MSB - if ( meas & 0x8000 ) { - - meas ^= 0xffff; // convert to positive => (twos complement)++ - meas++; - *temp= -1.0 * MAX31850_ADC_TEMP_CJ_UNIT * (float)(meas>>4); - } else { - *temp= MAX31850_ADC_TEMP_CJ_UNIT * (float)(meas>>4); - } - return OW_OK; -} - -int MAX31850_Start_meas(uint8_t id[],uint8_t n=0) -{ - if (id[0] == MAX31850_ID) { - if (ow_reset(n)) //reset OW - return OW_SHORT_CIRCUIT; - ow_command(n,MAX31850_CONVERT_T, &id[0]); - return OW_OK; - } - return OW_ERROR_BAD_ID; -} \ No newline at end of file
diff -r b4277f7c538e -r 031e71e61e80 OneWire/MAX31850.h --- a/OneWire/MAX31850.h Mon Jun 02 13:17:18 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* DS2450 specific values (see datasheet http://www.maximintegrated.com/datasheet/index.mvp/id/7953) */ -#ifndef __MAX31850_H__ -#define __MAX31850_H__ -#define MAX31850_ID 0x3B -#define MAX31850_SP_SIZE 9 - -#define MAX31850_CONVERT_T 0x44 // 0x44 -#define MAX31850_READ_POWER_SUPPLY 0xB4 -#define MAX31850_READ 0xBE - -#define MAX31850_ADC_TEMP_TC_UNIT 0.25 -#define MAX31850_ADC_TEMP_CJ_UNIT 0.0625 -#define MAX31850_K 41.276//41.276µV/C - -#define MAX31850_ERR_FAULT -10; -#define MAX31850_ERR_SHORT2VDD -12; -#define MAX31850_ERR_SHORT2GND -13; -#define MAX31850_ERR_OPEN_CIRCUIT -14; -/** - * @brief lecture registre MAX31850 - * @param [in] uint8_t id[] tableau d'identifiant OW - * @param [out] uint8_t sp[] tableau de registre - * @param [in] uint8_t n bus ow - * @return OW_OK si erreur retourne OW_ERROR_CRC - * @date 02/12/2013 - * - */ -int MAX31850_Read_Scratch(uint8_t id[],uint8_t sp[],uint8_t n) ; - -/** - * @brief lecture temperature thermocouple Linearized MAX31850 - * @param [in] uint8_t sp[] tableau registre MAX31850 - * @param [out] float temperature thermocouple Linearized degre Celsuis - * @return OW_OK si erreur retourne ERROR - * @date 04/12/2013 - * - */ - int MAX31850_Temp_TRUE(uint8_t *sp,double *temp); - -/** - * @brief lecture temperature thermocouple MAX31850 - * @param [in] uint8_t sp[] tableau registre MAX31850 - * @param [out] float temperature thermocouple degre Celsuis - * @return OW_OK si erreur retourne ERROR - * @date 04/12/2013 - * - */ - int MAX31850_Temp_TC(uint8_t *sp,float *temp) ; - -/** - * @brief lecture temperature cold junction MAX31850 - * @param [in] uint8_t sp[] tableau registre MAX31850 - * @param [out] float temperature cold junction degre Celsuis - * @return OW_OK si erreur retourne ERROR - * @date 04/12/2013 - * - */ -int MAX31850_Temp_CJ(uint8_t *sp,float *temp) ; - -/** - * @brief start convertion MAX31850 - * @param [in] uint8_t id[] tableau d'identifiant OW - * @param [in] uint8_t n bus ow - * @return OW_OK - * @date 02/12/2013 - * - */ -int MAX31850_Start_meas(uint8_t id[],uint8_t n); -#endif \ No newline at end of file
diff -r b4277f7c538e -r 031e71e61e80 OneWire/crc16.cpp --- a/OneWire/crc16.cpp Mon Jun 02 13:17:18 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -#include <inttypes.h> -#include "mbed.h" -#include "onewire.h" - -#define CRC16INIT 0x0000 -//#define CRC16POLY 0x8005; // Polynome =x^16 + x^15 + x^2 + x^0 = 0x18005 -#define CRC16POLY 0xA001; - -uint16_t crc16(uint8_t* octets, uint16_t nboctets) -{ -uint16_t crc = CRC16INIT; -int i, done = 0; -uint8_t todo; - if (nboctets != 0) { - do { - todo = octets[done]; - crc ^= todo; - for (i = 0; i < 8; i++) { - if (crc % 2 != 0) { - crc = (crc >> 1) ^ CRC16POLY; - } else { - crc = crc >> 1; - } - } - done++; - } while (done < nboctets); - - - } - -return crc; -} -//CRC16 byte, always two bytes, bit inverted, LSByte first -uint8_t ctrl_crc16(uint8_t* octets, uint16_t nboctets) -{ - uint16_t crc; - uint8_t *ptr; -#ifdef DEBUG - printf( "\nCRC16 : " ); - for ( uint8_t i=0 ; i< nboctets; i++ ) - printf(":%2.2X",octets[i]); - printf( "\n" ); -#endif - crc =~crc16(octets, nboctets-2); - ptr=(uint8_t*)&crc; -#ifdef DEBUG - printf( "\n" ); - printf("CRC16:%X",crc); - printf( "\n" ); -#endif - if(*ptr==octets[nboctets-2]) - if(*++ptr==octets[nboctets-1]) - return 0; - - return 1; - } \ No newline at end of file
diff -r b4277f7c538e -r 031e71e61e80 OneWire/crc16.h --- a/OneWire/crc16.h Mon Jun 02 13:17:18 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -#ifndef _CRC16_ -#define _CRC16_ -uint16_t crc16(uint8_t* octets, uint16_t nboctets); -uint8_t ctrl_crc16(uint8_t* octets, uint16_t nboctets); -#endif \ No newline at end of file
diff -r b4277f7c538e -r 031e71e61e80 OneWire/crc8.cpp --- a/OneWire/crc8.cpp Mon Jun 02 13:17:18 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -#include <inttypes.h> - -#define CRC8INIT 0x00 -#define CRC8POLY 0x18 //0X18 = X^8+X^5+X^4+X^0 - -uint8_t crc8 ( uint8_t *data_in, uint16_t number_of_bytes_to_read ) -{ - uint8_t crc; - uint16_t loop_count; - uint8_t bit_counter; - uint8_t data; - uint8_t feedback_bit; - - crc = CRC8INIT; - - for (loop_count = 0; loop_count != number_of_bytes_to_read; loop_count++) - { - data = data_in[loop_count]; - - bit_counter = 8; - do { - feedback_bit = (crc ^ data) & 0x01; - - if ( feedback_bit == 0x01 ) { - crc = crc ^ CRC8POLY; - } - crc = (crc >> 1) & 0x7F; - if ( feedback_bit == 0x01 ) { - crc = crc | 0x80; - } - - data = data >> 1; - bit_counter--; - - } while (bit_counter > 0); - } - - return crc; -}
diff -r b4277f7c538e -r 031e71e61e80 OneWire/crc8.h --- a/OneWire/crc8.h Mon Jun 02 13:17:18 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -#ifndef _CRC8_ -#define _CRC8_ -uint8_t crc8 (uint8_t* data_in, uint16_t number_of_bytes_to_read); -#endif \ No newline at end of file
diff -r b4277f7c538e -r 031e71e61e80 OneWire/onewire.cpp --- a/OneWire/onewire.cpp Mon Jun 02 13:17:18 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,575 +0,0 @@ -/** -* @file onewire.c -* @brief library 1-Wire(www.maxim-ic.com) -* @author Maciej Rajtar (Published 10 May 2010 www.mbed.org) -* @author Frederic BLANC (Published 01/03/2012 www.mbed.org) -*/ - -#include "mbed.h" -#include "onewire.h" - -DigitalInOut ow_pin(p21); -DigitalInOut ow_0(p21); -DigitalInOut ow_1(p22); -DigitalInOut ow_2(p23); -DigitalInOut ow_3(p24); -DigitalInOut* t_ow[4]={&ow_0,&ow_1,&ow_2,&ow_3}; - -//********************************************************************************************************** -//* show_id -//********************************************************************************************************** - - -/** -* @brief show_id -* @param [in] id[] = rom_code -* @param [out] text id -* @date 02/12/2013 -*/ -char* ow_show_id( uint8_t id[],char *text) { - - char hex[4]; - sprintf(text,""); - sprintf(hex,"%2.2X",id[0]); - strcat(text,hex); - for (int i = OW_ROMCODE_SIZE-2; i >=1 ; --i ) { - sprintf(hex,"%2.2X",id[i]); - strcat(text,hex); - } - sprintf(hex,"%2.2X",id[OW_ROMCODE_SIZE-1]); - strcat(text,hex); - return text; - -} -//********************************************************************************************************** -//* show_id -//********************************************************************************************************** - - -/** -* @brief uint64_id -* @param [in] id[] = rom_code -* @return [out] uint64_t id -* @date 28/03/2011 -*/ -uint64_t uint64_id( uint8_t id[]) { - - uint64_t *ptr; - - ptr=(uint64_t *) &id[0]; - - return *ptr; -} -//********************************************************************************************************** -//* search_sensors -//********************************************************************************************************** - -/** -* @brief search_sensors -* @param [out] nSensors number of device onewire -* @param [out] gSensorIDs[][] array of id romcode -* @return OW_OK or OW_PRESENCE_ERR or OW_DATA_ERR -* @date 20/06/2011 -*/ -uint8_t search_sensors(uint8_t *nSensors,uint8_t gSensorIDs[][OW_ROMCODE_SIZE] ) { - - - uint8_t i; - uint8_t id[OW_ROMCODE_SIZE]; - uint8_t diff; - //printf( "Scanning Bus\r\n" ); - diff = OW_SEARCH_FIRST; - for (*nSensors = 0 ; (diff != OW_LAST_DEVICE) && (*nSensors < MAXSENSORS) ;++(*nSensors) ) { - ow_find_sensor( &diff, &id[0] ); - if ( diff == OW_PRESENCE_ERR ) { - //printf( "No Sensor found\r\n" ); - return diff; - } - if ( diff == OW_DATA_ERR ) { - //printf( "Bus Error\r\n" ); - return diff; - } - for (i=0;i<OW_ROMCODE_SIZE;i++) - gSensorIDs[*nSensors][i]=id[i]; - - } - return OW_OK; -} -/** -* @brief search_sensors -* @param [in] n num bus onewire -* @param [out] nSensors number of device onewire -* @param [out] gSensorIDs[][][] array of id romcode -* @return OW_OK or OW_PRESENCE_ERR or OW_DATA_ERR -* @date 02/09/2011 -*/ -uint8_t search_sensors(uint8_t n,uint8_t *nSensors,uint8_t gSensorIDs[][MAXSENSORS][OW_ROMCODE_SIZE] ) { - - - uint8_t i; - uint8_t id[OW_ROMCODE_SIZE]; - uint8_t diff; - //printf( "Scanning Bus %d\r\n",n ); - diff = OW_SEARCH_FIRST; - for (*nSensors = 0 ; (diff != OW_LAST_DEVICE) && (*nSensors < MAXSENSORS) ;++(*nSensors) ) { - ow_find_sensor(n, &diff, &id[0] ); - if ( diff == OW_PRESENCE_ERR ) { - //printf( "No Sensor found\r\n" ); - return diff; - } - if ( diff == OW_DATA_ERR ) { - //printf( "Bus Error\r\n" ); - return diff; - } - for (i=0;i<OW_ROMCODE_SIZE;i++){ - gSensorIDs[n][*nSensors][i]=id[i]; - //printf( "id[%d]=%d\r\n" ,i,id[i]); - } - - } - return OW_OK; -} -//********************************************************************************************************** -//* find Sensors on 1-Wire-Bus -//********************************************************************************************************** - -/** -* @brief find Sensors on 1-Wire-Bus -* @param [in/out] diff is the result of the last rom-search -* @param [out] is the rom-code of the sensor found -* @return OW_OK or OW_ERROR -* @date 20/06/2011 -*/ -uint8_t ow_find_sensor(uint8_t *diff, uint8_t id[]) { - for (;;) - { - *diff = ow_rom_search( *diff, &id[0] ); - if ( *diff==OW_PRESENCE_ERR) - return OW_ERROR; - if ( *diff==OW_DATA_ERR ) - return OW_ERROR; - if ( *diff == OW_LAST_DEVICE ) - return OW_OK ; - if ( id[0] == DS18B20_ID || id[0] == DS18S20_ID ) - return OW_OK ; - if ( id[0] == DS2450_ID ) - return OW_OK ; - if ( id[0] == MAX31850_ID ) - return OW_OK ; - } -} - -/** -* @brief find Sensors on 1-Wire-Bus -* @param [in] num bus onewire -* @param [in/out] diff is the result of the last rom-search -* @param [out] is the rom-code of the sensor found -* @return OW_OK or OW_ERROR -* @date 30/08/2011 -*/ -uint8_t ow_find_sensor(uint8_t n,uint8_t *diff, uint8_t id[]) { - for (;;) - { - *diff = ow_rom_search(n, *diff, &id[0] ); - if ( *diff==OW_PRESENCE_ERR) - return OW_ERROR; - if ( *diff==OW_DATA_ERR ) - return OW_ERROR; - if ( *diff == OW_LAST_DEVICE ) - return OW_OK ; - if ( id[0] == DS18B20_ID || id[0] == DS18S20_ID ) - return OW_OK ; - if ( id[0] == DS2450_ID ) - return OW_OK ; - if ( id[0] == MAX31850_ID ) - return OW_OK ; - } -} -//********************************************************************************************************** -//* search romcode -//********************************************************************************************************** - -/** -* @brief search romcode -* @param [in] uint8_t diff -* @param [out] id romcode -* @return next_diff or OW_LAST_DEVICE or OW_DATA_ERR or OW_PRESENCE_ERR -* @date 20/06/2011 -*/ -uint8_t ow_rom_search( uint8_t diff, uint8_t id[] ) { - uint8_t i, j, next_diff; - uint8_t b; - - if ( ow_reset() ) - return OW_PRESENCE_ERR; // error, no device found - ow_byte_wr( OW_SEARCH_ROM ); // ROM search command - next_diff = OW_LAST_DEVICE; // unchanged on last device - i = OW_ROMCODE_SIZE * 8; // 8 bytes - do { - j = 8; // 8 bits - do { - b = ow_bit_io( 1 ); // read bit - if ( ow_bit_io( 1 ) ) { // read complement bit - if ( b ) // 11 - return OW_DATA_ERR; // data error - } else { - if ( !b ) { // 00 = 2 devices - if ( diff > i || ((*id & 1) && diff != i) ) { - b = 1; // now 1 - next_diff = i; // next pass 0 - } - } - } - ow_bit_io( b ); // write bit - *id >>= 1; - if ( b ) - *id |= 0x80; // store bit - --i; - } while ( --j ); - id++; // next byte - } while ( i ); - return next_diff; // to continue search -} -/** -* @brief search romcode -* @param [in]n num bus onewire -* @param [in] uint8_t diff -* @param [out] id romcode -* @return next_diff or OW_LAST_DEVICE or OW_DATA_ERR or OW_PRESENCE_ERR -* @date 30/08/2011 -*/ -uint8_t ow_rom_search(uint8_t n, uint8_t diff, uint8_t id[] ) { - uint8_t i, j, next_diff; - uint8_t b; - if ( ow_reset(n) ) - return OW_PRESENCE_ERR; // error, no device found - ow_byte_wr(n, OW_SEARCH_ROM ); // ROM search command - next_diff = OW_LAST_DEVICE; // unchanged on last device - i = OW_ROMCODE_SIZE * 8; // 8 bytes - do { - j = 8; // 8 bits - do { - b = ow_bit_io(n, 1 ); // read bit - if ( ow_bit_io(n, 1 ) ) { // read complement bit - if ( b ) // 11 - { - - return OW_DATA_ERR; // data error - } - } else { - if ( !b ) { // 00 = 2 devices - if ( diff > i || ((*id & 1) && diff != i) ) { - b = 1; // now 1 - next_diff = i; // next pass 0 - } - } - } - ow_bit_io(n, b ); // write bit - - *id >>= 1; - if ( b ) - *id |= 0x80; // store bit - --i; - } while ( --j ); - id++; // next byte - - } while ( i ); - - - return next_diff; // to continue search -} - - -//********************************************************************************************************** -//* test pin onewire bus -//********************************************************************************************************** -/** -* @brief test pin onewire bus -* @return etat pin ow -* @date 20/06/2011 -*/ -uint8_t ow_test_pin (void){ - if (ow_pin) - return 1; -return 0; -} - -/** -* @brief test pin onewire bus -* @param [in] num bus one wire -* @return etat pin ow -* @date 30/08/2011 -*/ -uint8_t ow_test_pin (uint8_t n){ - - if (*t_ow[n]) - return 1; -return 0; -} - -//********************************************************************************************************** -//* onewire reset bus -//********************************************************************************************************** -/** -* @brief onewire reset bus -* @return pin ow or OW_SHORT_CIRCUIT -* @date 20/06/2011 -*/ -uint8_t ow_reset(void) { // reset. Should improve to act as a presence pulse - uint8_t err; - - ow_pin.output(); - ow_pin = 0; // bring low for 500 us - wait_us(500); - ow_pin.input(); - wait_us(60); - err = ow_pin; - wait_us(240); - if ( ow_pin == 0 ) { // short circuit - err = OW_SHORT_CIRCUIT; - } - return err; -} - -/** -* @brief onewire reset bus -* @param [in] num bus onewire -* @return pin ow or OW_SHORT_CIRCUIT -* @date 30/08/2011 -*/ -uint8_t ow_reset(uint8_t n) { // reset. Should improve to act as a presence pulse - uint8_t err; - - t_ow[n]->output(); - *t_ow[n] = 0; // bring low for 500 us - wait_us(500); - t_ow[n]->input(); - wait_us(60); - err = *t_ow[n]; - wait_us(240); - if ( *t_ow[n] == 0 ) { // short circuit - err = OW_SHORT_CIRCUIT; - - } - return err; -} -//********************************************************************************************************** -//* read write onewire -//********************************************************************************************************** -/** -* @brief read write onewire -* @param [in/out] b data -* @return data -* @date 20/06/2011 -*/ -uint8_t ow_bit_io( uint8_t b ) { - - ow_pin.output(); // drive bus low - ow_pin = 0; - wait_us(1); // Recovery-Time wuffwuff was 1 - - if ( b ) - ow_pin.input(); // if bit is 1 set bus high (by ext. pull-up) - // delay was 15uS-1 see comment above - wait_us(15-1); - if ( ow_pin == 0 ) b = 0; // sample at end of read-timeslot - wait_us(60-15); - ow_pin.input(); - return b; -} -/** -* @brief read write onewire -* @param [in] n num bus onewire -* @param [in/out] b data -* @return data -* @date 30/08/2011 -*/ -uint8_t ow_bit_io(uint8_t n, uint8_t b ) { - - t_ow[n]->output(); // drive bus low - *t_ow[n] = 0; - wait_us(1); // Recovery-Time wuffwuff was 1 - - if ( b ) - t_ow[n]->input(); // if bit is 1 set bus high (by ext. pull-up) - // delay was 15uS-1 see comment above - wait_us(15-1); - if ( *t_ow[n] == 0 ) b = 0; // sample at end of read-timeslot - wait_us(60-15); - t_ow[n]->input(); - // printf("ow_bit_io n=%d b=%X\n",n,b); - return b; -} -//********************************************************************************************************** -//* byte write on onewire -//********************************************************************************************************** -/** -* @brief byte write on onewire -* @param [in] b data -* @return data -* @date 20/06/2011 -*/ -uint8_t ow_byte_wr( uint8_t b ) { - uint8_t i = 8, j; - - do { - j = ow_bit_io( b & 1 ); - b >>= 1; - if ( j ) - b |= 0x80; - } while ( --i ); - return b; -} -/** -* @brief byte write on onewire -* @param [in] n num bus onewire -* @param [in] b data -* @return data -* @date 30/08/2011 -*/ -uint8_t ow_byte_wr(uint8_t n, uint8_t b ) { - uint8_t i = 8, j; - - do { - j = ow_bit_io(n, b & 1 ); - b >>= 1; - if ( j ) - b |= 0x80; - } while ( --i ); - return b; -} -//********************************************************************************************************** -//* byte write on onewire -//********************************************************************************************************** -/** -* @brief byte read on onewire -* @return data -* @date 20/06/2011 -*/ -uint8_t ow_byte_rd( void ) { - // read by sending 0xff (a dontcare?) - return ow_byte_wr( 0xFF ); -} - -/** -* @brief byte read on onewire -* @param [in] n num onewire -* @return data -* @date 30/08/2011 -*/ -uint8_t ow_byte_rd( uint8_t n) { - // read by sending 0xff (a dontcare?) - return ow_byte_wr(n, 0xFF ); -} -//********************************************************************************************************** -//* byte write on onewire -//********************************************************************************************************** -/** -* @brief write command -* @param [in] command -* @param [in] id romcode -* @date 20/06/2011 -*/ -uint8_t ow_command( uint8_t command, uint8_t id[] ) { - uint8_t i; - - ow_reset(); - if ( id ) { - ow_byte_wr( OW_MATCH_ROM ); // to a single device - i = OW_ROMCODE_SIZE; - do { - ow_byte_wr( *id ); - ++id; - } while ( --i ); - } else { - ow_byte_wr( OW_SKIP_ROM ); // to all devices - } - ow_byte_wr( command ); - return 0; -} -/** -* @brief write command -* @param [in] n num bus onewire -* @param [in] command -* @param [in] id romcode -* @date 30/08/2011 -*/ -uint8_t ow_command(uint8_t n, uint8_t command, uint8_t id[] ) { - uint8_t i; - - ow_reset(n); - if ( id ) { - ow_byte_wr( n,OW_MATCH_ROM ); // to a single device - i = OW_ROMCODE_SIZE; - do { - ow_byte_wr(n, *id ); - ++id; - } while ( --i ); - } else { - ow_byte_wr(n, OW_SKIP_ROM ); // to all devices - } - ow_byte_wr(n, command ); - return 0; -} -//********************************************************************************************************** -//* ow mode -//********************************************************************************************************** -/** -* @brief parasite enable -* @date 20/06/2011 -*/ -uint8_t ow_parasite_enable(void) { - ow_pin.output(); - ow_pin = 1; - return 0; -} -/** -* @brief parasite disable -* @date 20/06/2011 -*/ -uint8_t ow_parasite_disable(void) { - - ow_pin.input(); - return 0; -} - -/** -* @brief parasite enable -* @param [in] n num bus onewire -* @date 30/08/2011 -*/ -uint8_t ow_parasite_enable(uint8_t n) { - t_ow[n]->output(); - *t_ow[n] = 1; - return 0; -} -/** -* @brief parasite disable -* @param [in] n num bus onewire -* @date 30/08/2011 -*/ -uint8_t ow_parasite_disable(uint8_t n) { - t_ow[n]->input(); - return 0; -} -/** -* @brief PUL-UP bus OW -* @return OW_OK -* @date 20/06/2011 -*/ -uint8_t ow_PullUp(void) -{ - ow_pin.mode(PullUp); //PULL-UP bus OW -return OW_OK; -} -/** -* @brief PUL-UP bus OW -* @param [in] n num bus onewire -* @return OW_OK -* @date 30/08/2011 -*/ -uint8_t ow_PullUp(uint8_t n) -{ - t_ow[n]->mode(PullUp); //PULL-UP bus OW -return OW_OK; -} \ No newline at end of file
diff -r b4277f7c538e -r 031e71e61e80 OneWire/onewire.h --- a/OneWire/onewire.h Mon Jun 02 13:17:18 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -/** -* @file onewire.h -* @brief library 1-Wire(www.maxim-ic.com) -* @author Maciej Rajtar (Published 10 May 2010 www.mbed.org) -* @author Frederic BLANC (Published 01/03/2012 www.mbed.org) -*/ - -#ifndef _onewire_ -#define _onewire_ -#include "DS2450.h" -#include "DS18X20.h" -#include "MAX31850.h" -#include "crc8.h" -#include "crc16.h" -//#define DEBUG 1 -//#define DEBUG_L1 1 -#define ONEWIRE_PIN p21 - -#define MAXSENSORS 8 -#define MAXBUS 4 -// rom-code size including CRC -#define OW_ROMCODE_SIZE 8 - -#define OW_OK 0x00 -#define OW_ERROR 0x01 -#define OW_START_FAIL 0x02 -#define OW_ERROR_CRC 0x03 -#define OW_ERROR_BAD_ID 0x04 -#define OW_BUSY 0x05 - -#define OW_MATCH_ROM 0x55 -#define OW_SKIP_ROM 0xCC -#define OW_SEARCH_ROM 0xF0 -#define OW_READ_ROM 0x33 -#define OW_CONDITIONAL_SEARCH 0xEC -#define OW_OVERDRIVE_SKIP_ROM 0x3C -#define OW_OVERDRIVE_MATCH_ROM 0x69 - -#define OW_SHORT_CIRCUIT 0xFF -#define OW_SEARCH_FIRST 0xFF // start new search -#define OW_PRESENCE_ERR 0x01 -#define OW_DATA_ERR 0xFE -#define OW_LAST_DEVICE 0x00 // last device found -// 0x01 ... 0x40: continue searching - - - -char* ow_show_id( uint8_t id[],char *text); -uint64_t uint64_id( uint8_t id[]); - -uint8_t search_sensors(uint8_t *nSensors,uint8_t id[][OW_ROMCODE_SIZE] ); -uint8_t search_sensors(uint8_t n,uint8_t *nSensors,uint8_t gSensorIDs[][MAXSENSORS][OW_ROMCODE_SIZE] ); -uint8_t ow_PullUp(void); -uint8_t ow_PullUp(uint8_t n); - - -uint8_t ow_test_pin (void); -uint8_t ow_test_pin (uint8_t n); -uint8_t ow_reset(void); -uint8_t ow_reset(uint8_t n); -uint8_t ow_rom_search( uint8_t diff, uint8_t id[] ); -uint8_t ow_rom_search(uint8_t n, uint8_t diff, uint8_t id[] ); -uint8_t ow_command( uint8_t command, uint8_t id[] ); -uint8_t ow_command(uint8_t n, uint8_t command, uint8_t id[] ); -uint8_t ow_find_sensor(uint8_t *diff, uint8_t id[]); -uint8_t ow_find_sensor(uint8_t n,uint8_t *diff, uint8_t id[]); -uint8_t ow_parasite_enable(void); -uint8_t ow_parasite_enable(uint8_t n); -uint8_t ow_parasite_disable(void); -uint8_t ow_parasite_disable(uint8_t n); -uint8_t ow_bit_io( uint8_t b ); -uint8_t ow_bit_io(uint8_t n, uint8_t b); -uint8_t ow_byte_wr( uint8_t b ); -uint8_t ow_byte_wr(uint8_t n, uint8_t b ); -uint8_t ow_byte_rd( void ); -uint8_t ow_byte_rd( uint8_t n); - - -#endif \ No newline at end of file
diff -r b4277f7c538e -r 031e71e61e80 OneWire/utils.cpp --- a/OneWire/utils.cpp Mon Jun 02 13:17:18 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -#include <stdint.h> - -uint16_t uint8_to_uint16(uint8_t lsb, uint8_t msb) -{ - uint16_t data; - uint8_t *ptr; - - ptr=(uint8_t*)&data; - *ptr=lsb; - *++ptr=msb; - return data; -} \ No newline at end of file
diff -r b4277f7c538e -r 031e71e61e80 OneWire/utils.h --- a/OneWire/utils.h Mon Jun 02 13:17:18 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -#ifndef _utils_ -#define _utils_ -uint16_t uint8_to_uint16(uint8_t lsb, uint8_t msb); -#endif \ No newline at end of file
diff -r b4277f7c538e -r 031e71e61e80 main.cpp --- a/main.cpp Mon Jun 02 13:17:18 2014 +0000 +++ b/main.cpp Wed Sep 28 06:46:10 2016 +0000 @@ -1,3 +1,9 @@ +/** + * @brief MAX31850 + * @date 02/06/2014 + * @author F.BLANC LAAS-CNRS + * + */ #include "mbed.h" #include <stdint.h> #include <string.h>