Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 100 additions & 2 deletions lib/apds9960/apds9960/device.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,105 @@
from time import sleep_ms

from apds9960.const import *
from apds9960.exceptions import *
from apds9960.const import (
APDS9960_BIT_AVALID,
APDS9960_BIT_GVALID,
APDS9960_BIT_PON,
APDS9960_BIT_PVALID,
APDS9960_DEFAULT_AGAIN,
APDS9960_DEFAULT_AIHT,
APDS9960_DEFAULT_AILT,
APDS9960_DEFAULT_ATIME,
APDS9960_DEFAULT_CONFIG1,
APDS9960_DEFAULT_CONFIG2,
APDS9960_DEFAULT_CONFIG3,
APDS9960_DEFAULT_GCONF1,
APDS9960_DEFAULT_GCONF3,
APDS9960_DEFAULT_GESTURE_PPULSE,
APDS9960_DEFAULT_GEXTH,
APDS9960_DEFAULT_GGAIN,
APDS9960_DEFAULT_GIEN,
APDS9960_DEFAULT_GLDRIVE,
APDS9960_DEFAULT_GOFFSET,
APDS9960_DEFAULT_GPENTH,
APDS9960_DEFAULT_GPULSE,
APDS9960_DEFAULT_GWTIME,
APDS9960_DEFAULT_LDRIVE,
APDS9960_DEFAULT_PERS,
APDS9960_DEFAULT_PGAIN,
APDS9960_DEFAULT_PIHT,
APDS9960_DEFAULT_PILT,
APDS9960_DEFAULT_POFFSET_DL,
APDS9960_DEFAULT_POFFSET_UR,
APDS9960_DEFAULT_PROX_PPULSE,
APDS9960_DEFAULT_WTIME,
APDS9960_DEV_ID,
APDS9960_DIR_DOWN,
APDS9960_DIR_FAR,
APDS9960_DIR_LEFT,
APDS9960_DIR_NEAR,
APDS9960_DIR_NONE,
APDS9960_DIR_RIGHT,
APDS9960_DIR_UP,
APDS9960_GESTURE_SENSITIVITY_1,
APDS9960_GESTURE_SENSITIVITY_2,
APDS9960_GESTURE_THRESHOLD_OUT,
APDS9960_I2C_ADDR,
APDS9960_LED_BOOST_300,
APDS9960_MODE_ALL,
APDS9960_MODE_AMBIENT_LIGHT,
APDS9960_MODE_GESTURE,
APDS9960_MODE_POWER,
APDS9960_MODE_PROXIMITY,
APDS9960_MODE_WAIT,
APDS9960_REG_AICLEAR,
APDS9960_REG_AIHTH,
APDS9960_REG_AIHTL,
APDS9960_REG_AILTH,
APDS9960_REG_AILTL,
APDS9960_REG_ATIME,
APDS9960_REG_BDATAH,
APDS9960_REG_BDATAL,
APDS9960_REG_CDATAH,
APDS9960_REG_CDATAL,
APDS9960_REG_CONFIG1,
APDS9960_REG_CONFIG2,
APDS9960_REG_CONFIG3,
APDS9960_REG_CONTROL,
APDS9960_REG_ENABLE,
APDS9960_REG_GCONF1,
APDS9960_REG_GCONF2,
APDS9960_REG_GCONF3,
APDS9960_REG_GCONF4,
APDS9960_REG_GDATAH,
APDS9960_REG_GDATAL,
APDS9960_REG_GEXTH,
APDS9960_REG_GFIFO_U,
APDS9960_REG_GFLVL,
APDS9960_REG_GOFFSET_D,
APDS9960_REG_GOFFSET_L,
APDS9960_REG_GOFFSET_R,
APDS9960_REG_GOFFSET_U,
APDS9960_REG_GPENTH,
APDS9960_REG_GPULSE,
APDS9960_REG_GSTATUS,
APDS9960_REG_ID,
APDS9960_REG_PDATA,
APDS9960_REG_PERS,
APDS9960_REG_PICLEAR,
APDS9960_REG_PIHT,
APDS9960_REG_PILT,
APDS9960_REG_POFFSET_DL,
APDS9960_REG_POFFSET_UR,
APDS9960_REG_PPULSE,
APDS9960_REG_RDATAH,
APDS9960_REG_RDATAL,
APDS9960_REG_STATUS,
APDS9960_REG_WTIME,
APDS9960_STATE_FAR,
APDS9960_STATE_NEAR,
APDS9960_TIME_FIFO_PAUSE,
)
from apds9960.exceptions import APDS9960InvalidDevId, APDS9960InvalidMode


class APDS9960(object):
Expand Down
54 changes: 52 additions & 2 deletions lib/bq27441/bq27441/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,58 @@

from machine import Pin

from bq27441.const import *
from bq27441.exceptions import *
from bq27441.const import (
BQ27441_COMMAND_AVAIL_CAPACITY,
BQ27441_COMMAND_AVG_CURRENT,
BQ27441_COMMAND_AVG_POWER,
BQ27441_COMMAND_FLAGS,
BQ27441_COMMAND_FULL_CAP_FIL,
BQ27441_COMMAND_FULL_CAP_UNFL,
BQ27441_COMMAND_FULL_CAPACITY,
BQ27441_COMMAND_INT_TEMP,
BQ27441_COMMAND_MAX_CURRENT,
BQ27441_COMMAND_NOM_CAPACITY,
BQ27441_COMMAND_REM_CAP_FIL,
BQ27441_COMMAND_REM_CAP_UNFL,
BQ27441_COMMAND_REM_CAPACITY,
BQ27441_COMMAND_SOC,
BQ27441_COMMAND_SOC_UNFL,
BQ27441_COMMAND_SOH,
BQ27441_COMMAND_STDBY_CURRENT,
BQ27441_COMMAND_TEMP,
BQ27441_COMMAND_VOLTAGE,
BQ27441_CONTROL_DEVICE_TYPE,
BQ27441_CONTROL_EXIT_CFGUPDATE,
BQ27441_CONTROL_PULSE_SOC_INT,
BQ27441_CONTROL_RESET,
BQ27441_CONTROL_SEALED,
BQ27441_CONTROL_SET_CFGUPDATE,
BQ27441_CONTROL_SHUTDOWN,
BQ27441_CONTROL_SHUTDOWN_ENABLE,
BQ27441_CONTROL_SOFT_RESET,
BQ27441_CONTROL_STATUS,
BQ27441_DEVICE_ID,
BQ27441_EXTENDED_BLOCKDATA,
BQ27441_EXTENDED_CAPACITY,
BQ27441_EXTENDED_CHECKSUM,
BQ27441_EXTENDED_CONTROL,
BQ27441_EXTENDED_DATABLOCK,
BQ27441_EXTENDED_DATACLASS,
BQ27441_EXTENDED_OPCONFIG,
BQ27441_FLAG_CFGUPMODE,
BQ27441_FLAG_SOC1,
BQ27441_FLAG_SOCF,
BQ27441_I2C_ADDRESS,
BQ27441_I2C_TIMEOUT,
BQ27441_ID_DISCHARGE,
BQ27441_ID_REGISTERS,
BQ27441_ID_STATE,
BQ27441_OPCONFIG_BATLOWEN,
BQ27441_OPCONFIG_GPIOPOL,
BQ27441_STATUS_SS,
BQ27441_UNSEAL_KEY,
LIPO_BATTERY_CAPACITY,
)


# Parameters for the current() function, to specify which current to read
Expand Down
119 changes: 119 additions & 0 deletions lib/daplink_bridge/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
# DAPLink Bridge MicroPython Driver

Low-level I2C bridge driver for the **STM32F103 DAPLink interface** on the STeaMi board.

This driver handles all direct I2C communication with the bridge: device identification, status/error registers, busy polling, and persistent config zone access (1 KB internal flash).

# I2C Address

Default 7-bit I2C address: `0x3B`

# Basic Usage

```python
from machine import I2C
from daplink_bridge import DaplinkBridge

i2c = I2C(1)
bridge = DaplinkBridge(i2c)

print("WHO_AM_I:", hex(bridge.device_id()))
print("Busy:", bridge.busy())
```

# API

## Initialization

```python
bridge = DaplinkBridge(i2c, address=0x3B)
```

Create a new DAPLink bridge instance.

Parameters:

* `i2c`: initialized MicroPython `I2C` bus
* `address`: I2C address of the bridge, default is `0x3B`

## Device identification

### `device_id()`

```python
bridge.device_id()
```

Read the `WHO_AM_I` register. Expected value: `0x4C`.

## Status

### `busy()`

```python
bridge.busy()
```

Returns `True` if the bridge is currently busy, otherwise `False`.

## Config zone

The config zone is a **1 KB persistent storage area** in the STM32F103 internal flash. It is separate from the external flash file storage and survives `clear_flash()` operations.

### `clear_config()`

```python
bridge.clear_config()
```

Erase the entire config zone. Raises `OSError` if the operation fails.

### `write_config(data, offset=0)`

```python
bridge.write_config("board_rev=3", offset=0)
bridge.write_config(b"\x01\x02\x03", offset=100)
```

Write data into the config zone at the given byte offset.

Parameters:

* `data`: `str` or `bytes`
* `offset`: byte offset in the range `0` to `1023`

Notes:

* existing data outside the written range is preserved
* raises `ValueError` if the write would go out of bounds
* raises `OSError` if the bridge reports a write error

### `read_config()`

```python
cfg = bridge.read_config()
```

Read back config zone content.

Returns:

* `bytes` up to the first `0xFF`
* `b""` if the config zone is empty

# Architecture

```
steami_config ──┐
├──→ daplink_bridge ──→ I2C (STM32F103)
daplink_flash ──┘
```

* [`daplink_flash`](../daplink_flash/README.md) — high-level flash file operations
* [`steami_config`](../steami_config/README.md) — persistent board configuration (JSON)

# Notes

* The bridge uses a `WHO_AM_I` value of `0x4C`.
* The config zone (1 KB) is separate from the external flash file area.
* All I2C operations go through private helpers (`_read_reg`, `_write_reg`, `_writeto`, `_readfrom`).
14 changes: 13 additions & 1 deletion lib/daplink_bridge/daplink_bridge/device.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,18 @@
from time import sleep_ms

from daplink_bridge.const import *
from daplink_bridge.const import (
CMD_CLEAR_CONFIG,
CMD_READ_CONFIG,
CMD_WHO_AM_I,
CMD_WRITE_CONFIG,
CONFIG_SIZE,
DAPLINK_BRIDGE_DEFAULT_ADDR,
MAX_WRITE_CHUNK,
REG_ERROR,
REG_STATUS,
SECTOR_SIZE,
STATUS_BUSY,
)


class DaplinkBridge(object):
Expand Down
13 changes: 12 additions & 1 deletion lib/daplink_flash/daplink_flash/device.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,17 @@
from time import sleep_ms

from daplink_flash.const import *
from daplink_flash.const import (
CMD_CLEAR_FLASH,
CMD_GET_FILENAME,
CMD_READ_SECTOR,
CMD_SET_FILENAME,
CMD_WRITE_DATA,
EXT_LEN,
FILENAME_LEN,
MAX_SECTORS,
MAX_WRITE_CHUNK,
SECTOR_SIZE,
)


class DaplinkFlash(object):
Expand Down
29 changes: 26 additions & 3 deletions lib/hts221/hts221/device.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,31 @@
from time import sleep_ms

from machine import I2C

from hts221.const import *
from hts221.const import (
HTS221_AV_CONF,
HTS221_CTRL1_BDU,
HTS221_CTRL1_ODR_MASK,
HTS221_CTRL1_PD,
HTS221_CTRL2_BOOT,
HTS221_CTRL2_ONE_SHOT,
HTS221_CTRL_REG1,
HTS221_CTRL_REG2,
HTS221_H0_T0_OUT_L,
HTS221_H1_T0_OUT_L,
HTS221_HUMIDITY_OUT_L,
HTS221_STATUS_H_DA,
HTS221_STATUS_REG,
HTS221_STATUS_T_DA,
HTS221_T0_OUT_L,
HTS221_T1_OUT_L,
HTS221_TEMP_OUT_L,
HTS221_WHO_AM_I,
HTS_I2C_ADDR,
HTS221_H0_rH_x2,
HTS221_H1_rH_x2,
HTS221_T0_degC_x8,
HTS221_T1_degC_x8,
HTS221_T1T0_msb,
)


def int16(d):
Expand Down
Loading
Loading