Interface Driver for Maxim DS2482 1Wire-to-I2C bridge IC. Includes access functions for DS1820 temperature sensors. Can easily be ported to other hardware by using hardware abstraction layer.

Usage Example - main.cpp

#include "mbed.h"
#include "ds2482.h"

#define MAX_TEMP_SENSORS        16
#define CONNECTED_DS2482_HUBS   2

struct sDS1820_t
{    
    struct sDS2482_t *hub;
    uint8_t u8RomNr[8];
};

struct sDS1820_t sDS1820[MAX_TEMP_SENSORS];
struct sDS2482_t sDS2482[CONNECTED_DS2482_HUBS];

Serial console(USBTX, USBRX);
I2C i2c (p9, p10);

int8_t i8SetupTempSensors(void)
{
    int x=0;    
    
    sDS2482[0].u8Addr = DS2482_ADDR1;     
    sDS2482[1].u8Addr = DS2482_ADDR2;
    
    for(int loop=0; loop<2; loop++)
    {   
        int8_t i8Tmp = i8DS2482Reset(&sDS2482[loop]);
        if(i8Tmp)
            return i8Tmp;
        
        i8Tmp = i8DS2482SetControlBits(&sDS2482[loop], APU | SPU );
        if(i8Tmp)
            return i8Tmp;
        
        i8Tmp = i8DS2482_OWReset(&sDS2482[loop]);        
        if(i8Tmp) 
            return i8Tmp;
            
        while(i16DS2482_OWSearch(&sDS2482[loop]) > 0)
        {            
            sDS1820[x].hub = &sDS2482[loop];
            for(int z=0; z<8; z++)
                sDS1820[x].u8RomNr[z] = sDS2482[loop].u8RomNr[z];                        
            x++;
        }
    }  
    return x;
}

int main(void)
{
    uint8_t u8SensorCount;
    
    mbed_i2c = &i2c; 
    
    console.baud(115200);    
    
    int8_t i8Ret = i8SetupTempSensors();    
    
    if(i8Ret < 0)
    {
        console.printf("Error -i8Ret\n");    
        while(1);       // error occured
    }
    
    u8SensorCount = i8Ret;
    
    while(1)
    {
        // Start Temperature Conversion on all DS1820
        for(uint8_t loop = 0; loop < CONNECTED_DS2482_HUBS; loop++)
        {            
            i8Ret = i8DS2482_OWStartAllDS1820(&sDS2482[loop], 0);
                if(i8Ret) 
                {
                    console.printf("Error %i\n", -i8Ret);
                    while(1);   // error!            
                }
        }
        
        // Wait until all DS1820 have completed the conversion
        for(uint8_t loop = 0; loop < CONNECTED_DS2482_HUBS; loop++)        
            while(!i8DS2482_OWCheckDeviceReady(&sDS2482[loop]));                        
        
        // Get temperature values and display them
        for(uint8_t z=0; z<u8SensorCount; z++)
        {
            int16_t i16Tmp = i16DS2482_OWReadDS1820(sDS1820[z].hub, sDS1820[z].u8RomNr, 0);
            if(i16Tmp < 0)    
            {                
                console.printf("Error %i\n", -i16Tmp);
                while(1);           // error                    
            }
            else
            {
                uint8_t u8Tmp = (i16Tmp-109)/2;
                uint8_t u8Tmp2;
                if((int16_t)u8Tmp*2+109 != i16Tmp)
                    u8Tmp2=5;
                else
                    u8Tmp2=0;
                console.printf("[%02i] %02i", z+1, u8Tmp);         
                console.printf(",%iC | ", u8Tmp2);
            }
            if((z+1)%8==0)
                console.printf("\n");
        }                                        
    }
}

ds2482.h

Committer:
stefangun
Date:
2014-07-24
Revision:
0:39243a42bc87

File content as of revision 0:39243a42bc87:

#include "i2c_api.h"
#include "wait_api.h"

/* Driver Object Definition */       
struct sDS2482_t
{    
    uint32_t u32Flags;
    uint8_t u8Addr;
    
    uint8_t u8RomNr[8];
    int16_t i16LastDiscrepancy;
    int16_t i16LastFamilyDiscrepancy;
    int16_t i16LastDeviceFlag;
    uint8_t u8CRC8;
} ;

/* DS2482 Low-Level-Interface */
int8_t  i8DS2482Reset               (struct sDS2482_t *dev);
int16_t i16DS2482GetStatus          (struct sDS2482_t *dev);
int8_t  i8DS2482SetControlBits      (struct sDS2482_t *dev, uint8_t u8Flags);
// TODO: extract basic write/read function from higher-level functions below

/* 1Wire Interface Functions */
int8_t  i8DS2482_OWWait             (struct sDS2482_t *dev);
int8_t  i8DS2482_OWReset            (struct sDS2482_t *dev);
int8_t  i8DS2482_OWTouchBit         (struct sDS2482_t *dev, uint8_t sendbit);
int8_t  i8DS2482_OWReadBit          (struct sDS2482_t *dev);
int8_t  i8DS2482_OWWriteBit         (struct sDS2482_t *dev, uint8_t sendbit);
int8_t  i8DS2482_OWWriteByte        (struct sDS2482_t *dev, uint8_t sendbyte);
int16_t i16DS2482_OWReadByte        (struct sDS2482_t *dev);
int8_t  i8DS2482_OWBlock            (struct sDS2482_t *dev, uint8_t *tran_buf, uint8_t tran_len);
int16_t i16DS2482_OWTouchByte       (struct sDS2482_t *dev, uint8_t sendbyte);
int16_t i16DS2482_OWFirst           (struct sDS2482_t *dev);
int16_t i16DS2482_OWNext            (struct sDS2482_t *dev);
int16_t i16DS2482_OWSearch          (struct sDS2482_t *dev);
int16_t i16DS2482_search_triplet    (struct sDS2482_t *dev, int search_direction);
int8_t  i8DS2482_OWSelectDevice     (struct sDS2482_t *dev, uint8_t *u8SN);
int8_t  i8DS2482_OWCheckDeviceReady (struct sDS2482_t *dev);

/* DS1820-Specific High-Level-Functions */
int8_t  i8DS2482_OWStartAllDS1820   (struct sDS2482_t *dev, uint8_t u8WaitForCompletion);
int16_t i16DS2482_OWReadDS1820      (struct sDS2482_t *dev, uint8_t *u8SN, uint8_t u8ManualStart);
int8_t  i8DS2482_OWReadDS1820Precise(struct sDS2482_t *dev, uint8_t *u8SN, uint8_t u8ManualStart, int16_t *i16Temperature);

/* Helper Function */
uint8_t calc_crc8 (uint8_t *data_in, int number_of_bytes_to_read);

/* =============== USAGE EXAMPLE =============== 
#include "mbed.h"
#include "ds2482.h"

#define MAX_TEMP_SENSORS        16
#define CONNECTED_DS2482_HUBS   2

struct sDS1820_t
{    
    struct sDS2482_t *hub;
    uint8_t u8RomNr[8];
};

struct sDS1820_t sDS1820[MAX_TEMP_SENSORS];
struct sDS2482_t sDS2482[CONNECTED_DS2482_HUBS];

Serial console(USBTX, USBRX);
I2C i2c (p9, p10);

int8_t i8SetupTempSensors(void)
{
    int x=0;    
    
    sDS2482[0].u8Addr = DS2482_ADDR1;     
    sDS2482[1].u8Addr = DS2482_ADDR2;
    
    for(int loop=0; loop<2; loop++)
    {   
        int8_t i8Tmp = i8DS2482Reset(&sDS2482[loop]);
        if(i8Tmp)
            return i8Tmp;
        
        i8Tmp = i8DS2482SetControlBits(&sDS2482[loop], APU | SPU );
        if(i8Tmp)
            return i8Tmp;
        
        i8Tmp = i8DS2482_OWReset(&sDS2482[loop]);        
        if(i8Tmp) 
            return i8Tmp;
            
        while(i16DS2482_OWSearch(&sDS2482[loop]) > 0)
        {            
            sDS1820[x].hub = &sDS2482[loop];
            for(int z=0; z<8; z++)
                sDS1820[x].u8RomNr[z] = sDS2482[loop].u8RomNr[z];                        
            x++;
        }
    }  
    return x;
}

int main(void)
{
    uint8_t u8SensorCount;
    
    mbed_i2c = &i2c; 
    
    console.baud(115200);    
    
    int8_t i8Ret = i8SetupTempSensors();    
    
    if(i8Ret < 0)
    {
        console.printf("Error -i8Ret\n");    
        while(1);       // error occured
    }
    
    u8SensorCount = i8Ret;
    
    while(1)
    {
        // Start Temperature Conversion on all DS1820
        for(uint8_t loop = 0; loop < CONNECTED_DS2482_HUBS; loop++)
        {            
            i8Ret = i8DS2482_OWStartAllDS1820(&sDS2482[loop], 0);
                if(i8Ret) 
                {
                    console.printf("Error %i\n", -i8Ret);
                    while(1);   // error!            
                }
        }
        
        // Wait until all DS1820 have completed the conversion
        for(uint8_t loop = 0; loop < CONNECTED_DS2482_HUBS; loop++)        
            while(!i8DS2482_OWCheckDeviceReady(&sDS2482[loop]));                        
        
        // Get temperature values and display them
        for(uint8_t z=0; z<u8SensorCount; z++)
        {
            int16_t i16Tmp = i16DS2482_OWReadDS1820(sDS1820[z].hub, sDS1820[z].u8RomNr, 0);
            if(i16Tmp < 0)    
            {                
                console.printf("Error %i\n", -i16Tmp);
                while(1);           // error                    
            }
            else
            {
                uint8_t u8Tmp = (i16Tmp-109)/2;
                uint8_t u8Tmp2;
                if((int16_t)u8Tmp*2+109 != i16Tmp)
                    u8Tmp2=5;
                else
                    u8Tmp2=0;
                console.printf("[%02i] %02i", z+1, u8Tmp);         
                console.printf(",%iC | ", u8Tmp2);
            }
            if((z+1)%8==0)
                console.printf("\n");
        }                                        
    }
}
*/

/* HW Setup */
#define DS2482_ADDR1    0x30
#define DS2482_ADDR2    0x32

#define POLL_LIMIT      50

#define ACK     1
#define NAK     0

/* DS2482 Status Register Bit Definitions */
#define STATUS_1WB      (1<<0)
#define STATUS_PPD      (1<<1)
#define STATUS_SD       (1<<2)
#define STATUS_LL       (1<<3)
#define STATUS_RST      (1<<4)
#define STATUS_SBR      (1<<5)
#define STATUS_TSB      (1<<6)
#define STATUS_DIR      (1<<7)

/* DS2482 Config Register Definitions */
#define APU     0x1             // active pullup
#define SPU     0x4             // strong pullup
#define OWS     0x8             // 1wire speed

/* Flag Definition */
#define FLAG_SHORT      0x00000001

/* Error Codes */
#define DS2482_ERR_NOPRESENCE       2
#define DS2482_ERR_TIMEOUT          3
#define DS2482_ERR_I2CWRITE         4
#define DS2482_ERR_I2CREAD          5
#define DS2482_ERR_CONFIGMISSMATCH  6
#define DS2482_ERR_CHECKSUM         7

/* DS2482 Commands */
#define DRST    0xF0
#define SRP     0xE1
#define WCFG    0xD2
#define OWRS    0xB4
#define OWSB    0x87
#define OWWB    0xA5
#define OWRB    0x96
#define OWT     0x78

/* 1Wire CRC Definitions */
#define CRC8INIT    0x00
#define CRC8POLY    0x18