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.

[参考译文] TMS570LS1227:在从器件响应 NAK 时重新读取从器件需要更多的时间来处理请求

Guru**** 2763595 points

Other Parts Discussed in Thread: TMS570LS1227

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/814872/tms570ls1227-re-read-the-slave-while-the-slave-respond-nak-for-it-need-more-time-to-process-the-request

器件型号:TMS570LS1227

您好!

我有一个 TMS570LS1227 HDK、我将其与 I2C 从芯片配合使用。 主 I2C 配置如下所示。

/**-设置 i2c 模式*/
i2cREG1->MDR =(uint32)((uint32) 0U << 15U)// nack 模式
|(uint32)((uint32) 0U << 14U)/*自由运行*/
|(UINT32)(0U)/*开始条件-仅主机*/
|(uint32)((uint32) 1U <<11U)/*停止条件*/
|(UINT32)((UINT32) 1U <<10U)/*主/从模式*/
|(uint32)((uint32) I2C_transmitter)/*发送器/接收器*/
|(UINT32)((UINT32) I2C_7BIT_AMODE)/* xpaned 地址*
|(uint32)((uint32) 1U << 7U)/*重复模式*/
|(uint32)((uint32) 0U << 6U)/*数字回路*/
|(uint32)((uint32) 0U << 4U)/*起始字节-仅主机*/
|(uint32)((uint32) 0U << 3U)/*免费数据格式*/
|(UINT32)(I2C_8_BIT);/*位计数*/


/**-设置 i2c 向后兼容模式*/
i2cREG1->eMDR = 0U;

/**-禁用 DMA */
i2cREG1->DMACR = 0x00U;

/**-设置 i2c 数据计数*/
i2cREG1->CNT = 8U;

/**-禁用所有中断*/
i2cREG1->IMR = 0x00U;

/**-设置预分频*/
i2cREG1->PSC = 10U;

/**-设置时钟速率*/
i2cREG1->CKH = 36U;
i2cREG1->CKL = 36U;

/**-设置 i2c 引脚功能模式*/
i2cREG1->PFNC =(1U);

/**-设置 i2c 引脚默认输出值*/
i2cREG1->DOUT =(uint32)((uint32) 1U << 1U)/* sda 引脚*/
|(uint32)(1U);/* SCL 引脚*/

/**-设置 i2c 引脚输出方向*/
i2cREG1->DIR =(uint32)((uint32) 1U << 1U)/* sda 引脚*/
|(uint32)(1U);/* SCL 引脚*/

/**-设置 i2c 引脚开漏使能*/
i2cREG1->PDR =(uint32)((uint32) 1U <<1U)/* sda 引脚*/
|(uint32)(1U);/* SCL 引脚*/

/**-设置 i2c 引脚上拉/下拉使能*/
i2cREG1->PD =(uint32)((uint32) 0U << 1U)/* sda 引脚*/
|(uint32)(0U);/* SCL 引脚*/

/**-设置 i2c 引脚上拉/下拉选择*/
i2cREG1->PSEL =(uint32)((uint32) 1U <<1U)/* sda 引脚*/
|(uint32)(1U);/* SCL 引脚*/

它运行得非常好。 但是、在某些情况下、从器件需要更多的时间来处理请求。 从器件 I2C 数据表对此进行了说明

"i2c 芯片在运行每条指令时需要执行时间。 一个外部主器件可以在这个时间过后获得一个成功的结果。 如果外部主器件在未完成的执行过程中发送一条读取指令、它将收到1字节的错误(0xFF)。"

正确的工作顺序如下所示。 在这个表中、正如我在第三列中提到的、从器件对读取响应 NAK、随后是0xFF + ACK、重新读取-> NAK、0xFF +ACK ...直到它对读取响应 ACK。  

时间[s]  分析器名称  解码的协议结果
0.24614475 I2C 设置读取到[0xC9]+ ACK
0.246235625 I2C 0x04 + ACK
0.246334 I2C 0x11 + ACK
0.24643725 I2C 0x33 + ACK
0.246543 I2C 0x43 + NAK
0.250027375 I2C 设置写入[0xC8]+ ACK    请求从机的第1个写入
0.25011825 I2C 0x03 + ACK
0.2502115 I2C 0x27 + ACK
0.25030475 I2C 0x81 + ACK
0.250400625 I2C 0x04 + ACK
0.250498875 I2C 0x00 + ACK
0.25059975 I2C 0x00 + ACK
0.250698 I2C 0x8E + ACK
0.250796375 I2C 0x54 + ACK
0.250892125 I2C 0x00 + ACK
0.250990375 I2C 0x00 + ACK
0.25108875 I2C 0x00 + ACK
0.2511845 I2C 0x00 + ACK
0.251282875 I2C 0x00 + ACK
0.25138125 I2C 0x00 + ACK
0.251477 I2C 0x0E + ACK
0.25157775 I2C 0x54 + ACK
0.251676125 I2C 0x00 + ACK
0.251774375 I2C 0x00 + ACK
0.25187025 I2C 0x00 + ACK
0.2519685 I2C 0x00 + ACK
0.25206675 I2C 0x00 + ACK
0.252162625 I2C 0x00 + ACK
0.252260875 I2C 0x0E + ACK
0.252359125 I2C 0x54 + ACK
0.252455 I2C 0x00 + ACK
0.25255325 I2C 0x00 + ACK
0.252654 I2C 0x00 + ACK
0.252752375 I2C 0x00 + ACK
0.25284825 I2C 0x00 + ACK
0.2529465 I2C 0x00 + ACK
0.25304475 I2C 0x0E + ACK
0.253140625 I2C 0x54 + ACK
0.253238875 I2C 0x00 + ACK
0.25333725 I2C 0x00 + ACK
0.253433 I2C 0x00 + ACK
0.253531375 I2C 0x00 + ACK
0.253632125 I2C 0x00 + ACK
0.2537305 I2C 0x00 + ACK
0.25382875 I2C 0x46 + ACK
0.253924625 I2C 0x64 + ACK
0.2540505 I2C 设置读取到[0xC9]+ NAK  结果的第一个读取到从器件
0.25414125 I2C 0xFF + ACK
0.25725775 I2C 设置读取到[0xC9]+ NAK
0.2573485 I2C 0xFF + ACK
0.26026525 I2C 设置读取到[0xC9]+ NAK
0.260356 I2C 0xFF + ACK
0.2632345 I2C 设置读取到[0xC9]+ NAK
0.26332525 I2C 0xFF + ACK
0.2662625 I2C 设置读取到[0xC9]+ NAK
0.2663535 I2C 0xFF + ACK
0.269270125 I2C 设置读取到[0xC9]+ NAK
0.269361 I2C 0xFF + ACK
0.272236375 I2C 设置读取到[0xC9]+ NAK
0.272327125 I2C 0xFF + ACK
0.275285125 I2C 设置读取到[0xC9]+ NAK
0.275376 I2C 0xFF + ACK
0.278275125 I2C 设置读取到[0xC9]+ NAK
0.278365875 I2C 0xFF + ACK
0.281220625 I2C 设置读取到[0xC9]+ NAK
0.281311375 I2C 0xFF + ACK
0.28424875 I2C 设置读取到[0xC9]+ NAK
0.2843395 I2C 0xFF + ACK
0.28725625 I2C 设置读取到[0xC9]+ ACK  从器件响应成功
0.287347125 I2C 0x04 + ACK
0.2878655 I2C 0x00 + ACK
0.287966375 I2C 0x03 + ACK
0.28807225 I2C 0x40 + NAK
0.289808625 I2C 设置写入[0xC8]+ ACK  第二次写入以请求从器件
0.289899375 I2C 0x03 + ACK
0.289992625 I2C 0x27 + ACK
0.290091 I2C 0x81 + ACK
0.29018675 I2C 0x00 + ACK
0.290285 I2C 0x00 + ACK
0.29038325 I2C 0x01 + ACK
0.290479125 I2C 0x04 + ACK
0.290577375 I2C 0x05 + ACK
0.290675625 I2C 0x05 + ACK
0.290771375 I2C 0x05 + ACK
0.29087225 I2C 0x11 + ACK
0.290705 I2C 0x22 + ACK
0.291068875 I2C 0x33 + ACK
0.291164625 I2C 0x44 + ACK
0.291262875 I2C 0x00 + ACK
0.29136125 I2C 0x00 + ACK
0.291457 I2C 0x00 + ACK
0.29155525 I2C 0x00 + ACK
0.291653625 I2C 0x00 + ACK
0.2917495 I2C 0x00 + ACK
0.29185275 I2C 0x00 + ACK
0.2919485 I2C 0x00 + ACK
0.292046875 I2C 0x00 + ACK
0.29214275 I2C 0x00 + ACK
0.292241 I2C 0x00 + ACK
0.29233925. I2C 0x00 + ACK
0.292435125 I2C 0x00 + ACK
0.292533375 I2C 0x00 + ACK
0.29263175 I2C 0x00 + ACK
0.2927275 I2C 0x00 + ACK
0.29283075 I2C 0x00 + ACK
0.2929125 I2C 0x00 + ACK
0.2930275 I2C 0x00 + ACK
0.29312575 I2C 0x00 + ACK
0.2932215 I2C 0x00 + ACK
0.293319875 I2C 0x00 + ACK
0.29341825 I2C 0x00 + ACK
0.293514 I2C 0x00 + ACK
0.29361225 I2C 0x02 + ACK
0.2937105 I2C 0x3B + ACK
0.2938365 I2C 设置读取到[0xC9]+ NAK  第二次读取从器件结果
0.29392725 I2C 0xFF + ACK
0.297190875 I2C 设置读取到[0xC9]+ NAK
0.29728175 I2C 0xFF + ACK
0.300219125 I2C 设置读取到[0xC9]+ NAK
0.300309875 I2C 0xFF + ACK
0.303226625 I2C 设置读取到[0xC9]+ NAK
0.303317375 I2C 0xFF + ACK
0.306213375 I2C 设置读取到[0xC9]+ NAK
0.30630425 I2C 0xFF + ACK
0.309162 I2C 设置读取到[0xC9]+ NAK
0.30925275 I2C 0xFF + ACK
0.3121695 I2C 设置读取到[0xC9]+ NAK
0.31226025 I2C 0xFF + ACK
0.315363 I2C 设置读取到[0xC9]+ NAK
0.315453875 I2C 0xFF + ACK
0.31913925 I2C 设置读取到[0xC9]+ NAK
0.31923年 I2C 0xFF + ACK
0.32214675 I2C 设置读取到[0xC9]+ NAK
0.3222375 I2C 0xFF + ACK
0.32509525 I2C 设置读取到[0xC9]+ NAK
0.325186 I2C 0xFF + ACK
0.32816475 I2C 设置读取到[0xC9]+ ACK  成功的从器件结果
0.328255625 I2C 0x04 + ACK
0.328811625 I2C 0x00 + ACK
0.328912375 I2C 0x03 + ACK
0.32902075 I2C 0x40 + NAK
0.3336655 I2C 设置写入[0xC8]+ ACK
0.33375625 I2C 0x03 + ACK
0.333849625 I2C 0x0B + ACK
0.333942875 I2C 0x82 + ACK
0.334043625 I2C 0x00 + ACK
0.3341395 I2C 0x00 + ACK
0.33423775 I2C 0x00 + ACK
0.334336 I2C 0x11 + ACK
0.334431875 I2C 0x22 + ACK
0.334530125 I2C 0x33 + ACK
0.334628375 I2C 0x44 + ACK
0.33472425 I2C 0x3E + ACK
0.3348225 I2C 0xD2 + ACK
0.334948375 I2C 设置读取到[0xC9]+ NAK
0.335039125 I2C 0xFF + ACK
0.338117375 I2C 设置读取到[0xC9]+ NAK
0.33820825 I2C 0xFF + ACK
0.341062875 I2C 设置读取到[0xC9]+ NAK
0.34115375 I2C 0xFF + ACK
0.344049 I2C 设置读取到[0xC9]+ NAK
0.344139875 I2C 0xFF + ACK
0.3470565 I2C 设置读取到[0xC9]+ NAK
0.347147375 I2C 0xFF + ACK
0.350398625 I2C 设置读取到[0xC9]+ NAK
0.350489375 I2C 0xFF + ACK
0.353406125 I2C 设置读取到[0xC9]+ NAK
0.353496875 I2C 0xFF + ACK
0.35649625 I2C 设置读取到[0xC9]+ NAK
0.356587125 I2C 0xFF + ACK
0.359589625 I2C 设置读取到[0xC9]+ NAK
0.359680375 I2C 0xFF + ACK
0.362535125 I2C 设置读取到[0xC9]+ NAK
0.362625875 I2C 0xFF + ACK
0.36610075 I2C 设置读取到[0xC9]+ NAK
0.3661915 I2C 0xFF + ACK
0.36919475 I2C 设置读取到[0xC9]+ NAK
0.3692855 I2C 0xFF + ACK
0.372450375 I2C 设置读取到[0xC9]+ NAK
0.372541125 I2C 0xFF + ACK
0.37531625 I2C 设置读取到[0xC9]+ NAK
0.375407 I2C 0xFF + ACK
0.378344375 I2C 设置读取到[0xC9]+ NAK
0.378435125 I2C 0xFF + ACK
0.3812485 I2C 设置读取到[0xC9]+ NAK
0.38133925 I2C 0xFF + ACK
0.384442125 I2C 设置读取到[0xC9]+ NAK
0.384532875 I2C 0xFF + ACK
0.387490875 I2C 设置读取到[0xC9]+ NAK
0.38758175 I2C 0xFF + ACK
0.390460125 I2C 设置读取到[0xC9]+ NAK
0.390551 I2C 0xFF + ACK
0.393736375 I2C 设置读取到[0xC9]+ NAK
0.393827125 I2C 0xFF + ACK
0.39659925 I2C 设置读取到[0xC9]+ NAK
0.39669 I2C 0xFF + ACK
0.39966875 I2C 设置读取到[0xC9]+ ACK  成功 的结果
0.399759625 I2C 0x04 + ACK
0.4003205 I2C 0x00 + ACK
0.400421375 I2C 0x03 + ACK
0.400524625 I2C 0x40 + NAK

如果我尝试在 TMS570LS12x 中执行这个操作、主器件在从器件响应 NAK 进行读取时立即下拉 SCL 线路。 在 eMDR 中设置忽略 NACK 不会有帮助、因为它只是继续读取数据并将其复制为0xFF 4倍、因为计数设置为4。

在上图中、当从器件响应 NAK 进行读取操作和0xFF+ACK 时、SCL 保持~3millisec 并重新读取从器件、然后继续...

一旦 TMS570LS12x 主器件与从器件的 NAK 响应一起卡住、我们如何恢复它并实现上述功能?

可以帮助我在 TMS570LS12x 控制器中实现这一点吗?

谢谢、

此致、

-Dinesh

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

    您好、抱歉、配置如下所示。 前面提到的不 是正确的。

    /**- i2c 输入 RESET */
    i2cREG1->MDR =(uint32)((uint32) 0U << 5U);

    /**-设置 i2c 模式*/
    i2cREG1->MDR =(uint32)((uint32) 0U << 15U)// nack 模式
    |(uint32)((uint32) 0 << 14U)/*自由运行*/
    |(UINT32)(0U)/*开始条件-仅主机*/
    |(uint32)((uint32) 1U <<11U)/*停止条件*/
    |(UINT32)((UINT32) 1U <<10U)/*主/从模式*/
    |(uint32)((uint32) I2C_transmitter)/*发送器/接收器*/
    |(UINT32)((UINT32) I2C_7BIT_AMODE)/* xpaned 地址*
    |(uint32)((uint32) 0U << 7U)/*重复模式*/
    |(uint32)((uint32) 0U << 6U)/*数字回路*/
    |(uint32)((uint32) 0U << 4U)/*起始字节-仅主机*/
    |(uint32)((uint32) 0U << 3U)/*免费数据格式*/
    |(UINT32)(I2C_8_BIT);/*位计数*/


    /**-设置 i2c 向后兼容模式*/
    i2cREG1->eMDR = 0U;

    /**-禁用 DMA */
    i2cREG1->DMACR = 0x00U;

    /**-设置 i2c 数据计数*/
    i2cREG1->CNT = 8U;

    /**-禁用所有中断*/
    i2cREG1->IMR = 0x00U;

    /**-设置预分频*/
    i2cREG1->PSC = 10U;

    /**-设置时钟速率*/
    i2cREG1->CKH = 36U;
    i2cREG1->CKL = 36U;

    /**-设置 i2c 引脚功能模式*/
    i2cREG1->PFNC =(0U);

    /**-设置 i2c 引脚默认输出值*/
    i2cREG1->DOUT =(uint32)((uint32) 0U << 1U)/* sda 引脚*/
    |(uint32)(0U);/* SCL 引脚*/

    /**-设置 i2c 引脚输出方向*/
    i2cREG1->DIR =(uint32)((uint32) 0U << 1U)/* sda 引脚*/
    |(uint32)(0U);/* SCL 引脚*/

    /**-设置 i2c 引脚开漏使能*/
    i2cREG1->PDR =(uint32)((uint32) 0U <<1U)/* sda 引脚*/
    |(uint32)(0U);/* SCL 引脚*/

    /**-设置 i2c 引脚上拉/下拉使能*/
    i2cREG1->PD =(uint32)((uint32) 0U << 1U)/* sda 引脚*/
    |(uint32)(0U);/* SCL 引脚*/

    /**-设置 i2c 引脚上拉/下拉选择*/
    i2cREG1->PSEL =(uint32)((uint32) 1U <<1U)/* sda 引脚*/
    |(uint32)(1U);/* SCL 引脚*/

    /**-设置中断使能*/
    i2cREG1->IMR =(uint32)((uint32) 0U <<6U)//作为从机中断的地址
    |(UINT32)((UINT32) 0U << 5U)/*停止条件检测中断*/
    |(uint32)((uint32) 0U << 4U)/*传输数据就绪中断*/
    |(UINT32)((UINT32) 0U << 3U)/*接收数据就绪中断*/
    |(UINT32)((UINT32) 0U << 2U)/*寄存器访问就绪中断*/
    |(UINT32)((UINT32) 0U << 1U)/*无确认中断*/
    |(uint32)((uint32) 0U);/*仲裁丢失中断*/

    /**- i2c 复位后*/
    i2cREG1->MDR |=(uint32) I2C_RESET_OUT;

    /**-初始化全局传输变量*/
    G_i2cTransfer_t.mode =(uint32) 0U << 4U;
    g_i2c 传输_t.length = 0U;

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

    Dinesh 您好!

    通过置位 I2CEMDR 寄存器中的 IGNACK 位、可以将 I2C 模块置于忽略 NACK 模式。 此模式允许配置为主发送器的 I2C 模块忽略从器件发出的不能生成适当 ACK 信号的 NACK。

    /**-设置 i2c 向后兼容模式*/
    i2cREG1->eMDR = 2U;

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

    您好、Wang、

    感谢您的回复。 我已经尝试过这种方法。

    如果我忽略 NACK、因为我将计数设置为4、则主器件接收到0xFF+ACK、 0xFF+ACK、 0xFF+ACK、 0xFF+NACK。

    除非我检查接收数据的正确性、否则我永远不知道接收到的数据是有效还是0xFF (从器件的等待信号)。

    我需要的方法是、如果从器件对读取做出响应 NACK、我需要读取下一个字节、并且如果其0xFF 主器件应确认并等待3ms、然后重新读取、直到有一个读取的 ACK。 如果从器件确认读取、它将响应04 00 03 40

    我们如何做到这一点?

    谢谢、

    -Dinesh

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

    如果从器件对读取响应 NAK、如何再次发送读取命令?

    在本例中、主器件将 SCL 拉至低电平。 我正在尝试弄清楚如何 再次发送读取命令。

    -Dinesh

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

    中的另一个信息是时钟拉伸。 从器件执行以下操作、

    "

    当器件处于 I2C 总线上时、通过将 SCL 线路保持在低电平、i2c 芯片可以自动暂停总线事务
    未准备好传输下一个数据字节或准备另一个字节。 主器件等待 SCL 线路为高电平
    然后再继续下一个字节

    "

    当主器件由于从器件的 NACK 和从器件的 NACK 将线路拉低时、这是否会产生冲突?

    -Dinesh

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

    尊敬的 Dinesh:

    从器件支持时钟扩展。 如果它有一个被称为确认轮询的功能、请检查它的通信协议: 为了使主器件知道写入是否完全完成、主器件可以发出一个确认轮询命令。 如果器件完成写入、则它将确认。  如果器件仍忙于完成内部写入周期、则它将返回负确认。  

    从器件可能具有用于主器件侧处理其时钟扩展的示例代码。

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

    您好、Wang、

    感谢您的回复。

    从器件数据表仅提供以下信息、

    当器件处于 I2C 总线上时、通过将 SCL 线路保持在低电平、i2c 芯片可以自动暂停总线事务
    未准备好传输下一个数据字节或准备另一个字节。 主器件等待 SCL 线路为高电平
    然后再继续下一个字节。

    当 RM=0、eMDR =0、FDF =0、7位寻址模式时、主器件在从器件 NACK 进行读取时立即将 SCL 保持在低电平。在这里、如何继续向从器件发送另一个读取是我尝试确定的。

    如何知道 SCL 是由主器件还是从器 件下拉、因为从器件或从器件的 NACK 主器件拉低而可能发生这种情况、可能会将 SCL 拉低。

    在从器件 ACK 读取之前、如何反复读取从器件? 在主器件检查 SCL 是否为高电平之后、应执行重新读取(这意味着由于时钟扩展而被从器件释放)。

    我有点卡在这里。 您的即时支持将会大有帮助。

    谢谢、

    此致、

    -Dinesh

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

    尊敬的 Dinesh:

    您是否解决了从时钟拉伸问题?

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

    您好、Wang、

    我现在正在使用带有忽略 NAK 选项的重复模式。

    谢谢、

    此致、

    -Dinesh