我使用Pi皮科的C/C++ SDK,并尝试在后台使用DMA读取I2C数据。但是,Pico-Examples中没有示例脚本说明如何使用DMA读取I2C数据。有一个用于SPI的脚本,名为spi-dma。但它与I2C没有直接关联,因为我必须给予器件地址沿着I2C的寄存器地址。
有谁能帮我理解一下,要使它与I2C器件一起工作,下面几行需要做哪些修改?
const uint dma_rx = dma_claim_unused_channel(true);
static uint8_t rxbuf[1024];
dma_channel_config c = dma_channel_get_default_config(dma_rx);
channel_config_set_transfer_data_size(&c, DMA_SIZE_8);
channel_config_set_dreq(&c, spi_get_dreq(spi_default, false));
channel_config_set_read_increment(&c, false);
channel_config_set_write_increment(&c, true);
dma_channel_configure(dma_rx, &c,
rxbuf, // write address
&spi_get_hw(spi_default)->dr, // read address
TEST_SIZE, // element count (each element is of size transfer_data_size)
false); // don't start yet
dma_start_channel_mask(1u << dma_rx);
dma_channel_wait_for_finish_blocking(dma_rx);
dma_channel_unclaim(dma_rx);
我知道要做一些改变
channel_config_set_dreq(&c, i2c_get_dreq(i2c_default, false));
dma_channel_configure(dma_rx, &c,
rxbuf, // write address
i2c_get_hw(i2c_default), // read address
TEST_SIZE, // element count (each element is of size transfer_data_size)
true); // don't start yet
但这之后呢?
1条答案
按热度按时间hi3rlvi21#
不喜欢SPI协议,当从I2C器件读取数据时,还需要向器件发送一些寄存器地址。
有一些帮助函数来说明这个过程。
在
gi2c_read_blocking_internal
函数中,您可以看到,首先需要写入i2c->hw->data_cmd
以控制I2C协议中的停止、重启......状态,然后可以读取i2c->hw->data_cmd
以从I2C设备获取信息。在
reg_read
函数中,首先通过调用gi2c_write_blocking
发送寄存器地址,然后可以通过调用gi2c_read_blocking
读取寄存器查看整个过程后,您需要同时触发两个DMA通道来模拟从I2C设备阅读(一个用于写入
i2c->hw->data_cmd
,一个用于读取i2c->hw->data_cmd
)。