1个不稳定版本
0.1.0 | 2021年7月11日 |
---|
#1026 in 嵌入式开发
37KB
925 行
mcp25625
支持传输、接收和过滤,并提供方便的API。
定义一些类型以保持代码整洁
pub type Mcp25625Sck = PB3<Analog>;
pub type Mcp25625Miso = PA11<Analog>;
pub type Mcp25625Mosi = PA12<Analog>;
pub type Mcp25625IrqUninit = PA10<Analog>;
pub type Mcp25625Cs = PA9<Output<PushPull>>;
pub type Mcp25625Spi = hal::pac::SPI1;
pub type Mcp25625Instance = mcp25625::MCP25625<hal::spi::Spi<Mcp25625Spi, (Mcp25625Sck, Mcp25625Miso, Mcp25625Mosi)>, Mcp25625Cs>;
也定义了要使用的过滤器
const MOTOR_DRIVE_ID: FrameId = FrameId::new_extended(0x1).unwrap();
const EMERGENCY_STOP_ID: FrameId = FrameId::new_standard(0x0).unwrap();
设置过滤器和配置
fn mcp25625_configure(mcp25625: &mut config::Mcp25625Instance) -> Result<(), McpErrorKind> {
let filters_buffer0 = FiltersConfigBuffer0 {
mask: FiltersMask::AllExtendedIdBits,
filter0: config::MOTOR_DRIVE_ID,
filter1: None
};
let filters_buffer1 = FiltersConfigBuffer1 {
mask: FiltersMask::OnlyStandardIdBits,
filter2: config::EMERGENCY_STOP_ID,
filter3: None,
filter4: None,
filter5: None,
};
let filters_config = FiltersConfig::Filter(filters_buffer0, Some(filters_buffer1));
let mcp_config = MCP25625Config {
brp: 0, // Fosc=16MHz
prop_seg: 3,
ph_seg1: 2,
ph_seg2: 2,
sync_jump_width: 2,
rollover_to_buffer1: true,
filters_config,
// filters_config: FiltersConfig::ReceiveAll,
operation_mode: McpOperationMode::Normal
};
mcp25625.apply_config(mcp_config)?;
Ok(())
}
未使用的过滤器插槽将被最后使用的一个填充。所以在这个例子中 filter1
= filter0
和 filter3-5
= filter2
。
启用中断
mcp25625.enable_interrupts(0b0001_1111);
接收一个帧
let intf = mcp25625.interrupt_flags();
if intf.rx0if_is_set() {
let frame: vhrdcan::RawFrame = mcp25625.receive(McpReceiveBuffer::Buffer0);
println!("{:?}", frame);
}
// Check Buffer1 also depending on the configuration
发送一个帧
// Create RawFrameRef if you do not want to make unnecesarry copies
// or use Frame::as_raw_frame_ref() or RawFrame::as_raw_frame_ref()
let data = [1, 2, 3];
let frame = vhrdcan::RawFrameRef {
id: vhrdcan::FrameId::new_standard(0x10).unwrap(),
data: &data
};
match mcp25625.send(frame) {
Ok(_) => {
println!("Frame queued for transmission");
}
Err(e) => {
println!("Frame transmission error: {:?}", e);
}
}
更多高级示例请参阅此文件,其中包含热重新初始化、中断以及适当的传输和接收队列。
依赖关系
~3MB
~57K SLoC