你好,
請問 I3C interrupt master example中這段 code 是Read , 我錄起來的波型是Write是正確的嗎?
請問這段code 的工作內容是master 從 slave read data 嗎?
為甚麼waveform 看起來像 master一直在傳送data 給slave?
謝謝
masterXfer.slaveAddress = 0x30U;
masterXfer.data = g_master_rxBuff;
masterXfer.dataSize = I3C_DATA_LENGTH - 1U;
masterXfer.direction = kI3C_Read;
masterXfer.busType = kI3C_TypeI3CSdr;
masterXfer.flags = kI3C_TransferDefaultFlag;
masterXfer.ibiResponse = kI3C_IbiRespAckMandatory;
result = I3C_MasterTransferNonBlocking(EXAMPLE_MASTER, &g_i3c_m_handle, &masterXfer);
if (kStatus_Success != result)
{
return result;
}
timeout = 0U;
/* Wait for transfer completed. */
while ((!g_ibiWonFlag) && (!g_masterCompletionFlag) && (g_completionStatus == kStatus_Success) &&
(++timeout < I3C_TIME_OUT_INDEX))
{
__NOP();
}
result = g_completionStatus;
if ((result != kStatus_Success) || (timeout == I3C_TIME_OUT_INDEX))
{
return -1;
}
g_masterCompletionFlag = false;
Hi @AlicePXLin ,
Maybe you didn't see the correct area in the wave, this is my previous wave:
write:
read:
Wish it helps you!
Best Regards,
Kerry
感謝你的幫忙!
請問 evkmimxrt685_i3c_interrupt_b2b_transfer_slave 中的Read 與 evkmimxrt685_i3c_polling_b2b_transfer_slave 中的Read
波型會有差異嗎?
我該如何知道是否為IBI?
謝謝!
Hi @AlicePXLin ,
IBI 的数据应该是符合下面流程图:
我记得MIMXRT685-AUDIO-EVK, 这个会接一个外部sensor,然后是IBI的,之前我测过,但是忘记波形放哪里了。和这个单纯传数据不一样。
关于interrupt和polling,应该波形一样,你可以测试看看。上面我给的波形是polling的。暂时手上没有工具,在家办公,没法测,你可以测试看看。多跑几遍,看上去你的逻辑分析仪好像不太能抓全波形。
IBI的应该可以看到mandatory byte。
比如如下代码:
主机:
i3c_register_ibi_addr_t ibiRecord = {.address = {0x30U}, .ibiHasPayload = true};
I3C_MasterRegisterIBI(EXAMPLE_MASTER, &ibiRecord);
I3C_MasterTransferCreateHandle(EXAMPLE_MASTER, &g_i3c_m_handle, &masterCallback, NULL);
result = kStatus_Success;
while (1)
{
if (g_ibiWonFlag)
{
PRINTF("\r\nReceived slave IBI request.");
for (uint8_t count = 0; count < g_ibiUserBuffUsed; count++)
{
PRINTF(" Data %x.", g_ibiUserBuff[count]);
}
g_ibiWonFlag = false;
g_pollIbiEvent = false;
}
if (g_pollIbiEvent)
{
do
{
i3c_poll_slaveIBI(EXAMPLE_MASTER, &g_i3c_m_handle);
} while(result != kStatus_Success);
}
}
从机:
PRINTF("\r\n I3C master I3C SDR transfer finished .\r\n");
uint8_t ibiData = 0x55U;
I3C_SlaveRequestIBIWithData(EXAMPLE_SLAVE, &g_i3c_s_handle, &ibiData, 1);
PRINTF("\r\n I3C slave request IBI event with one mandatory byte %x.\r\n", ibiData);
Best Regards,
Kerry
感謝你的回覆!
請問下面這行code在SDK 2.11.1有嗎?
i3c_poll_slaveIBI(EXAMPLE_MASTER, &g_i3c_m_handle);
我沒有看到此function
請問可以提供此function 的code嗎 ?
謝謝!
Hi @AlicePXLin ,
那个并非是SDK发布的代码,所以我不能分享出来。
不过对于IBI, 你可以参考现在SDK发布的代码:
SDK_2_11_1_MIMXRT685-AUD-EVK\boards\mimxrt685audevk\driver_examples\i3c\master_read_sensor_icm42688p
https://mcuxpresso.nxp.com/en/builder?hw=MIMXRT685-AUD-EVK
你可以看看,这个是IBI接sensor的,MIMXRT685-AUD-EVK带一个I3C的sensor。
Best Regards,
kerry
感謝!
想請問
i3c_register_ibi_addr_t ibiRecord = {.address = {0x30U}, .ibiHasPayload = true};
I3C_MasterRegisterIBI(EXAMPLE_MASTER, &ibiRecord);
I3C_MasterTransferCreateHandle(EXAMPLE_MASTER, &g_i3c_m_handle, &masterCallback, NULL)
這段 code 是在設定哪些東西呢?
謝謝
Hi @AlicePXLin
IBI, 你下载这个代码吧:
SDK_2_11_1_MIMXRT685-AUD-EVK\boards\mimxrt685audevk\driver_examples\i3c\master_read_sensor_icm42688p
之前的代码片段不能给你完整版代码,因为还是内部没发布的。
你看已经发布的IBI代码会比较好!
Best Regards,
Kerry
你好
你提到的範例我已下載
裡面也有一樣的function(如下)
I3C_MasterTransferCreateHandle(EXAMPLE_MASTER, &g_i3c_m_handle, &masterCallback, NULL);
i3c_register_ibi_addr_t ibiRecord = {.address = {SENSOR_ADDR}, .ibiHasPayload = true};
I3C_MasterRegisterIBI(EXAMPLE_MASTER, &ibiRecord);
不過不太了解此設定的作用
謝謝!
Hi @AlicePXLin
/*! @brief Structure with setting master IBI rules and slave registry. */
typedef struct _i3c_register_ibi_addr
{
uint8_t address[5]; /*!< Address array for registry. */
bool ibiHasPayload; /*!< Whether the address array has mandatory IBI byte. */
} i3c_register_ibi_addr_t;
这个是注册IBI功能。
如果你看看I3C 协议手册, IBI的传输情况,是要用到mandatory IBI 字节的,就相当于主机注册之后,如果从机发起IBI波形,主机这边就能够识别。
如果能够有这个配套板子测试抓个波形就更好理解了。
我之前抓过,但是找不到波形了,暂时手里也没板子抓给你看。
所以你那边如果有icm42688,可以接上去测试试。
Best Regards,
Kerry