跳转到内容

两线接口#

通过双线接口相机功能,您可以利用双线接口 (TWI) 总线在相机和一个或多个外部设备之间传输数据。

例如,您可以使用相机来控制 TWI 兼容镜头的焦距。

该功能的使用#

运作原理#

TWI 总线是一种双线总线,由一根串行数据线 (SDA) 和一根串行时钟线 (SCL) 组成,属于双向线路。

相机(主控)和外部设备(从属)连接到数据线和时钟线。相机通过数据线发送或请求和检索数据。时钟线用于发送时钟信号,并且由相机控制。

双线接口图

要使用上述 TWI 接口,相机的 GenICam 参数必须符合从属设备的规格。

下面列出了可帮助您实施合适的通信协议的相机参数。

配置 TWI 通信#

配置相机和外部设备之间的 TWI 通信:

  1. BslTwiBitrate 参数设置为要用于 TWI 的比特率,例如 50 kbps。
  2. 配置相机的输入-输出信号。
    1. LineSelector 参数设置为将写入和读取串行数据的 I/O 线,例如 Line2。该线路必须配置为输入-输出线路
    2. Set the BslLineConnection parameter to TwiSda.
    3. LineSelector 参数设置为将用于发送时钟信号的 I/O 线,例如 Line3。该线路必须配置为输入-输出线路。
    4. BslLineConnection 参数设置为 TwiScl

写入和读取数据#

配置 TWI 通信后,您可以向外部设备写入数据并从中读取数据。

写入和读取参数#

写入和读取数据都涉及以下参数:

  • BslTwiTransferBuffer:传输缓冲区保存要写入的数据,也包含已读取的数据。它最多可以保存 16 个字节。
  • BslTwiTransferLength:指示应该传入或传出缓冲区的字节数。写入时,传输长度指定了相机每个事务应传输的字节数。读取时,它指定了相机在上次事务期间已接收的字节数。最大值为 16 个字节。
  • BslTwiTargetAddress:指示外部从属设备的 7 位目标地址。

写入数据涉及以下参数:

  • BslTwiWrite:执行此命令可将由传输长度指定的字节数从传输缓冲区写入到从属设备的目标地址。

读取数据涉及以下参数:

  • BslTwiRead:执行此命令可从从属设备的目标地址读取或检索数据。读取的字节数由传输长度指定。

传输状态#

传输状态指示数据传输的当前状态。传输成功完成后,传输状态指示 Success。要检索当前传输状态,请通过执行 BslTwiUpdateTransferStatus 命令更新传输状态,然后获取 BslTwiTransferStatus 的值。

如果 BslTwiTransferStatus 的值为 Pending,则您必须反复更新和读取传输状态,直至传输状态指示 Success。仅在传输状态指示 Success 时才能写入或读取新数据。

传输状态可以采用以下值:

  • Success:最近的数据传输成功完成。
  • Pending:数据传输处于待处理状态。
  • NAKAddress:在最新的写入或读取命令之后,相机没有收到用于确认目标地址的确认位。在这种情况下,数据传输失败。
  • NAKData:在最新的写入命令之后,相机没有收到用于确认数据传输成功完成的确认位。在这种情况下,数据传输失败。

将 I/O 线拉低#

一些 TWI 从属设备需要在开始操作前将 I/O 线拉低。如果需要将 I/O 线拉低,请将 BslTwiPullSdaLow 参数或 BslTwiPullSclLow 参数或两者都设置为 true。当其中之一为 true 时,数据传输即被禁用。

示例代码#

// Configure TWI communication
// Set the bit rate to 50 kbps
camera.BslTwiBitrate.SetValue(BslTwiBitrate_Bitrate50kbps);
// Set line 2 to input-output and use it for TWI SDA
camera.LineSelector.SetValue(LineSelector_Line2);
camera.LineMode.SetValue(LineMode_InOut);
camera.BslLineConnection.SetValue(BslLineConnection_TwiSda);
// Set line 3 to input-output and use it for TWI SCL
camera.LineSelector.SetValue(LineSelector_Line3);
camera.LineMode.SetValue(LineMode_InOut);
camera.BslLineConnection.SetValue(BslLineConnection_TwiScl);
// Now, you must implement a suitable communication protocol.
// Camera parameters that help you implement the protocol are listed
// in the "Writing and Reading and Data" section above.
INodeMap& nodemap = camera.GetNodeMap();
// Configure TWI communication
// Set the bit rate to 50 kbps
CEnumParameter(nodemap, "BslTwiBitrate").SetValue("Bitrate50kbps");
// Set line 2 to input-output and use it for TWI SDA
CEnumParameter(nodemap, "LineSelector").SetValue("Line2");
CEnumParameter(nodemap, "LineMode").SetValue("InOut");
CEnumParameter(nodemap, "BslLineConnection").SetValue("TwiSda");
// Set line 3 to input-output and use it for TWI SCL
CEnumParameter(nodemap, "LineSelector").SetValue("Line3");
CEnumParameter(nodemap, "LineMode").SetValue("InOut");
CEnumParameter(nodemap, "BslLineConnection").SetValue("TwiScl");
// Now, you must implement a suitable communication protocol.
// Camera parameters that help you implement the protocol are listed
// in the "Writing and Reading and Data" section above.
// Configure TWI communication
// Set the bit rate to 50 kbps
camera.Parameters[PLCamera.BslTwiBitrate].SetValue(PLCamera.BslTwiBitrate.Bitrate50kbps);
// Set line 2 to input-output and use it for TWI SDA
camera.Parameters[PLCamera.LineSelector].SetValue(PLCamera.LineSelector.Line2);
camera.Parameters[PLCamera.LineMode].SetValue(PLCamera.LineMode.InOut);
camera.Parameters[PLCamera.BslLineConnection].SetValue(PLCamera.BslLineConnection.TwiSda);
// Set line 3 to input-output and use it for TWI SCL
camera.Parameters[PLCamera.LineSelector].SetValue(PLCamera.LineSelector.Line3);
camera.Parameters[PLCamera.LineMode].SetValue(PLCamera.LineMode.InOut);
camera.Parameters[PLCamera.BslLineConnection].SetValue(PLCamera.BslLineConnection.TwiScl);
// Now, you must implement a suitable communication protocol.
// Camera parameters that help you implement the protocol are listed
// in the "Writing and Reading and Data" section above.
/* Macro to check for errors */
#define CHECK(errc) if (GENAPI_E_OK != errc) printErrorAndExit(errc)
GENAPIC_RESULT errRes = GENAPI_E_OK;  /* Return value of pylon methods */
/* Configure TWI communication */
/* Set the bit rate to 50 kbps */
errRes = PylonDeviceFeatureFromString(hdev, "BslTwiBitrate", "Bitrate50kbps");
CHECK(errRes);
/* Set line 2 to input-output and use it for TWI SDA */
errRes = PylonDeviceFeatureFromString(hdev, "LineSelector", "Line2");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "LineMode", "InOut");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "BslLineConnection", "TwiSda");
CHECK(errRes);
/* Set line 3 to input-output and use it for TWI SCL */
errRes = PylonDeviceFeatureFromString(hdev, "LineSelector", "Line3");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "LineMode", "InOut");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "BslLineConnection", "TwiScl");
CHECK(errRes);
/* Now, you must implement a suitable communication protocol. */
/* Camera parameters that help you implement the protocol are listed */
/* in the "Writing and Reading and Data" section above. */
# Configure TWI communication
# Set the bit rate to 50 kbps
camera.BslTwiBitrate.Value = "Bitrate50kbps"
# Set line 2 to input-output and use it for TWI SDA
camera.LineSelector.Value = "Line2"
camera.LineMode.Value = "InOut"
camera.BslLineConnection.Value = "TwiSda"
# Set line 3 to input-output and use it for TWI SCL
camera.LineSelector.Value = "Line3"
camera.LineMode.Value = "InOut"
camera.BslLineConnection.Value = "TwiScl"
# Now, you must implement a suitable communication protocol.
# Camera parameters that help you implement the protocol are listed
# in the "Writing and Reading and Data" section above.

您也可以使用 pylon Viewer 轻松设置参数。