README.org

November 26, 2024 · View on GitHub

#+TITLE: AEM10900 Driver #+AUTHOR: Silvano Cortesi #+DATE: 18.11.2024 #+LICENSE: LGPL-3.0

This repository contains driver for the AEM10900 energy harvester.

#+begin_quote 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. -- [[https://e-peas.com/product/aem10900-solar-battery-charger/][e-peas]] #+end_quote

The repository is build on top of the datasheet [[https://e-peas.com/wp-content/uploads/datasheets/ds-aem10900-v1-5.pdf][DS-AEM10900-v1.5]] and contains:

** The [[file:aem10900.yaml][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 [[https://github.com/schilkp/reginald][Reginald]], based on branch schilkp/rust, commit dc4ff0d.

**** Rust version The rust version is built (from within [[file:rust/src/][rust/src/]]) using: #+begin_src sh reginald gen -i ../../aem10900.yaml -o registers.rs rs-structs --enum-derive "Debug" --struct-derive "Debug" --enum-derive "PartialEq" --struct-derive "PartialEq" #+end_src

**** C version The C version is built (from within [[file:c/][c/]]) using: #+begin_src sh reginald gen -i ../aem10900.yaml -o aem10900_reg.h c-funcpack #+end_src

**** Markdown Datasheet The [[file:aem10900_reg.md][markdown datasheet]] is build (from within [[file:README.org][/]]) by using: #+begin_src sh reginald gen -i ./aem10900.yaml -o aem10900.md md-datasheet #+end_src

** Rust driver The rust driver consists of [[file:rust/src/lib.rs][lib.rs]], [[file:rust/src/device.rs][device.rs]], [[file:rust/src/config.rs][config.rs]], [[file:rust/src/error.rs][error.rs]] and [[file:rust/src/registers.rs][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 [[file:c/aem10900.c][aem10900.c]], [[file:c/aem10900.h][aem10900.h]] and [[file:c/aem10900_reg.h][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 |