123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- #include "hal/lsm6ds3.h"
- #include "log/esp_log.h"
- static const char* TAG = "lsm6ds3.c";
- static int32_t ICACHE_FLASH_ATTR Sensor_IO_Write(uint16_t WriteAddr, uint8_t nBytesToWrite, uint32_t *pBuffer)
- {
-
- WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105);
- PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2);
- PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2);
- PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);
- PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2);
-
- SpiAttr spiConfig;
- spiConfig.mode = SpiMode_Master;
- spiConfig.subMode = SpiSubMode_0;
- spiConfig.speed = SpiSpeed_8MHz;
- spiConfig.bitOrder = SpiBitOrder_MSBFirst;
-
- SPIInit(SpiNum_HSPI, &spiConfig);
-
- SpiData spiData;
- uint32_t addr = (WriteAddr);
- spiData.cmd = addr;
- spiData.cmdLen = 1;
- spiData.addrLen = 0;
- spiData.addr = 0;
- spiData.data = pBuffer;
- spiData.dataLen = nBytesToWrite;
-
- return SPIMasterSendData(SpiNum_HSPI, &spiData);
- }
- static int32_t ICACHE_FLASH_ATTR Sensor_IO_Read(uint16_t ReadAddr, uint8_t nBytesToRead, uint32_t *pBuffer)
- {
-
- WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105);
- PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2);
- PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2);
- PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);
- PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2);
-
- SpiAttr spiConfig;
- spiConfig.mode = SpiMode_Master;
- spiConfig.subMode = SpiSubMode_0;
- spiConfig.speed = SpiSpeed_8MHz;
- spiConfig.bitOrder = SpiBitOrder_MSBFirst;
-
- SPIInit(SpiNum_HSPI, &spiConfig);
-
- SpiData spiData;
- uint32_t addr = (ReadAddr | 0x80);
- spiData.cmd = addr;
- spiData.cmdLen = 1;
- spiData.addrLen = 0;
- spiData.addr = 0;
- spiData.data = pBuffer;
- spiData.dataLen = nBytesToRead;
- return SPIMasterRecvData(SpiNum_HSPI, &spiData);
- }
- static int32_t ICACHE_FLASH_ATTR Sensor_IO_Set_Register(uint16_t WriteAddr, uint32_t v0)
- {
- uint32_t v1;
- Sensor_IO_Write(WriteAddr, 1, &v0);
- Sensor_IO_Read(WriteAddr, 1, &v1);
- if (v0 == v1)
- return 0;
- else
- return -1;
- }
- int32_t ICACHE_FLASH_ATTR
- LSM6DS3_Enable_I2C_Pullups(uint8_t enable)
- {
- uint32_t ctrl10_c, master_config;
- Sensor_IO_Read(LSM6DS3_CTRL10_C, 1, &ctrl10_c);
- Sensor_IO_Read(LSM6DS3_MASTER_CONFIG, 1, &master_config);
- if (enable)
- {
- ctrl10_c |= LSM6DS3_FUNC_EN;
-
- master_config |= LSM6DS3_PULL_UP_EN;
- master_config &= ~LSM6DS3_MASTER_ON;
- }
- else
- {
- ctrl10_c &= ~LSM6DS3_FUNC_EN;
- master_config &= ~(LSM6DS3_PULL_UP_EN + LSM6DS3_MASTER_ON);
- }
- return (Sensor_IO_Set_Register(LSM6DS3_CTRL10_C, ctrl10_c) & Sensor_IO_Set_Register(LSM6DS3_MASTER_CONFIG, master_config));
- }
- int32_t ICACHE_FLASH_ATTR
- LSM6DS3_Enable_I2C_Bridge(uint8_t enable)
- {
- LSM6DS3_Enable_I2C_Pullups(1);
- uint32_t master_config;
- Sensor_IO_Read(LSM6DS3_MASTER_CONFIG, 1, &master_config);
- if (enable)
- {
- master_config |= LSM6DS3_PASS_THROUGH_MODE;
- }
- else
- {
- master_config &= ~LSM6DS3_PASS_THROUGH_MODE;
- }
- ESP_LOGI(TAG, "Writing %x to LSM6DS3_MASTER_CONFIG", master_config);
- return Sensor_IO_Set_Register(LSM6DS3_MASTER_CONFIG, master_config);
- }
- void ICACHE_FLASH_ATTR LSM6DS3_Reset(void)
- {
- Sensor_IO_Set_Register(LSM6DS3_CTRL3_C, BIT0);
- os_delay_us(30000);
- }
- void ICACHE_FLASH_ATTR LSM6DS3_EnableMotion(void)
- {
- Sensor_IO_Set_Register(LSM6DS3_CTRL2_G, LSM6DS3_ODR_G_POWERDOWN);
- Sensor_IO_Set_Register(LSM6DS3_CTRL1_XL, (LSM6DS3_ODR_XL_13Hz + LSM6DS3_FS_XL_2G));
- Sensor_IO_Set_Register(LSM6DS3_TAP_CFG, LSM6DS3_LIR);
- Sensor_IO_Set_Register(LSM6DS3_WAKE_UP_THS, 0x01);
- Sensor_IO_Set_Register(LSM6DS3_WAKE_UP_DUR, 0x02);
- Sensor_IO_Set_Register(LSM6DS3_MD1_CFG, LSM6DS3_INT1_WU);
- Sensor_IO_Set_Register(LSM6DS3_CTRL3_C, LSM6DS3_H_LACTIVE);
- }
- void ICACHE_FLASH_ATTR LSM6DS3_DisableMotion(void)
- {
- LSM6DS3_Reset();
- Sensor_IO_Set_Register(LSM6DS3_CTRL2_G, LSM6DS3_ODR_G_POWERDOWN);
- Sensor_IO_Set_Register(LSM6DS3_CTRL1_XL, LSM6DS3_ODR_XL_POWERDOWN);
- Sensor_IO_Set_Register(LSM6DS3_CTRL3_C, LSM6DS3_H_LACTIVE);
- }
- LSM6DS3_Interrupt_et ICACHE_FLASH_ATTR LSM6DS3_Get_Interrupts(void)
- {
- uint32_t fifo_status2, wake_up_src;
- Sensor_IO_Read(LSM6DS3_FIFO_STATUS2, 1, &fifo_status2);
- Sensor_IO_Read(LSM6DS3_WAKE_UP_SRC, 1, &wake_up_src);
- if (wake_up_src)
- {
- ESP_LOGV(TAG, "significant motion interrupt");
- return LSM6DS3_SIGN_MOTION_INT;
- }
- else if (fifo_status2 & LSM6DS3_FIFO_OVER_RUN)
- {
- ESP_LOGV(TAG, "FIFO overflow interrupt");
- return LSM6DS3_FIFO_OVERFLOW_INT;
- }
- else if (fifo_status2 & LSM6DS3_FIFO_FULL)
- {
- ESP_LOGV(TAG, "FIFO full interrupt");
- return LSM6DS3_FIFO_FULL_INT;
- }
- else
- {
- return LSM6DS3_NO_INT;
- }
- }
|