Crate mcp2003a

Source
Expand description

§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

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

⚠️ 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.

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

§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

§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

Setup the MCP2003A instance with the UART driver, GPIO pin driver, and delay implementation (depending on the HAL you are using).

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

Then initialize the MCP2003A instance with the LIN bus configuration.

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);

Now you can use the mcp2003a instance to send and receive LIN frames.

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();

§Async Usage

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();

Modules§

config

Structs§

Mcp2003a
MCP2003A LIN Transceiver

Enums§

Mcp2003aError