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 在 嵌入式开发
每月75 次下载
56KB
1K SLoC
MCP2515
#![no_std]
与 MCP2515 CAN 控制器芯片交互的库。平台无关,已在 ATmega2560 上的 arduino-hal
上进行测试。
受以下 C++ 库的启发
Cargo 功能
默认禁用所有功能。
defmt
- 为大多数公共类型实现defmt::Format
,以便可以使用defmt::info!()
和相关函数打印它们ufmt
- 为大多数公共类型实现ufmt::uDebug
,以便可以使用ufmt::uwriteln!()
和相关函数打印它们
示例
在 examples/
文件夹中提供了某些常用微控制器的示例。
- Arduino Uno
- 轻松适配其他基于AVR的板
- Raspberry Pi Pico
- 轻松适配其他基于RP2040的板
用法
导入您平台的相应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] }
许可协议
您可以选择以下任一许可协议:
- Apache License,版本 2.0 ([LICENSE-APACHE] 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可协议 ([LICENSE-MIT] 或 http://opensource.org/licenses/MIT)
。
依赖项
~2MB
~40K SLoC