#led-driver #led #driver #embedded-hal-driver #embedded-hal #lp5012 #lp5009

no-std lp50xx

A simple platform agnostic library for the Texas Instruments LP50XX led driver

6 releases

0.1.1 Aug 14, 2024
0.0.5 Jul 15, 2024
0.0.4 Jul 8, 2022
0.0.3 Nov 21, 2021
0.0.2 Aug 29, 2021

#213 in Embedded development

34 downloads per month

MIT license

18KB
272 lines

lp50xx

Embedded driver for the Texas Instruments LP5009 and LP5012 LED drivers

description

The LP50xx device is an 9- or 12-channel constant current sink LED driver. The LP50xx device includes integrated color mixing and brightness control, and pre-configuration simplifies the software coding process. Integrated 12-bit, 29-kHz PWM generators for each channel enable smooth, vivid color for LEDs, and eliminate audible noise.

example

Examples are based on the stm32h7xx_hal.

// Initialize I2C pins, SCL, SDA
let scl = scl
    .into_alternate_af4()
    .internal_pull_up(true)
    .set_open_drain();
let sda = sda
    .into_alternate_af4()
    .internal_pull_up(true)
    .set_open_drain();

// Initialize the Enable line
let en = en.into_push_pull_output();

// Initialize 
let i2c: stm32h7xx_hal::i2c::I2c<I2C1> =
    i2c.i2c((scl, sda), 100.khz(), prec, clocks);

// Initialize with blocking I2C
let interface = LP50xx::init_with_i2c(Model::LP5012, i2c, en);
// Use the LP50xx in monochromatic mode
let mut monochromatic_controller = interface.into_monochromatic_mode();
// Enable it, this requires a delay provider
monochromatic_controller.enable(delay).ok();
// Set LED 5 to 255
monochromatic_controller.set(5, 0xFF).ok();

// The continuous addressing feature is enabled by default, allowing you to address
// multiple LP50xx devices on the same bus in an intuitive way.
// There are 12 LEDs available per LP5012, therefore the following command
// will illuminate the 1st LED on the on the second LP5012:
monochromatic_controller.set(13, 0xFF).ok();
// You can turn this feature off and set the active address manually also:
monochromatic_controller.set_continuous_addressing(false);
// Set the active address to be the second device
monochromatic_controller.set_active_address(0x01);
// And then turn off the same 1st LED on the second device
monochromatic_controller.set(1, 0x00).ok();

// Alternatively, if you are using RGB LEDs you can use the LP50xx in color mode
let mut color_controller = monochromatic_controller.into_color_mode();
// Set channel 1 brightness and RGB values
color_controller.set(1, (1, [255, 100, 95])).ok();

// Release the blocking i2c example to regain access to its underyling resources
let (_i2c, en) = color_controller.release();

// Additionally, if you need to integrate this driver with platform specific DMA controllers then
// a flexible callback can be used rather than blocking i2c
static mut DMA_BUFFER: [u8; 256] = [0; 256];
let interface = LP50xx::init_with_callback(Model::LP5012, en, |addr, data| unsafe {
    // Copy the data from the LP50xx into the DMA buffer for processing
    DMA_BUFFER[0..data.len()].copy_from_slice(data);
})
.into_monochromatic_mode();

contributing

Feel free to create a ticket and a MR for any changes you would like to see in this library.

Dependencies

~56KB