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.

[参考译文] DLPC3478:每个块小于256字节的值的图形写入块大小问题。

Guru**** 2539770 points
Other Parts Discussed in Thread: DLPC3478, DLPC-API

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

https://e2e.ti.com/support/dlp-products-group/dlp/f/dlp-products-forum/1476639/dlpc3478-pattern-write-block-size-issues-for-values-smaller-than-256-bytes-per-block

器件型号:DLPC3478
主题中讨论的其他器件: DLPC-API

工具与软件:

您好!

我正在尝试使用固件更新命令将图形二进制数据(通过 EVM GUI 工具导出)传输到 DLP 3010 EVM、块大小为每个块128字节。

当回读数据块的第一个块(通过写入闪存开始[E1h]写入)时、数据是正确的、没有问题。 但是、128字节之后的任何其他块都将由读取操作用0xFF 填充。

对我来说、所使用的块大小似乎是问题所在。 1024字节没问题、因此512和256字节也是如此。 但是、128不是。 目前、由于使用 DLPC3478的自有设计的限制、我不得不设置一个低于256的值。

但是、读取对几乎任何块大小<=256都有效(当前使用252)。

EVM 或 DLPC3478的固件是否存在故障?

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

    大家好、我会邀请  DLPC3478专家来调查这个问题、并让您知道。

    谢谢

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

    您好 Armin:

    感谢您通过 E2E 联系我们了解此问题!

    令人好奇的是、128字节引发了一个问题。 根据 写入闪存数据长度(DFh) 和您提到的内容、每个写入事务允许的最大数据长度为1024个字节、而最大读取事务是256个字节。 此外、如前所述、3.7.3.1 "闪存数据必须是4字节的倍数。" 我想这意味着最少4个字节。

    请允许我联系我的团队了解这一点。

    您是否遵循 DLPC3470和 DLP3478软件编程人员指南 第3.7节和更改闪存数据长度和闪存启动命令的说明?

    此致!

    亚伦

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

    你好、亚伦、

    是的、我遵循相应的指南。

    但有一个注意事项:与文档相比、"Read Short Status"命令(D0h)的响应中的第4位被反转。

    观察 DLPC-API-1.10参考项目的代码也可看到相同的信息。

    仅编写部分的一般过程是:

    WriteFlashDataLength(128)
    
    WriteFlashStart(first_128_bytes)
    
    
    
    for every full chunk of 128 bytes:
    
       WriteFlashDataLength(128)
    
       WriteFlashContinue(next_128_byte)
    
    
    
    WriteFlashDataLength(remainderChunkLength)
    
    WriteFlashContinue(remainderBytes)

    此致

    Armin

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

    您好 Armin:

    我必须查看 D0h 的"Flash 擦除完成"位4的反转情况。

    用户指南中的步骤如下:

    1. 使用 DLPRegistered显示和光控制 EVM GUI 生成图形数据。 通过 GUI 中的"Save Pattern Data"按钮生成的.bin 文件包含要通过 I2C 发送的图形数据。
    2. 确保内部图形当前未在运行。 如果控制器处于内部图形模式、请使用写入内部图形控制命令(第3.4.13节)停止运行内部图形。
    3. 使用写入闪存数据类型选择(DEh)命令将闪存数据类型设置为图形数据块。
    4. 使用读取闪存更新预检验(DDh)命令、检查生成的.bin 文件是否能放入当前现有的图形数据闪存块。
    5. 使用写入擦除闪存数据(E0h)命令来擦除现有的图形数据。
    6. 使用写入闪存数据长度(DFh)命令将闪存数据长度设置为1024个字节。
    7. 使用写入闪存开始(E1h)命令来写入图形数据的前1024个字节。
    8. 使用写入闪存继续(E2h)命令以1024个字节数据块形式写入其余数据。

    您已经展示的步骤如何使用 DFh (FlashDataLength)和 E1h (WriteFlashStart)-步骤6和#7。 是否也遵循了步骤3-5?

    您能否与我分享您在从256字节更新到128字节时发送的所有命令? 这应包括 Deh (WriteFlashDataTypeSelect)和上述步骤3-5中的其他内容。

    此致!

    亚伦

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、亚伦、
    我从 GUI 生成了数据并读回内容。 假设必须总共写入1348个字节每个块128字节
    .
    10个128的完整块一个68的块。 所有尺寸均4个可分频的尺寸

    // For reference: I count from 0, e.g. for bit numbers
    
    WriteOperatingModeSelect([0x05, 0x04])
    WriteInternalPatternControl([0x9E, 0x01, 0x00]) // Stop pattern sequence
    
    WriteFlashDataTypeSelect([0xDE, 0xD0]) // Undocumented type D0, to be found in the DLPC API
    ReadFlashUpdatePrecheck([0xDD, 0x44, 0x05]) // 1348 
    Check response for bit 0 and bit 1 equal 0
    
    WriteFlashDataTypeSelect([0xDE, 0xD0]) // Undocumented type D0, to be found in the DLPC API
    WriteEraseFlashData([0xE0, 0xAA, 0xBB, 0xCC, 0xDD])
    
    repeat ReadShortStatus([0xD0])
    while response bit 3 is 1
    
    WriteFlashDataLength([0xDF, 0x80, 00]) // 128
    WriteFlashStart([0xE1, .. 128 bytes])
    ReadShortStatus([0xD0])
    check response for bit 4 equal 0 // Flash error?
    
    for i=1 to 10
        WriteFlashDataLength([0xDF, 0x80, 00]) // 128
        WriteFlashContinue([0xE2, next .. 128 bytes])
        ReadShortStatus([0xD0])
        check response for bit 4 equal 0 // Flash error?
    
    WriteFlashDataLength([0xDF, 0x44, 00]) // 68
    WriteFlashContinue([0xE2, last 68 bytes])
    

    这是我发送的命令的确切顺序。 所有工作良好的块大小>=256 (并且仍然可以除以4当然)。

    关于读取简短状态文档错误:

    对 dlpc34xx.h:256 ff 中 DLPC API 代码的比较

    typedef enum
    {
        DLPC34XX_FE_COMPLETE = 0x0,                                       /**< Complete */
        DLPC34XX_FE_NOT_COMPLETE = 0x1,                                   /**< Not Complete */
    } DLPC34XX_FlashErase_e;
    

    执行场削弱。 不修复`Flash ERASE NOT COMPLETE (闪存擦除未完成)的翻转位假设`使代码假设擦除已完成、以下写入命令可以并将使固件砖化。

    此致、

    Armin

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

    您好 Armin:

    当您使用256,512,1024执行相同的任务并且它正在工作时、最后一个"ReadShortStatus (D0h)"是否为位4返回0或1?

    很抱歉、需要一段时间才能了解该问题、感谢您指向 API 代码。

    此致!

    亚伦

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

    你好、亚伦、

    "ReadShortStatus (D0h)"  不会返回任何此类值的"flash error"、也不会返回128块大小等错误。

    此致

    Armin

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

    嗨、Armin:

    感谢您提供更多信息、我将与我的团队合作解决这一问题。

    此致!

    亚伦

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

    你好、亚伦、

    还有一点要补充说明。 甚至只是修改 DLPC-API 示例代码、仅使用128字节的写入缓冲器(因此将其用作所有写入的块大小)

    会出现同样的问题。 第一个块可以读回有效、其余为0xFF。 回读代码也没有错误。

    此外、还使用修改后的示例代码会导致出现故障的模式固件块。

    此致

    Armin

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

    您好 Armin:

    是的、我肯定需要我的团队成员来查看一下、感谢您提供更多信息!

    我还在和他们讨论这一点。 请给他们一两天的时间来返回此主题、谢谢!

    此致!

    亚伦

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

    您好 Armin:

    您能解释一下使用小于256字节的块大小的原因是什么吗?

    此致、
    Kirthi Vignan

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

    您好、 Kirthi Vignan、

    最初造成这种情况的原因是使用非常小的 MCU 作为串行到 i2c 直通、最大缓冲区大小太小。

    我们把它更改为更大的一个,所以对我们来说,"问题"是解决的。 尽管如此、未记录不允许值低于256的情况。 建议更新文档、

    此致

    Armin

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

    您好 Armin:


    感谢您让我们知道。

    此致、
    Kirthi Vignan。