--- author: Silvano Cortesi date: 18.11.2024 title: AEM10900 Driver --- ```{=org} #+LICENSE: LGPL-3.0 ``` This repository contains driver for the AEM10900 energy harvester. > The AEM10900 is a fully integrated and compact battery charger circuit > that extracts DC power from a solar cell to store energy in a > rechargeable battery. This compact and ultra- efficient battery > charger allows to extend battery lifetime and eliminates the primary > energy storage in a large range of wireless application, such as > wearable and medical applications and Smart sensors. Thanks to its > Maximum Power Point Tracking and its ultra-low power boost converter, > the AEM10900 harvests the maximum available input power from a source > to charge a storage element, such as a Li-ion battery. The boost > converter operates with input voltages in a range from 115 mV to 1.5 > V. With its unique cold-start circuit, it can start operating with an > input voltage as low as 250 mV and an input power of only 5 μW. The > output voltages are in a range of 2.8 V to 4.8 V. -- > [e-peas](https://e-peas.com/product/aem10900-solar-battery-charger/) The repository is build on top of the datasheet [DS-AEM10900-v1.5](https://e-peas.com/wp-content/uploads/datasheets/ds-aem10900-v1-5.pdf) and contains: ## The [YAML](aem10900.yaml) specification of the driver, as used by Reginald to create the struct fields ### YAML Transpile Instruction The yaml file can be automatically parsed using [Reginald](https://github.com/schilkp/reginald), based on branch `schilkp/rust`, commit `dc4ff0d`. 1. Rust version The rust version is built (from within [rust*src*](rust/src/)) using: ``` {.bash org-language="sh"} reginald gen -i ../../aem10900.yaml -o registers.rs rs-structs --enum-derive "Debug" --struct-derive "Debug" --enum-derive "PartialEq" --struct-derive "PartialEq" ``` 2. C version The C version is built (from within [c/](c/)) using: ``` {.bash org-language="sh"} reginald gen -i ../aem10900.yaml -o aem10900_reg.h c-funcpack ``` 3. Markdown Datasheet The [markdown datasheet](aem10900_reg.md) is build (from within [/](README.org)) by using: ``` {.bash org-language="sh"} reginald gen -i ./aem10900.yaml -o aem10900.md md-datasheet ``` ## Rust driver The rust driver consists of [lib.rs](rust/src/lib.rs), [device.rs](rust/src/device.rs), [config.rs](rust/src/config.rs), [error.rs](rust/src/error.rs) and [registers.rs](rust/src/registers.rs). `registers.rs` is the only auto-created file using reginald, and contains the register structs as well as pack/unpack functions. ## C driver The C driver consists of [aem10900.c](c/aem10900.c), [aem10900.h](c/aem10900.h) and [aem10900~reg~.h](c/aem10900_reg.h). `aem10900_reg.h` is the only auto-created file using reginald, and contains the register structs as well as pack/unpack functions. ## Example projects for C and Rust The example projects make automatically use of the drivers described above, and can be used as a reference for the implementation. The following pinout holds: Peripheral Functionality ------------- --------------------------------------- I2C1 I2C peripheral used for communication PB8 SCL pin used together with I2C1 PB7 SDA pin used together with I2C1 GPDMA1~CH0~ DMA channel for TX on I2C1 GPDMA1~CH1~ DMA channel for RX on I2C1