Estoy trabajando en un proyecto que utiliza el acelerómetro LIS2DH12 de ST ( página del producto ). Tengo un par de preguntas al respecto, y como es una parte bastante común, me pregunto si alguien aquí sabe las respuestas:
Me gustaría saber si es posible activar dos interrupciones, marca de agua y desbordamiento, en el mismo pin. Intenté configurarlas, habilitando las interrupciones de enclavamiento en INT1 en CTRL_REG5 y configurando tanto la marca de agua como el desbordamiento en CTRL_REG3. Cuando obtengo un registro de marca de agua, leo INT1_SRC, pero eso devuelve 0 (esperaría que devolviera 0x80, interrupción activa) y no borra las interrupciones. No sé si la interrupción de desbordamiento alguna vez se activa, ya que no puedo borrar la marca de agua sin leer el FIFO (esperaría que al habilitar las interrupciones de enganche, podría eliminar la interrupción al leer INT1_SRC, y luego dejar las muestras sin leer para activar la interrupción de desbordamiento).
En caso de que alguien pregunte por qué haría esto, estoy un poco paranoico y no quiero perder una interrupción y terminar perdiendo datos. Además, sé que tengo un segundo pin INT, pero no puedo usarlo en este momento.
//Setup code
// set increment bit so we can write to multiple registers with one SPI command
accel_transfer_buf[0] = LIS2DH12_REG_CTRL_REG0 | LIS2DH12_MULTI_BYTE_RW; //The register address will increment on every write
// CTRL_CFG_REG0
accel_transfer_buf[1] = 0x10; //Magic word of the CTRL_REG0, it needs to be that.
// TEMP_CFG_REG
accel_transfer_buf[2] = LIS2DH_settings.tempEnabled;
// CTRL_CFG_REG1
accel_transfer_buf[3] = 0; //Don't write to ctrl1 yet, as that will turn the accelerometer on, do it as the last step in the config
// CTRL_CFG_REG2
accel_transfer_buf[4] = 0; //Disable High pass filters, see AN5005
// CTRL_CFG_REG3
accel_transfer_buf[5] = LIS2DH12_BITS_I1_WTM; //Interrupts enabled in INT1 pin: watermark
// CTRL_CFG_REG4
//Block data update enabled(AN5005), big endian, accelerometer range, normal mode 10bit, 4 wire SPI
accel_transfer_buf[6] = LIS2DH12_BITS_BDU | LIS2DH_settings.accelRange | LIS2DH_settings.HiResMode;
// CTRL_CFG_REG5
accel_transfer_buf[7] = LIS2DH_settings.fifoEnabled | LIS2DH12_BITS_LIR1; //enable fifo, interrupts latched
// CTRL_CFG_REG6
accel_transfer_buf[8] = 0; //No int on INT2 pin (it's disconnected anyway). Interrupt polarity set to active High
// REFERENCE
accel_transfer_buf[9] = 0; //Reference for interrupts
[...]
//Later on...
accel_transfer_buf[10] = LIS2DH12_REG_FIFO_CTRL_REG;
accel_transfer_buf[1] = LIS2DH_settings.fifoMode | ((FIFO_THRESHOLD - 1) & 0x1F);
[...]
//and finally
accel_transfer_buf[0] = LIS2DH12_REG_CTRL_REG1;
accel_transfer_buf[1] = LIS2DH_settings.accelSampleRate | LIS2DH_settings.HPLPmode | LIS2DH_settings.zAccelEnabled | LIS2DH_settings.yAccelEnabled | LIS2DH_settings.xAccelEnabled;
Cuando recibo una interrupción, lo hago
accel_transfer_buf[0] = LIS2DH12_REG_INT1_SRC | LIS2DH12_READ_REGISTER;
uint32_t errorCode = SPIDRV_MTransferB(spi_handle0, accel_transfer_buf, accel_transfer_buf, 2);
checkErrorCode(errorCode, "DEBUG");
debug_logln(VERBOSE, "Accel Int: 0x%02X", accel_transfer_buf[1]);
Y esperaría obtener 0x80
, pero obtengo 0x00
(y no hay errores en la transferencia).
1) ¿Sabe si lo que estoy haciendo con las interrupciones enclavadas es correcto?
2) ¿Sabes si es posible lo que estoy tratando de lograr con las dos ints en el mismo pin?
¡Gracias!