mcp2003a
Embedded Rust Microchip MCP2003A/B LIN transceiver driver with embedded-hal blocking and async traits for no-std environments.
[!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
- https://github.com/Skuzee/LIN_BUS_lib-Skuzee (Arduino)
- https://github.com/NaokiS28/LINduino - (Arduino)
- https://github.com/Sensirion/lin-bus-rs - (Rust)
- https://github.com/fernpedro/Two-node-LIN-cluster-with-Arduino - (Arduino)
- Includes wiring diagram, walkthrough, and photo of a LIN frame on an oscilloscope
- https://forum.arduino.cc/t/sending-data-using-lin-cominication/1178509 - (Arduino) (forum post with example code)
- https://github.com/gandrewstone/LIN - (C++)
- https://github.com/fernpedro/LIN-frame-Header-implementation - (C++)
Similar Projects
- https://github.com/matt2005/LIN-1 - (C++) Supports LIN on MCP2025
- https://github.com/macchina/LIN - (C++) (Arduino library to add dual LIN support on SAM3X based boards with a TJA1021/TJA1027 transceiver)
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
- MCP2003A Product Page
- MCP2003/4/3A/4A Datasheet
- MCP2003A to MCP2003B Migration Guide
- MCP2003B Datasheet
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 usingnbcrate 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 = new;
let lin_bus_config = LinBusConfig ;
mcp2003a.init;
mcp2003a.send_wakeup;
// Works for different LIN versions, you calculate id and checksum based on your application
mcp2003a.send_frame.unwrap;
let mut read_buffer = ; // Initialize the buffer to the frame's known size
let checksum = mcp2003a.read_frame.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.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).