Opciones para la conexión personalizada de un sensor de temperatura con un USB 2.0 [cerrado]

0

Estoy explorando un pequeño proyecto que implicaría crear un dispositivo USB personalizado conectando un sensor de temperatura a un dispositivo USB. Parece que hay una escasez de información en línea sobre cómo hacer esto. Originalmente encontré un sensor bastante bueno que usa el protocolo de 1 cable y alguien describió cómo pudieron conectar esto con USB en este tutorial. Sin embargo, todavía tuvieron que usar una biblioteca propietaria del fabricante de 1-wire para leer los datos del sensor. Idealmente, evitaría esto y podría escribir mi propio controlador de dispositivo en C si fuera necesario.

No tengo experiencia con hardware integrado, por lo que solo trato de explorar opciones y encontrar buenos recursos para este proyecto. ¿Es posible algo como esto sin usar un SDK propietario? ¿Cuál sería un buen estándar para trabajar (1-cable, I2C, etc.)?

    
pregunta Davigor

1 respuesta

0

No, no necesita una biblioteca propietaria para bitbanging onewire. El siguiente código es de una aplicación para AVR µC Lo hice hace algunos años . Si utilizó otra familia µC, es posible que tenga que implementar las funciones especiales de Onewire / iButton crc usted mismo.

No necesitas mucho más para comunicarte con un chip esclavo onewire. La función OwReadROM () es la única que necesitaba para mi aplicación, pero puedes escribir fácilmente funciones para activar una conversión de temperatura y leer el resultado en función de eso.

Para la parte de USB, use V-USB como lo hice (solo USB1.1 de baja velocidad) o un µC habilitado para USB.

#include <avr/io.h>
#include <util/delay.h>     /* for _delay_ms() */
#include <util/crc16.h>     /* for _crc_ibutton_update() */

/*
 *  Onewire host functions.
 */
static inline void owClear(void) {
    DDRB  |= (1 << PB0);
    PORTB &= ~(1 << PB0);
}

static inline void owSet(void) {
    PORTB |= (1 << PB0);
    DDRB  &= ~(1 << PB0);
}

static inline uchar owGet(void) {
    return ((PINB & (1 << PB0)) == 0);
}


/* Onewire idle load function. */
void owIdleLoad(void) {
    /* Release OW line from master. */
    owSet();

    /* Wait 20ms to allow slaves load their power capacitor. */
    _delay_ms(20);
}


/* Onewire transfer reset */
uchar owReset(void) {
    uchar sample;

    /* Reset all slaves. */
    owClear();
    _delay_ms(0.7);

    /* Release OW line from master. */
    owSet();
    _delay_ms(0.04);

    /* Check presence pulse from slave(s). */
    sample = owGet();

    /* Wait until slaves release OW line, max. 240µs. */
    _delay_ms(0.24);

    /* Return whether some device was present on onewire. */
    return sample;
}


/* Read a single bit from onewire. */
static uchar owReadBit(void) {
    uchar sample;

    /* Send bit marker. */
    owClear();
    _delay_us(1);
    owSet();
    _delay_us(10);

    /* Check if a slave keeps pulled the OW line low. */
    sample = owGet();

    /* Wait until slaves release OW line, max. 120µs. */
    _delay_us(120);

    /* Return bit from slave. */
    return (sample?0:0x80);
}


/* Read a byte from onewire. */
uchar owReadByte(void) {
  uchar data;

    data=owReadBit();
    data>>=1;
    data|=owReadBit();
    data>>=1;
    data|=owReadBit();
    data>>=1;
    data|=owReadBit();
    data>>=1;
    data|=owReadBit();
    data>>=1;
    data|=owReadBit();
    data>>=1;
    data|=owReadBit();
    data>>=1;
    data|=owReadBit();

  return data;
}


/* Write a bit to onewire. */
static void owWriteBit(uchar bit) {
    /* Start bit marker. */
    owClear();
    _delay_us(1);

    /* If bit should be 1, immediately release OW line. */
    if (bit & 0x01) {
        /* Release OW line. */
        owSet();

        /* Wait 60µs. */
        _delay_us(60);
    } else {    
        /* Wait 60µs. */
        _delay_us(60);

        /* Release OW line. */
        owSet();
    }   
}


/* Write a byte to onewire. */
void owWriteByte(uchar data) {
    owWriteBit(data);
    data>>=1;
    owWriteBit(data);
    data>>=1;
    owWriteBit(data);
    data>>=1;
    owWriteBit(data);
    data>>=1;
    owWriteBit(data);
    data>>=1;
    owWriteBit(data);
    data>>=1;
    owWriteBit(data);
    data>>=1;
    owWriteBit(data);
}


/* Read ROM onewire command. */
uchar owReadROM(void) {
    uchar i, crc;

    /* Onewire reset. */
    if (owReset() == 0) {
        /* No slave present. Fail. */
        return 0;
    }

    /* Read ROM for DS2400 and DS2401. Other slaves will ignore this command. */
    //owWriteByte(0x0f);
    owWriteByte(0x33);

    /* Read 8 bytes answer from OW slave. */
    crc = 0;
    for (i = 0; i < 8; i++) {
        iButtonBuffer[i] = owReadByte();
        crc = _crc_ibutton_update(crc,iButtonBuffer[i]);
    }

    /* Remember the iButton ID is valid. */
    iButtonBufferValid = (crc == 0);

    /* Success if crc is 0. */
    return iButtonBufferValid;
}
    
respondido por el Janka

Lea otras preguntas en las etiquetas