Files
esphome-lsm6ds/esphome/components/spa06_spi/spa06_spi.cpp
T

73 lines
2.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include <cstdint>
#include <cstddef>
#include "spa06_spi.h"
#include "esphome/components/spa06_base/spa06_base.h"
#include "esphome/components/spi/spi.h"
// OR (|) register with SPA06_SPI_READ for read.
inline constexpr uint8_t SPA06_SPI_READ = 0x80;
// AND (&) register with SPA06_SPI_WRITE for write.
inline constexpr uint8_t SPA06_SPI_WRITE = 0x7F;
namespace esphome::spa06_spi {
static const char *const TAG = "spa06_spi";
void SPA06SPIComponent::dump_config() {
SPA06Component::dump_config();
LOG_SPI_DEVICE(this)
}
void SPA06SPIComponent::setup() {
this->spi_setup();
SPA06Component::setup();
}
void SPA06SPIComponent::protocol_reset() {
// Forces the device into SPI mode using a dummy read
uint8_t dummy_read = 0;
this->spa_read_byte(spa06_base::SPA06_ID, &dummy_read);
}
// In SPI mode, only 7 bits of the register addresses are used; the MSB of register address
// is not used and replaced by a read/write bit (RW = ‘0’ for write and RW = ‘1’ for read).
// Example: address 0xF7 is accessed by using SPI register address 0x77. For write access,
// the byte 0x77 is transferred, for read access, the byte 0xF7 is transferred.
// The expressions SPA06_SPI_READ (| with register) and SPA06_SPI_WRITE (& with register)
// are defined for readability.
bool SPA06SPIComponent::spa_read_byte(uint8_t a_register, uint8_t *data) {
this->enable();
this->transfer_byte(a_register | SPA06_SPI_READ);
*data = this->transfer_byte(0);
this->disable();
return true;
}
bool SPA06SPIComponent::spa_write_byte(uint8_t a_register, uint8_t data) {
this->enable();
this->transfer_byte(a_register & SPA06_SPI_WRITE);
this->transfer_byte(data);
this->disable();
return true;
}
bool SPA06SPIComponent::spa_read_bytes(uint8_t a_register, uint8_t *data, size_t len) {
this->enable();
this->transfer_byte(a_register | SPA06_SPI_READ);
this->read_array(data, len);
this->disable();
return true;
}
bool SPA06SPIComponent::spa_write_bytes(uint8_t a_register, uint8_t *data, size_t len) {
this->enable();
this->transfer_byte(a_register & SPA06_SPI_WRITE);
this->write_array(data, len);
this->disable();
return true;
}
} // namespace esphome::spa06_spi