Hello,
Currently I implement a I3C function of mass readback data from the target device.
I use the HAL_I3C_Ctrl_MultipleTransfer_IT, the mass write data into target device that is worked.
But readback data operation is not worked well.
If it readback data under 16 bytes, it is worked.
Therefore, readback data above 16 bytes, that data is limited in 16 bytes.
For example, the first operation that it is setup to readback 32 bytes data, but the waveform shows the readback data is 16 bytes.

And repeat again the same read data operation, it is stucked.

If any specific setting is needed to modify to unlock the read data 16 bytes limitation?
on the controller side, function as below:
void HXREG_READ(uint8_t cas_ID, uint32_t datalenght)
{
uint32_t ctrlread_buffer[0xF];
I2C_TxBuffer[0]=cas_ID;
// Configure private messages
aPrivateDescriptor[0].TargetAddr = TARGET1_DYN_ADDR;
aPrivateDescriptor[0].TxBuf.pBuffer = I2C_TxBuffer;
aPrivateDescriptor[0].TxBuf.Size = 1;
aPrivateDescriptor[0].RxBuf.pBuffer = NULL;
aPrivateDescriptor[0].RxBuf.Size = 0;
aPrivateDescriptor[0].Direction = HAL_I3C_DIRECTION_WRITE;
aPrivateDescriptor[1].TargetAddr = TARGET1_DYN_ADDR;
aPrivateDescriptor[1].TxBuf.pBuffer = NULL;
aPrivateDescriptor[1].TxBuf.Size = 0;
aPrivateDescriptor[1].RxBuf.pBuffer = I2C_RxBuffer;
aPrivateDescriptor[1].RxBuf.Size = datalenght;
aPrivateDescriptor[1].Direction = HAL_I3C_DIRECTION_READ;
// Configure transfer structure
I3Ctransfer.CtrlBuf.pBuffer = ctrlread_buffer;
I3Ctransfer.CtrlBuf.Size = 2;
I3Ctransfer.TxBuf.pBuffer = I2C_TxBuffer;
I3Ctransfer.TxBuf.Size = 1;
I3Ctransfer.RxBuf.pBuffer = I2C_RxBuffer;
I3Ctransfer.RxBuf.Size = datalenght;
// Add descriptors to frame
HAL_I3C_AddDescToFrame(&hi3c1, NULL, aPrivateDescriptor, &I3Ctransfer, I3Ctransfer.CtrlBuf.Size, I3C_PRIVATE_WITHOUT_ARB_RESTART);
// Start the transfer
HAL_StatusTypeDef status = HAL_I3C_Ctrl_MultipleTransfer_IT(&hi3c1, &I3Ctransfer);
if (status != HAL_OK) {
Error_Handler();
}
// Wait for transfer to complete
while (HAL_I3C_GetState(&hi3c1) == HAL_I3C_STATE_BUSY_TX_RX) {
// Optionally, handle other tasks
}
}