#automotive #lin #no-std #linbus

no-std mcp2003a

MCP2003A LIN transceiver driver with embedded-hal traits for no-std environments

25 releases

new 0.0.24 Dec 7, 2024
0.0.23 Dec 7, 2024
0.0.22 Nov 17, 2024
0.0.16 Oct 31, 2024
0.0.4 Jun 24, 2024

#156 in Embedded development

Download history 35/week @ 2024-09-14 24/week @ 2024-09-21 5/week @ 2024-09-28 1/week @ 2024-10-05 285/week @ 2024-10-26 189/week @ 2024-11-02 18/week @ 2024-11-09 526/week @ 2024-11-16 57/week @ 2024-11-23

885 downloads per month

MIT license

38KB
447 lines

mcp2003a

Embedded Rust Microchip MCP2003A/B LIN transceiver driver with embedded-hal blocking and async traits for no-std environments.

Crates.io Documentation GitHub Repo

[!WARNING] This crate may not be suitable for production use. It was written as hands-on learning exercise of a well-documented specification. It may not cover all edge cases or vendor-specific implementations. Please use with caution.

This driver attempts to be a simple reflection of the well-documented instructions from the LIN specification: https://www.lin-cia.org/fileadmin/microsites/lin-cia.org/resources/documents/LIN_2.2A.pdf

Alternatives

Similar Projects

Supported MCP2003 Part Numbers

Tested on:

  • MCP2003A (No Longer Recommended for New Designs)
  • MCP2003E

Should also work with:

  • MCP2003B (functional drop-in replacement for MCP2003A)

References

Full Documentation: https://docs.rs/mcp2003a/latest/mcp2003a/

Features

Blocking:

  • embedded-hal = "1.0.0" - Embedded HAL traits for GPIO, UART, and Delay drivers.
  • embedded-hal-nb = "1.0.0" - Additional non-blocking traits using nb crate underneath.

Async:

  • embedded-hal-async = "1.0.0" - Async traits for async GPIO, and Delay drivers.
  • embedded-io-async = "0.6.1" - Async traits for async UART drivers.

Usage

Add the crate to your Cargo.toml:

cargo add mcp2003a

Examples

let mut mcp2003a = Mcp2003a::new(uart2_driver, break_pin_driver, delay);

let lin_bus_config = LinBusConfig {
   speed: LinBusSpeed::Baud19200,
   break_duration: LinBreakDuration::Minimum13Bits, // Test for your application
   wakeup_duration: LinWakeupDuration::Minimum250Microseconds, // Test for your application
   read_device_response_timeout: LinReadDeviceResponseTimeout::DelayMilliseconds(15), // Test for your application
   inter_frame_space: LinInterFrameSpace::DelayMilliseconds(1), // Test for your application
};
mcp2003a.init(lin_bus_config);

mcp2003a.send_wakeup();

// Works for different LIN versions, you calculate id and checksum based on your application
mcp2003a.send_frame(0x01, &[0x02, 0x03], 0x05).unwrap();

let mut read_buffer = [0u8; 8]; // Initialize the buffer to the frame's known size
let checksum = mcp2003a.read_frame(0xC1, &mut read_buffer).unwrap();

If you have async UART, GPIO, and Delay drivers that implement the embedded-hal-async traits, you can use the async methods (recommended). For example:

mcp2003a.send_frame_async(0x01, &[0x02, 0x03], 0x05).await.unwrap();

Full Examples

(More coming soon)

  • ESP-32 via ESP-RS - Example using the MCP2003A with an ESP-32 microcontroller using esp-idf-hal (std).

Dependencies

~155KB