同步和异步I2C在嵌入式编程中有什么区别?有人能用一个例子来解释这一点吗?什么时候使用它们?
发布于 2021-02-12 08:10:44
I2C是一种同步协议,这意味着通信方不需要事先同意一定的速度--考虑一下RS-232这样的异步串行线路,在这种情况下,如果各方不使用相同的波特率,通信就无法成功。
有人提到的同步/异步,说到i2c,它在另一个级别,我们可以称之为API。同步API (或例程)将启动通信,在整个数据被发送或接收之前不会返回对程序的控制。完成传输所需的时间将无法用于该程序。
如果通信是异步的,则调用程序可以调用i2c驱动程序,然后继续其工作。稍后,应该通知程序(或者程序应该检查)事务的结果:“写/读还在进行吗?”;如果它被终止了,它是否进行得很好?
同步/异步在i2c上下文中可以被认为与磁盘(文件)I/O相同:通常使用同步磁盘访问,这是简单而有效的:读取内存中的一些数据,检查读取是否正常,对数据做一些处理,然后继续进行。在异步方式下,程序会说“我需要这些数据: I/O驱动程序,请在我执行其他操作时获取它们;当数据可用时,我将使用这些数据”。
i2c的异步模式可能令人愉快,特别是因为与其他交换数据的方式相比,i2c速度慢。另一方面,i2c只用于很少的数据,当然不是用于硬盘!
严格地说,对于嵌入式世界,通常单片机必须同时做许多事情,而i2c设备可以简单地慢到足以使单片机失去太多的时间,如果i2c被敲打。但通常有硬件支持,中断驱动。无论如何,非阻塞(即异步) API更难以管理。
-更新意见后
“通常有硬件支持,中断驱动。无论如何,非阻塞(即异步) API更难管理”,您是否意味着在多模态传感器系统中实现同步I2C比在多模式传感器系统中实现更容易,并且仍然具有类似的性能。
让我们假设有异步hardware+driver支持:我们调用
i2c_write(periph_addr,data_to_send[],6);//向外围设备发送6个字节
几微秒后,例程返回,但通信仍在进行中。此时我们不能发出另一个i2c_write(.),因为我们会中断正在进行的一个。这个程序可以做其他的事情,是的,但不使用相同的公共汽车。如果i2c_write(.)我们用了一个
I2c_read(.);
当例程返回时,我们还没有准备好数据:程序必须使用i2c_read(),但是只在稍后到达时才使用数据,同时不接触i2c总线。做起来并不难,但肯定是一个同步调用/API,比如:
if ( i2c_read(some_data) == I2COK)显示(Some_data);
要简单得多。
https://stackoverflow.com/questions/66167268
复制相似问题