我连接了两块用于 I3C 通信的 LPC5536-EVK 板,其中一块配置为 I3C 主板,另一块配置为 I3C 从机。如果主站指定的读取长度超过从站提供的数据量,主站就会卡在读取函数I3C_MasterTransferBlocking 中。根据波形,信号似乎是正确的,因此我认为问题出在主控端。
在我提供的示例中,从属服务器的数据是 [0x01,0x02],长度仅为 2 字节。但是,主服务器将读取长度指定为 3。因此,在第 2 字节的末尾,Slave 将 T-Bit 作为 0 返回,以表示消息结束。
测试步骤:
(1) RESET 从属板
(2) RESET 主板
有关 T 位的定义,请参阅《MIPI I3C 基本规范》v1.1.1。
第 5.1.2.3.4 节、SDR 目标返回(读取)数据的第九位为数据结束位
在 I2C 中,"从目标读取 "有一个问题,即只有控制器才能结束读取,因此目标无法控制其返回的数据量。相比之下,在 I3C SDR 中,目标可控制其返回的数据字数;但它也允许 I3C 控制器在必要时提前终止读取。
...
尽管用户无法确定i3c_masterTransferNonBlocking实际传输了多少字节,但对于我的应用程序来说,这似乎已经足够了。
我尝试改用I3C_MasterTransferNonBlocking。尽管它不会挂起,但用户无法知道Slave实际提供了多少字节。在我分享的示例中,它需要返回传输计数 = 2 这样的信息。
在你使用 lpcxpresso55s36_i3c_interrupt_b2b_transfer_master 示例进行测试时,尽管你将 dataSize 更改为 50,但之后代码仍会打印固定的32字节,这恰好与从属提供的传输数量相匹配。
在实际应用中,例如我在另一篇关于IBI 与待读通知的文章中提到的情况,在发生 IBI 并执行私人读取后,从属设备的传输计数是不可预测的,可能会发生变化。当主站使用大缓冲区调用读取传输函数时,传输函数需要返回实际传输的计数。
你好@黄铃铃
我已经测试过了。
您是对的。
我检查了 I3C_MasterReceive 函数。
/* Check RX data */
if ((0UL != rxSize) && (0UL != (base->MDATACTRL & I3C_MDATACTRL_RXCOUNT_MASK)))
{
*buf++ = (uint8_t)(base->MRDATAB & I3C_MRDATAB_VALUE_MASK);
rxSize--;
if ((flags & (uint32_t)kI3C_TransferDisableRxTermFlag) == 0UL)
{
if ((!isRxAutoTerm) && (rxSize == 1U))
{
base->MCTRL |= I3C_MCTRL_RDTERM(1U);
}
}
}
它读取数据的大小取决于数据的大小。
我测试了 i3c 中断演示,它支持这一功能。
我将dataSize设置为 50。
它从来没有挂过。
您可以试试看。
BR
哈利