最近的项目里面需要使用I2C外设来实现SMBus协议实现。编写了代码,测试也通过了,还是挺高兴的。在实现过程中,我发现SMBus的实现没有使用I2C的DMA接收与发送功能,当时就觉得奇怪。所以,我在实现的时候也没有规避这个问题,而是直接使用了简单的DMA发送功能。这样也可以为我的MCU节省一部分中断的开销!关键,我在测试的时候也没有发现问题。不过,今天再回头看SMBus的文档,终于发现了其中的缘由。
从上面的描述,可以清晰地看出来:SMBus是要主动拒绝非自己的响应的命令。是主动拒绝!而不是默默地丢掉帧,这也就说明了为什么不能使用DMA的方式!因为DMA方式在接收过程中,并不处理接收数据内容,DMA控制器仅仅是把数据”搬“到指定位置。
说明文档一定要看!仔细看!反复看啊!