This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DLP9500:使用 API 并借助 D4100_USB.dll 连接和控制 DLP Discovery 4100设备

Guru**** 1456330 points
Other Parts Discussed in Thread: DLPC410, DLP9500, DLP9500UV, DLP7000, DLP7000UV, DLP650LNIR
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/dlp-products-group/dlp/f/dlp-products-forum/819526/dlp9500-connecting-and-controlling-the-dlp-discovery-4100-device-using-api-with-d4100_usb-dll

器件型号:DLP9500
主题中讨论的其他器件:DLPC410、、 DLP7000DLP7000UVDLP650LNIR

你好!  

我对以编程方式控制 DLP Discovery 4100有疑问。 我们的团队希望使用 DLPC410 API 从 C++控制器件。 我们目前正在尝试直接 DLL 控件(而不是 ActiveX 控件)。 在我的 C++文件中、我包含了头文件 D4100_USB.h、并将 IDE (代码块)链接到 D4100_USB.lib 文件。 编译后、我将 D4100_USB.dll 文件放在与编译的.exe 文件相同的目录中。 现在、我可以从我的程序访问 D4100_usb.h 中的函数。 但我的程序无法检测或控制通过 USB 连接的 D4100板。 当我从程序调用函数 GenNumDev()时,我得到0。  

我是否遗漏了一些重要步骤、如配置驱动程序? 我应该提到的是、我能够使用 Discovery Explorer GUI 成功控制该板。

此外、是否更容易使用 ActiveX 控件? 我在 C++方面不太有经验、我更喜欢更简单的替代方案。

 

谢谢!

Sharvaj

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sharvaj、

    首先、欢迎来到 TI-E2E 论坛的 DLP 部分。

    响应正确。  我认为您对返回值的理解不正确(可能是由于 API 指南中的错误、该错误 错误指出:"。 。 。  如果您插入了四个设备,GetNumDev()将返回'4'。"  

    它实际上将返回“3” )。  它返回(连接的板数- 1)。  如果您连接了3块板、则会返回"2"。  

    然后、当您调用 DLL 函数时、您可以寻址电路板#0、#1或#2。  

    在您的情况下、您将通过"0"作为您所连接的一个板的"deviceNumber"。   

    例如、如果您想了解:

    • 如果 NSFLIP 标志被置位、您将调用 GetNSFLIP (0)、它将返回0或1
    • 如果要查找 DMD 类型,则会调用 GetDMDTYPE(0),并返回一个数字:
    • "0"-适用于 DLP9500/DLP9500UV [0.95"(可见光/UV) 1080p 2xLVDS A 类 DMD]
    • "1"-适用于 DLP7000/DLP7000UV [0.7"(VisibleF/UV) XGA 2xLVDS A 类 DMD]
    • "7"-适用于 DLP650LNIR [0.65"(NIR) WXGA 2xLVDS S450 DMD]
    • ‘15’–如果 DMD 未连接或 DLPC410控制器未识别。

    但愿这对您有所帮助。

    Fizix

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Fizix、

    非常感谢。 此外、事实证明我使用的是旧的.dll 文件、因此我将 GetDMDTYPE(0)作为-1。 但是我能够解决这个问题、现在我有 了 GetDMDTYPE (0)= 0、这是我认为正确的 DMD。  

    此外、我还有几个后续问题:

    1. 我是否需要在每次打开 DMD 时对 FPGA 进行编程? 还是启动 Explorer GUI 会自动执行此操作?
    2. 对于函数'int LoadData (UCHAR* RowData、unsigned int length、short DMD 类型、short DeviceNumber)',RowData 是否为2D 数组? 我看到一次最多可以加载500行。 那么、这是否意味着阵列可以是500 x (DMD 的宽度)? 那么、" length "将是 DMD 的宽度、以像素为单位、对吧?
    3. 'sort GetRESETCOMPLETE (int waittime、short int DeviceNumber)'是用于复位的函数吗? 这是否与 ActiveX 方法“组重置(短块数)”相同?

    再次感谢!

    Sharvaj

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sharvaj、

    答案如下:

    1. 如果您使用的是较新版本的 GUI/API、则系统附带统一的 FPGA 负载。  换言之、无需像加载 GUI 1.0版那样加载它
    2. 请参阅第10页上的 API 指南(DLPU039 -修订版 A)。  最小长度为一行数据。  这些指令有点令人困惑、但您希望加载500行、您可以调用此函数500次、 但调用此函数并将其交给一个像素等于 DMD 宽度的倍数的数组(最多500行)会更容易。  例如、如果您有 XGA、则一行中将显示1024像素* 500行= 512、000 。  因此,您可以将 DLL 函数 LoadData (UCHAR* RowData,长整型)指针交给您的 UCHAR 数组,并将512,000作为长整数。
    3. ActiveX Short Reset (Short BlockNum)实际上会对块模式和块地址指定的块执行重置。  DLL 控制函数中没有直接等效的函数。  相反、使用 DLL 函数的复位操作包括将行模式设置为 NOOP [§6.2.10]、将块地址设置为所需的块[§6.2.6]、块模式[§6.2.4]、如果使用双块[§6.2.8]、您可能还需要设置 RST2BLKZ、 然后调用负载控制[§6.2.1 ]将这些值写入 DMD。  我在实践中发现、连续三次调用负载控制可确保其通过 USB 接口写入。  

    但愿这对您有所帮助。

    Fizix