#can #controller #chips #microcontrollers #platform-agnostic #frame #arduino-mcp2515

无需std mcp2515

#![no_std] 与 MCP2515 CAN 控制器芯片交互的库

5 个版本

0.2.2 2022年11月7日
0.2.1 2022年11月4日
0.2.0 2022年10月7日
0.1.1 2022年3月31日
0.1.0 2022年3月30日

#448嵌入式开发

Download history 12/week @ 2024-03-12 21/week @ 2024-03-19 4/week @ 2024-03-26 28/week @ 2024-04-02 44/week @ 2024-04-09 67/week @ 2024-04-16 4/week @ 2024-05-21 1/week @ 2024-05-28 1/week @ 2024-06-04 18/week @ 2024-06-11 45/week @ 2024-06-18 11/week @ 2024-06-25

每月75 次下载

MIT/Apache

56KB
1K SLoC

MCP2515

#![no_std] 与 MCP2515 CAN 控制器芯片交互的库。平台无关,已在 ATmega2560 上的 arduino-hal 上进行测试。

受以下 C++ 库的启发

Cargo 功能

默认禁用所有功能。

  • defmt - 为大多数公共类型实现 defmt::Format,以便可以使用 defmt::info!() 和相关函数打印它们
  • ufmt - 为大多数公共类型实现 ufmt::uDebug,以便可以使用 ufmt::uwriteln!() 和相关函数打印它们

示例

examples/ 文件夹中提供了某些常用微控制器的示例。

用法

导入您平台的相应HAL存储库。在此示例中,我在ATmega2560上使用 arduino-hal

#![no_std]
#![no_main]

use arduino_hal::{spi::Settings, Delay, Spi};
use core::fmt::Write;
use embedded_hal::can::{ExtendedId, Frame, Id};
use mcp2515::{error::Error, frame::CanFrame, regs::OpMode, CanSpeed, McpSpeed, MCP2515};

#[panic_handler]
fn panic(_: &core::panic::PanicInfo) -> ! {
    loop {}
}

#[arduino_hal::entry]
fn main() -> ! {
    let dp = arduino_hal::Peripherals::take().unwrap();
    let pins = arduino_hal::pins!(dp);

    let mut delay = Delay::new();

    let mut serial = arduino_hal::default_serial!(dp, pins, 115200);
    let (spi, cs) = Spi::new(
        dp.SPI,
        pins.d52.into_output(),
        pins.d51.into_output(),
        pins.d50.into_pull_up_input(),
        pins.d53.into_output(),
        Settings {
            data_order: arduino_hal::spi::DataOrder::MostSignificantFirst,
            clock: arduino_hal::spi::SerialClockRate::OscfOver128,
            mode: embedded_hal::spi::MODE_0,
        },
    );
    let mut can = MCP2515::new(spi, cs);
    can.init(
        &mut delay,
        mcp2515::Settings {
            mode: OpMode::Loopback,       // Loopback for testing and example
            can_speed: CanSpeed::Kbps100, // Many options supported.
            mcp_speed: McpSpeed::MHz8,    // Currently 16MHz and 8MHz chips are supported.
            clkout_en: false,
        }
    )
    .unwrap();

    loop {
        // Send a message
        let frame = CanFrame::new(
            Id::Extended(ExtendedId::MAX),
            &[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08],
        )
        .unwrap();
        can.send_message(frame).unwrap();
        writeln!(&mut serial, "Sent message!").unwrap();

        // Read the message back (we are in loopback mode)
        match can.read_message() {
            Ok(frame) => {
                writeln!(&mut serial, "Received frame {:?}", frame).unwrap();
            }
            Err(Error::NoMessage) => writeln!(&mut serial, "No message to read!").unwrap(),
            Err(_) => panic!("Oh no!"),
        }

        arduino_hal::delay_ms(1000);
    }
}

串行输出

Sent message!
No message to read!
Sent message!
Received frame CanFrame { id: Extended(ExtendedId(536870911)), rtr: false, dlc: 8, data: [1, 2, 3, 4, 5, 6, 7, 8] }
Sent message!
Received frame CanFrame { id: Extended(ExtendedId(536870911)), rtr: false, dlc: 8, data: [1, 2, 3, 4, 5, 6, 7, 8] }
Sent message!
Received frame CanFrame { id: Extended(ExtendedId(536870911)), rtr: false, dlc: 8, data: [1, 2, 3, 4, 5, 6, 7, 8] }

许可协议

您可以选择以下任一许可协议:

依赖项

~2MB
~40K SLoC