2025-03-24 9:59 PM - last edited on 2025-03-25 6:42 AM by mƎALLEm
Hello STM32 Community,
I'm working on an STM32 Nucleo-H503RB board and trying to communicate with a P3T1755 temperature sensor over I3C. According to the P3T1755 datasheet, I need to perform dynamic addressing using the SETDASA CCC. I followed the official ST I3C guideline (Getting started with I3C - stm32mcu) and adapted the LPS22HH example to my setup. However, I'm encountering an issue.
Disable IBI interrupt (DISEC CCC) → Works correctly (Verified on oscilloscope :white_heavy_check_mark:)
Reset previous dynamic address (RSTDAA CCC) → Works correctly (Verified on oscilloscope :white_heavy_check_mark:)
Assign dynamic address using SETDASA CCC → Fails :cross_mark:
The error occurs at:
if (HAL_I3C_AddDescToFrame(&hi3c1, aSET_DASA_P3T1755, NULL, &aContextBuffers[I3C_IDX_FRAME_1], 1, I3C_DIRECT_WITHOUT_DEFBYTE_RESTART) != HAL_OK) { Error_Handler(); }
On the oscilloscope, SDA and SCL remain constant after the second step (RSTDAA).
Has anyone successfully assigned a dynamic address to the P3T1755 sensor using I3C on STM32?
Any debugging suggestions to ensure the P3T1755 properly receives and acknowledges the dynamic address?
/* USER CODE BEGIN PTD */
#define Direct_GETDCR 0x8F // GETDCR CCC Code
#define Direct_SETDASA 0x87
#define Broadcast_DISEC 0x01
#define Broadcast_RSTDAA 0x06
#define P3T1755_STATIC_ADDR 0x4F // This is correct from your sensor setup
#define P3T1755_DYNAMIC_ADDR 0x32 // You can assign any valid 7-bit dynamic address
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define I3C_IDX_FRAME_1 0U /* Index of Frame 1 */
#define I3C_IDX_FRAME_2 1U /* Index of Frame 2 */
/* USER CODE END PD */
/* USER CODE BEGIN PV */
uint8_t aSETDASA_P3T1755_data[1] = {(P3T1755_DYNAMIC_ADDR << 1)};
uint8_t aDISEC_data[1] = {0x08}; // Disable IBI interrupt
/* Buffer used for transmission */
uint8_t aTxBuffer[0x0F];
/* Buffer used by HAL to compute control data for the Private Communication */
uint32_t aControlBuffer[0xF];
/* Context buffer related to Frame context, contain different buffer value for a communication */
I3C_XferTypeDef aContextBuffers[2];
/* Descriptor for direct write SETDASA CCC */
I3C_CCCTypeDef aSET_DASA_P3T1755[] =
{
/*Target Addr CCC Value CCC data + defbyte pointer CCC size + defbyte Direction */
{0x4F,Direct_SETDASA,{aSETDASA_P3T1755_data,1},HAL_I3C_DIRECTION_WRITE},
};
/* Descriptor for direct write DISEC CCC */
I3C_CCCTypeDef aSET_CCC_DISEC[] =
{
{0x4F,Broadcast_DISEC, {aDISEC_data,1},LL_I3C_DIRECTION_WRITE},
};
/* Descriptor for direct write RST CCC */
I3C_CCCTypeDef aSET_CCC_RST[] =
{
{0x4F,Broadcast_RSTDAA, {NULL,0},LL_I3C_DIRECTION_WRITE},
};
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
/* Send a DISEC to disable IBI interrupt */
aContextBuffers[I3C_IDX_FRAME_1].CtrlBuf.pBuffer = aControlBuffer;
aContextBuffers[I3C_IDX_FRAME_1].CtrlBuf.Size = 1;
aContextBuffers[I3C_IDX_FRAME_1].TxBuf.pBuffer = aTxBuffer;
aContextBuffers[I3C_IDX_FRAME_1].TxBuf.Size = 1;
/* Add context buffer Set CCC frame in Frame context */
if (HAL_I3C_AddDescToFrame(&hi3c1,
aSET_CCC_DISEC,
NULL,
aContextBuffers,
1,
I3C_BROADCAST_WITHOUT_DEFBYTE_RESTART) != HAL_OK)
{
Error_Handler();
}
if (HAL_I3C_Ctrl_TransmitCCC(&hi3c1, aContextBuffers, 1000) != HAL_OK)
{
Error_Handler();
}
while (HAL_I3C_GetState(&hi3c1) != HAL_I3C_STATE_READY)
{
}
/* Send a RSTDAA to reset previous dynamic address the target */
aContextBuffers[I3C_IDX_FRAME_1].CtrlBuf.pBuffer = aControlBuffer;
aContextBuffers[I3C_IDX_FRAME_1].CtrlBuf.Size = 1;
aContextBuffers[I3C_IDX_FRAME_1].TxBuf.pBuffer = aTxBuffer;
aContextBuffers[I3C_IDX_FRAME_1].TxBuf.Size = 1;
/*Add context buffer Set CCC frame in Frame context */
if (HAL_I3C_AddDescToFrame(&hi3c1,
aSET_CCC_RST,
NULL,
aContextBuffers,
1,
I3C_BROADCAST_WITHOUT_DEFBYTE_RESTART) != HAL_OK)
{
Error_Handler();
}
if (HAL_I3C_Ctrl_TransmitCCC(&hi3c1, aContextBuffers, 1000) != HAL_OK)
{
Error_Handler();
}
while (HAL_I3C_GetState(&hi3c1) != HAL_I3C_STATE_READY)
{
}
/* Send a SETDASA to set the dynamic on P3T1755 using his static address */
aContextBuffers[I3C_IDX_FRAME_1].CtrlBuf.pBuffer = aControlBuffer;
aContextBuffers[I3C_IDX_FRAME_1].CtrlBuf.Size = 1;
aContextBuffers[I3C_IDX_FRAME_1].TxBuf.pBuffer = aTxBuffer;
aContextBuffers[I3C_IDX_FRAME_1].TxBuf.Size = 1;
/* Add context buffer Set CCC frame in Frame context */
if (HAL_I3C_AddDescToFrame(&hi3c1,
aSET_DASA_P3T1755,
NULL,
&aContextBuffers[I3C_IDX_FRAME_1],
1,
I3C_DIRECT_WITHOUT_DEFBYTE_RESTART) != HAL_OK)
{
Error_Handler();
}
if (HAL_I3C_Ctrl_TransmitCCC_IT(&hi3c1, &aContextBuffers[I3C_IDX_FRAME_1]) != HAL_OK)
{
Error_Handler();
}
while (HAL_I3C_GetState(&hi3c1) != HAL_I3C_STATE_READY)
{
}
/* After a dynamic address has been assigned, the sensor is recognized as an I3C device */
/* Check if the P3T1755 sensor is ready to communicate in I3C */
if (HAL_I3C_Ctrl_IsDeviceI3C_Ready(&hi3c1, P3T1755_DYNAMIC_ADDR, 300, 1000) != HAL_OK)
{
Error_Handler();
}
/* USER CODE END 2 */