如何在Rust结构实现中编写SPI DMA代码?

如何在Rust结构实现中编写SPI DMA代码?,rust,embedded,stm32,spi,dma,Rust,Embedded,Stm32,Spi,Dma,我正在尝试使用STM32 SPI DMA编写一个Rust设备驱动程序。SPI DMA代码非常简单,但其特点非常复杂。我不知道如何让编译器接受在wait调用中失败的以下代码 impl DeviceDriver 其中,SpiTxDma:WriteDma只有在TxDma实现时才定义wait方法,这是具体类型C5的情况,但不适用于无约束类型参数CH。尝试向代码中添加约束: impl<SPI, REMAP, PINS, CH> DeviceDriver<SpiTxDma<SPI,

我正在尝试使用STM32 SPI DMA编写一个Rust设备驱动程序。SPI DMA代码非常简单,但其特点非常复杂。我不知道如何让编译器接受在
wait
调用中失败的以下代码

impl DeviceDriver

其中,SpiTxDma:WriteDma只有在
TxDma
实现时才定义
wait
方法,这是具体类型
C5
的情况,但不适用于无约束类型参数
CH
。尝试向代码中添加约束:

impl<SPI, REMAP, PINS, CH> DeviceDriver<SpiTxDma<SPI, REMAP, PINS, CH>>
where SpiTxDma<SPI, REMAP, PINS, CH>: WriteDma<&'static mut [u8], u8>,
      TxDma<SpiPayload<SPI, REMAP, PINS>, CH>: TransferPayload,
{
    pub fn send(&mut self) {
        if let (Some(spi), Some(buf)) = (self.spi.take(), self.buf.take()) {
            let transfer = spi.write(buf);
            let (buf, spi) = transfer.wait();
            self.buf = Some(buf);
            self.spi = Some(spi);
        }
    }
}
impl DeviceDriver

其中SpiTxDma:WriteDmaThis会导致相同的错误。
impl<SPI, REMAP, PINS, CH> DeviceDriver<SpiTxDma<SPI, REMAP, PINS, CH>>
where SpiTxDma<SPI, REMAP, PINS, CH>: WriteDma<&'static mut [u8], u8>,
      TxDma<SpiPayload<SPI, REMAP, PINS>, CH>: TransferPayload,
{
    pub fn send(&mut self) {
        if let (Some(spi), Some(buf)) = (self.spi.take(), self.buf.take()) {
            let transfer = spi.write(buf);
            let (buf, spi) = transfer.wait();
            self.buf = Some(buf);
            self.spi = Some(spi);
        }
    }
}