⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
2个帖子/ 0新
最后一篇
Eric Sc​​ammell.
离线
最后一次露面:3年1个月前
加入:2017-03-15 13:28
I2C DMA

你好,

我正在使用I2C与传感器通信,并且需要使用DMA进行高带宽读取操作。
我能够让传感器准备好发送数据,并且如果我将0x0100写入i2c_data_cmd_reg(如在i2c_eeprom.c中所做的),则可以看到正在传输的数据。
我尚未管理的是使用DMA完成此交换。我可以通过写入i2c_data_cmd_reg不止一次,队列几个读取,但如果可以的话,我没有解决
让DMA自动化该过程。

有谁可以告诉我我需要做些什么来通过DMA从I2C奴隶中获取数据?

谢谢,
埃里克

关键词:
设备:
mt_dialog.
离线
最后一次露面:4个月1周前
职员
加入:2015-06-08 11:34
嗨埃里克,

嗨埃里克,

使用DMA使用I2C的示例,为了使其在读取中工作,例如,您需要编写要手动读取,手动读取的从设备的地址,以便将设备输出。从站和从属寄存器的地址,上面应该足够快,以便模块不发送停止条件。因此,您必须配置两个DMA通道才能编写和读取,您需要设置一个频道,该通道将具有I2C_DATA_CMD_REG的源,并作为BUFFER的目标(使用DMA_SETUP STRUCT以传递配置)。设置接收方面后,需要设置发送通道,以便从DMA发送到I2C模块,以便通过写入I2C_DATA_CMD_REG来生成时钟,值0x100设置该位以读取并生成时钟。因此,第二通道的源地址将是具有值0x100的变量,目标地址将是I2C_DATA_CMD_REG。设置后,通道通过DMA_Initialization_Function()初始化它们(应为每个通道调用两次),然后通过DMA_CHANNEL_ENABLE()启用DMA(每个频道再次调用一个调用。因此,在完成DMA的设置后,您将不得不发送手动写命令,然后通过setword16(i2c_dma_cr_reg,tdmae + rdmae)启用DMA之后;

谢谢mt_dialog.