49. Improved inter-integrated circuit (I3C)

This section applies to STM32U375/385 and STM32U3B5/3C5 devices only.

49.1 I3C introduction

The I3C interface handles communication with other devices such as sensor(s) and host processor.

An I3C bus is a two-wire, serial single-ended, multi-drop bus, intended to improve the legacy I 2 C bus. The I3C interface improves the features of the I 2 C interface (adding especially in-band interrupts, dynamic address assignment, energy-efficient data rates, power management) meanwhile preserving some backward compatibility: it allows an I 2 C target to operate on an I3C bus in legacy I 2 C standard-mode (Sm), fast-mode (Fm), or legacy I 2 C fast-mode plus (Fm+), provided that the latter does not perform clock stretching.

The I3C SDR-only peripheral implements all the required features and many optional features of the MIPI ® I3C specification v1.1 (see Table 526: I3C peripheral controller/target features versus MIPI v1.1 ). It can control all I3C bus-specific sequencing, protocol, arbitration, and timing.

After reset, the software can initialize the I3C peripheral as primary controller or as target:

The I3C peripheral can be used with DMA, to off-load the CPU.

49.2 I3C main features

The I3C peripheral supports:

49.3 I3C implementation

49.3.1 I3C instantiation

There are several I3C instances in the device, all with the same feature set:

Table 520. I3C instantiation

Instance(s)
I3C1, I3C2

49.3.2 I3C wake-up from low-power mode(s)

The I3C peripheral can wake up the device from a low-power mode, as detailed in Table 521 . For more details about the wake-up capabilities, refer to Section 49.13 .

Table 521. I3C wake-up

Wake-up
From Standby mode
From Stop 0, Stop 1, Stop 2, and Stop 3 modes

49.3.3 I3C autonomous mode with DMA in Stop mode(s)

The I3C peripheral can be assisted with an autonomous DMA, functional in Stop mode, so that I3C transfer(s) is (are) performed over the I3C bus, as written to and/or read from the I3C FIFO-based registers via the programmed DMA channels, without involving the CPU. Afterwards, the I3C or/and DMA can be used to wake up the device from Stop mode.

Table 522 indicates the I3C instance(s) and DMA(s) able to operate autonomously in a Stop mode.

Table 522. I3C autonomous mode with DMA in Stop mode(s)

InstanceAutonomous mode with DMA
I3C1, I3C2In Stop 0 and Stop 1 modes (with GPDMA1)

49.3.4 I3C FIFOs

The FIFOs are implemented as defined in Table 523 .

Table 523. I3C FIFOs implementation

FIFOContentUnitSize (in unit)Used as controller/target (rationale)
C-FIFO(32-bit) Control wordsWord2Controller (a frame can be based on multiple control words; this is not the case as target)
S-FIFO(32-bit) Status wordsController (target: status only in register mode)
TX-FIFOTransmitted dataByte8Controller and target
RX-FIFOReceived data

49.3.5 I3C triggers

During initialization (when EN = 0 in I3C_CFGR register), a hardware trigger signal can be configured (via TRIGHWEN, TRIGPOL, and TRIGSEL[3:0] of the I3C_CFGR register) so that the I3C peripheral, when acting as controller, can issue a frame transfer on the I3C bus once detected a trigger hit (rising/falling edge) of the enabled and selected hardware trigger.

The I3C trigger mapping is specified in Table 524 .

Table 524. I3C triggers, when I3C as controller

TRIGSEL[0:3] in I3C_CFGR registerSelected I3C trigger
0gpdma1_ch0_tc
1gpdma1_ch1_tc
2gpdma1_ch2_tc
3gpdma1_ch3_tc
4exti5
5exti9
6lptim1_ch1
7lptim2_ch1
8comp1_out
9comp2_out
10rtc_alara_trg
11rtc_wut_trg
12tim15_trgo
13tim16_oc1
14tim12_trgo (1)
15-

1. Only available on STM32U3B5/3C5 devices.

49.3.6 I3C interrupt(s)

The interrupt mapping is implemented as detailed in Table 525 .

Table 525. I3C interrupt(s)

Signal nameSignal typeDescription
i3c_err_itOError interrupt line
i3c_evt_itOEvent interrupt line

49.3.7 I3C MIPI ® support

The I3C peripheral supports the MIPI specification v1.1, as defined in Table 526 .

Table 526. I3C peripheral controller/target features versus MIPI v1.1

FeatureMIPI I3C v1.1I3C peripheralComments
When controllerWhen target
I3C SDR messageXXX-
Legacy I 2 C message (Sm/Fm/Fm+)XX-Mandatory when controller if the I3C bus is mixed with (external) legacy I 2 C target(s).
Optional in MIPI v1.1 when target.
HDR DDR messageX--Optional in MIPI v1.1
HDR-TSL/TSP, HDR-BTX--Optional in MIPI v1.1
Dynamic address assignmentXXXSupported broadcast ENTDAA when controller and target.
Supported broadcast SETAASA and direct SETDASA when controller.
7-bit static I 2 C addressXX-No support of the I3C peripheral as target on an I 2 C bus.
Grouped addressingXX-Optional in MIPI v1.1
CCCsXXXMandatory and some optional CCCs supported (refer to Table 532 when controller/target).
Error detection and recoveryXXX-
In-band interrupt (with MDB)XXX-
Secondary controllerXXX-
Hot-join mechanismXXX-
Target resetXXX-
Synchronous timing controlXX-Optional in MIPI v1.1
Asynchronous timing control 0XX-Mandatory in MIPI v1.1 when controller.
Optional in MIPI v1.1 when target.
Asynchronous timing control 1, 2, 3X--Optional in MIPI v1.1
Device to device tunnelingXX-Optional in MIPI v1.1
Multi-lane data transferX--Optional in MIPI v1.1
Monitoring device early terminationX--Optional in MIPI v1.1

49.4 I3C block diagram

The I3C block diagram is illustrated in Figure 670 .

Figure 670. I3C block diagram

Figure 670. I3C block diagram. The diagram shows the internal architecture of the I3C block. On the left, a 32-bit APB bus is connected to an APB interface. The APB interface contains TX-FIFO, RX-FIFO, C-FIFO, S-FIFO, and I3C registers. DMA requests (i3c_rx_dma, i3c_tx_dma, i3c_tc_dma, i3c_rs_dma), Triggers(1), Interrupt, i3c_ibi_ack event, and Clocks request (i3c_pclk, i3c_ker_clk) are shown as inputs/outputs to the APB interface. The APB interface is connected to a Kernel block, which contains Data and control serialization / deserialization, Bus protocol management, Controller finite state machine, Target finite state machine, and Clock and timing management. The Kernel block is connected to a Serial bus interface, which contains Bus input and output control. The Serial bus interface is connected to two GPIO logic blocks. The top GPIO logic block is connected to the I3C_SDA pin and a Reset pattern detection (in the VDD domain) block. The bottom GPIO logic block is connected to the I3C_SCL pin and the same Reset pattern detection block. The Reset pattern detection block is also connected to the Bus input and output control. The diagram is labeled MSv56252V3.
Figure 670. I3C block diagram. The diagram shows the internal architecture of the I3C block. On the left, a 32-bit APB bus is connected to an APB interface. The APB interface contains TX-FIFO, RX-FIFO, C-FIFO, S-FIFO, and I3C registers. DMA requests (i3c_rx_dma, i3c_tx_dma, i3c_tc_dma, i3c_rs_dma), Triggers(1), Interrupt, i3c_ibi_ack event, and Clocks request (i3c_pclk, i3c_ker_clk) are shown as inputs/outputs to the APB interface. The APB interface is connected to a Kernel block, which contains Data and control serialization / deserialization, Bus protocol management, Controller finite state machine, Target finite state machine, and Clock and timing management. The Kernel block is connected to a Serial bus interface, which contains Bus input and output control. The Serial bus interface is connected to two GPIO logic blocks. The top GPIO logic block is connected to the I3C_SDA pin and a Reset pattern detection (in the VDD domain) block. The bottom GPIO logic block is connected to the I3C_SCL pin and the same Reset pattern detection block. The Reset pattern detection block is also connected to the Bus input and output control. The diagram is labeled MSv56252V3.

1. Refer to Section 49.3.5: I3C triggers .

49.5 I3C pins and internal signals

Table 527. I3C input/output pins

Pin namePin typeDescription
I3C_SDAInput/outputSerial bus data line
I3C_SCLInput/outputSerial bus clock line

Note: During initialization, the selected GPIOs for I3C_SCL and I3C_SDA should be configured as alternate function and no pull.

Table 528. I3C internal input/output signals

Signal nameSignal typeDescription
i3c_pclkIAPB clock
i3c_ker_clkIKernel clock (also named as I3CCLK)
i3c_pclk_reqOAPB clock request
i3c_ker_clk_reqOKernel clock request
i3c_it (1)OGlobal interrupt line

Table 528. I3C internal input/output signals (continued)

Signal nameSignal typeDescription
i3c_err_it (1)OError interrupt line
i3c_evt_it (1)OEvent interrupt line
i3c_trg[15:0]ITriggers, see Table 524 for the mapping
i3c_rx_dmaODMA request for reading received bytes/words from RX-FIFO
i3c_tx_dmaODMA request for writing to be transmitted bytes/words to TX-FIFO
i3c_tc_dmaODMA request for writing to be transmitted control words to C-FIFO, when the I3C peripheral acts as controller
i3c_rs_dmaODMA request for reading status words from S-FIFO, when the I3C peripheral acts as controller

1. Refer to Section 49.3.6: I3C interrupt(s) .

49.6 I3C reset and clocks

49.6.1 I3C reset

On a system reset, the I3C peripheral is reset.

Alternatively, the software can reset specifically the I3C peripheral by writing the corresponding reset control bit (I3CxRST) of the reset and clock controller (RCC). Refer to the RCC section of this document for more details.

Additionally, when acting as target, the enabled I3C peripheral (EN = 1 in the I3C_CFGR register) can receive an in-band reset pattern on the I3C bus from the controller. The software is then notified (when RSTF = 1 in the I3C_EVR register and/or the corresponding interrupt is enabled) to perform the requested action, as registered in RSTACT[1:0] of the I3C_DEVR0 register, on the former reception of the broadcast or direct RSTACT CCC. Refer to Table 532 and Section 49.16.17 for more details.

This reset interrupt notification can be used to wake up from a low power mode. Finally, in an advanced low-power mode such as Standby, where the I3C peripheral is powered off but the device is in retention mode ( \( V_{DD} \) is powered on), the I3C reset pattern detection block can be enabled via the PWR module, and used to wake up the device.

For more details about the corresponding low-power mode(s), refer to the power management in the PWR section.

49.6.2 I3C clocks and requirements

As indicated in Figure 670 , the I3C peripheral is implemented with several clock domains:

for a hot-join request), by programming I3C timing register 1 (I3C_TIMINGR1) , as summarized in Target initialization .

APB clock and kernel clocks are driven from independently programmed clock sources via the RCC (refer to section Reset and clock control (RCC) for more details).

I3C kernel clock requirement, as controller

According to the intended value of the SCL clock on the bus, the application must guarantee that the frequency of the I3CCLK kernel clock be at least 2x the frequency of the SCL clock

Note: Sustaining \( F_{SCL\_max} = 12.9 \) MHz means a frequency of the I3CCLK kernel clock \( > 25.8 \) MHz.

I3C kernel clock requirements, as target

According to the intended value of the SCL clock on the bus, the application must guarantee a minimum operating frequency for the I3CCLK kernel clock, meeting the following constraints:

  1. 1. Period of the I3CCLK kernel clock \( < t_{HIGH} \) (SCL clock high period)
    • \( t_{HIGH\_min} = 24 \) ns. A frequency higher than 41.7 MHz guarantees this constraint, which can be relaxed, depending on the I3C bus/controller
  2. 2. Period of the I3CCLK kernel clock \( < t_{CASr} \) (clock after repeated start condition)
    • \( t_{CASr\_min} = t_{CAS\_min} / 2 = 19.2 \) ns. A frequency higher than 52 MHz guarantees this constraint, which can be relaxed, depending on the I3C bus/controller
  3. 3. Two periods of the I3CCLK kernel clock \( < t_{LOW\_OD} \) (SCL clock low period in open drain)
    • \( t_{LOW\_OD\_min} = 200 \) ns. A frequency higher than 10 MHz guarantees this constraint, which can be relaxed, depending on the I3C bus/controller
  4. 4. Frequency of the I3CCLK kernel clock \( > 2.5x \) frequency of the SCL clock
    • \( F_{SCL\_max} = 12.9 \) MHz. A frequency higher than 32.3 MHz guarantees this constraint, which can be relaxed, depending on the I3C controller

APB clock requirement

According to the intended value of the SCL clock on the bus, the application must guarantee a minimum operating frequency for the APB clock:

\[ \text{APB clock period} < 3x \text{ (SCL clock period)} - \text{I3CCLK kernel clock period} \]

This means that \( F_{APB} > [F_{SCL} \times F_{I3CCLK} / (3x F_{I3CCLK} - F_{SCL})] \)

Note: This equation can be simplified to a minimum value of 5 MHz for the APB frequency.

49.7 I3C peripheral state and programming

49.7.1 I3C peripheral state

The I3C peripheral plays the role of I3C bus controller, or the role of an I3C target. In any case (see Figure 671 and Figure 672 ), the peripheral is in one of the following states:

Once the software initiates a transfer (as controller: when the software initiates a frame transfer; as target: when the software initiates an IBI/CR/HJ request).

Once the hardware receives a request from another I3C device on the bus (as controller: after a start request from a target and a maximum \( T_{CAS} \) time; as target: when receiving a broadcast/direct CCC or a private read/write).

Note: The software can disable the I3C peripheral (write EN = 0), partially resetting it (subparts within the SCL clock domain and the I3CCLK kernel clock domain). Event, interrupt, and clock request generation are also impacted. The previously written configuration of the APB registers is kept and not modified.

Note: The software can disable the generation of the FCF flag by writing 1 into the FCFDIS bit of the I3C_CFGR register. This can be used with hardware triggers and autonomous DMA (if this feature is available, see Section 49.3 ), to stream a series of frames.

49.7.2 I3C controller state and programming sequence

Figure 671 illustrates the overall programming sequence of the I3C peripheral acting as (primary) controller, including state transitions, main subtasks, and conditions, as explained in this section.

Figure 671. I3C (primary) controller state and programming sequence diagram

Flowchart showing I3C controller state and programming sequence. It starts with I3C state = DISABLED, followed by configuration steps, then I3C state = IDLE, and finally I3C state = ACTIVE with transfer logic.

I3C state = DISABLED

Enable I3C: write and set I3C_CFGR.EN = 1

I3C state = IDLE

Initiate a frame transfer, by any of the following methods:

  1. i) SW-triggered: write and set I3C_CFGR.TSF-SET = 1 on a detected HW trigger hit
  2. ii) HW-triggered 1 : write the first I3C_CR control word (by software)
  3. iii) No triggering:

I3C state = ACTIVE

Executing the control (and data, if any) message transfer on the I3C bus based on I3C_CR and I3C_TD(W)R or I3C_RD(W)R

No transfer error ?

  • N: Setting ERRF = 1 Transfer error
  • Y: Updating message status I3C_SR

Last message of the frame ? (I3C_CR.MEND = 1?)

  • N: Loop back to "Executing the control..."
  • Y: Setting FCF = 1 Frame completed

Receiving (or not) a start request from any target i (i = 1 up to 4) Activating SCL before a maximum T us (c.f. bus activity state 0-3)

Receiving an IBI/CR/HJ request from any target i

Acknowledged ? (by hardware)

  • N: Loop back to "Receiving (or not) a start request..."
  • Y: Receiving IBI payload data, if any (if I3C_DEVRI.BIDEN=1)

No transfer error ?

  • N: Setting ERRF = 1 Transfer error
  • Y: Setting IBIF = 1 or CRF = 1 or HJF = 1 IBI/CR/HJ request completed

End

MSV68307V5

Flowchart showing I3C controller state and programming sequence. It starts with I3C state = DISABLED, followed by configuration steps, then I3C state = IDLE, and finally I3C state = ACTIVE with transfer logic.

1. This feature is implementation-dependent and can be unavailable. Refer to Section 49.3.5: I3C triggers .

Controller initialization

When the controller is in disabled state (EN = 0 in the I3C_CFGR register), the software must initialize as follows:

Then, the software can enable the I3C peripheral (set EN = 1).

Note: The software can write once all the fields of the I3C_CFGR while enabling it.

Start a controller-initiated frame transfer

When the controller is in enabled state (EN = 1 in the I3C_CFGR register), the software can initiate a frame transfer by any of the following configuration methods:

Then, regardless of the frame starting method, the I3C peripheral switches to active state. While the control word is not the last message of the I3C frame (while MEND = 0 in the I3C_CR register), and while there is no transfer error (while ERRF = 1 in the I3C_EVR register), the hardware keeps requesting a next control word, and continuing the frame transfer:

Start and receiving a target-initiated transfer

When the controller is in enabled state (EN = 1 in the I3C_CFGR register), concurrently to a possible controller-initiated transfer, a target can initiate a transfer by issuing a start request (drive SDA low), provided the controller has allowed a hot-join request, an IBI request, or a controller-role request via the I3C_DEVR0 register.

In this case, even though the controller software has no intent to start a frame transfer, the hardware switches to active state (activates the SCL clock before a maximum \( t_{CAS} \) time defined as 1 µs, 100 µs, 2 ms, or 50 ms, depending on, respectively, the bus activity state 0, 1, 2, or 3) to receive the hot-join/in-band interrupt/controller-role request from the target.

For more information about the execution of target-initiated I3C bus transfer and its related programming as a controller, refer to the relevant figures in Section 49.9 :

Executing a (controller-initiated) frame transfer

The controller executes on the bus the frame transfer until the completion of the last message (FCF = 1 in the I3C_EVR register), or a transfer error (ERRF = 1 in the I3C_EVR register).

register), and the corresponding interrupt, if enabled. This is based on I3C_CR and I3C_TD(W)R registers, written explicitly by software or pushed by the allocated DMA channel, and based on the I3C_RD(W)R, read explicitly by the software or by the allocated DMA channel. Then the I3C controller switches back to idle state.

For more information about the execution of controller-initiated I3C bus transfer and its related programming as a controller, refer to figures in Section 49.9 :

Figure 671 does not include the management of the FIFOs (TX-FIFO, RX-FIFO, C-FIFO, and S-FIFO). This is detailed in Section 49.10 .

For each completed message without transfer error, the hardware reports the exchanged transfer on the I3C bus by updating I3C status register (I3C_SR) , which can be read or not by the software when the S-FIFO is disabled (SMODE = 0 in the I3C_CFGR register).

Alternatively, if the S-FIFO is enabled (SMODE = 1 in the I3C_CFGR register), the status register I3C_SR must be read for each executed message, either directly by the software (notified by SFNEF = 1 in the I3C_EVR register and the corresponding interrupt, if enabled), or via the DMA (if SDMAEN = 1 in the I3C_CFGR register), no matter if a read is prematurely ended by the target or not. Frame completion (FCF = 1 in the I3C_EVR register) occurs only after reading the status of the last message (S-FIFO is empty). For more information, refer to Section 49.10.4 .

Updating the configuration for a transfer, as controller

Back in idle state, the software can update the configuration of the I3C peripheral before the next transfer:

The registers usage versus the I3C peripheral role as controller is summarized in Section 49.8.1 .

The static/dynamic registers fields usage when acting as controller is summarized in Table 530 .

49.7.3 I3C target state and programming sequence

Figure 672 illustrates the overall programming sequence of the I3C peripheral acting as target, including state transitions, main subtasks, and conditions, as explained in this section.

Figure 672. I3C target state and programming sequence diagram

I3C target state and programming sequence diagram flowchart
    graph TD
      subgraph DISABLED [I3C state = DISABLED]
        Init[Initialize I3C as target
(keeping I3C_CFGR.EN = 0)

Initialize I3C peripheral as target:
write and clear I3C_CFGR.CRINIT=0
Set I3C bus available/hand-off condition timings:
write I3C_TIMINGR1.AVAL[7:0]
Enable/disable IBI request:
write I3C_DEVR0.IBIEN
Enable/disable controller-role request:
write I3C_DEVR0.CREN
Enable/disable hot-join:
write I3C_DEVR0.HJEN
Set/initialize target characteristics and capabilities:
write I3C_BCR, I3C_DCR, I3C_MAXRLR, I3C_MAXWLR, I3C_GETCAPR, I3C_GETMXASR, I3C_EPIDR] Config[Configure (the execution mode of) a transfer via I3C_CFGR:

Configure TX-FIFO byte/word threshold: TXTHRES
Configure RX-FIFO byte/word threshold: RXTHRES
Enable/disable DMA mode for FIFOs: TXDMAEN, RXDMAEN
Disable S-FIFO for I3C_SR: SMODE=0

Configure interrupt/polling mode for any event: write I3C_IER] end Init --> Config Config --> Enable[Enable I3C peripheral: write and set I3C_CFGR.EN=1] subgraph IDLE [I3C state = IDLE] Update[Update (or not) the configuration of a private transfer or
the DEFORPA/DEFTGTS CCC transfer:
write I3C_CFGR fields

Configure TX-FIFO byte/word threshold: TXTHRES
Configure RX-FIFO byte/word threshold: RXTHRES
Enable/disable DMA mode for TX-FIFO: TXDMAEN
Enable/disable DMA mode for RX-FIFO: RXDMAEN

Read status: read I3C_SR
(especially on private read or DEFTGTS/DEFORPA CCC)

If controller early ended the private read
(i.e. if I3C_SR.XDCNT < I3C_TGTDDR.TGTDCNT):
flush TX-FIFO (i.e. write I3C_CFGR.TXFLUSH=1)] PrepIBI[Prepare IBI payload if any: write I3C_IBDR if I3C_BCR.BCR2=1] InitIBI[Initiate the IBI request: write I3C_CR (with MTYPE[3:0]=1010)] InitCR[Initiate the controller-role request: write I3C_CR (with MTYPE[3:0]=1001)] InitHJ[Initiate the hot-join request: write I3C_CR (with MTYPE[3:0]=1000)] PrepRead[Configure/prepare I3C_TGTDDR or I3C_TDWR for private read] end Enable --> Update Update --> PrepIBI PrepIBI --> InitIBI Update --> InitCR Update --> InitHJ Update --> PrepRead subgraph ACTIVE [I3C state = ACTIVE] IBI_Exec[if I3C_DEVR0.IBIEN=1 and I3C_DEVR0.DAVAL=1:
Executing the IBI request on the I3C bus] CR_Exec[if I3C_DEVR0.CREN=1 and I3C_DEVR0.DAVAL=1:
Executing the CR request on the I3C bus] HJ_Exec[if I3C_DEVR0.HJEN=1:
Executing the HJ request on the I3C bus] BCCC_Exec[Receiving a (write) broadcast CCC on the I3C bus] DCCC_Exec[Receiving and acknowledging a direct read/write CCC on the I3C bus] Priv_Exec[Receiving and acknowledging a private read/write on the I3C bus] InitIBI --> IBI_Exec InitCR --> CR_Exec InitHJ --> HJ_Exec Update --> BCCC_Exec Update --> DCCC_Exec PrepRead --> Priv_Exec IBI_Exec --> IBI_Ack{Acknowledge?
(by controller)} IBI_Ack -- Yes --> IBI_Trans[Transmitting IBI payload data if any (if I3C_BCR.BCR2=1)] IBI_Trans --> IBI_ErrCheck{No transfer
error?} IBI_Ack -- No --> IBI_ErrCheck IBI_ErrCheck -- Yes --> IBI_Done[Setting IBIENDF = 1
IBI completed] IBI_ErrCheck -- No --> IBI_Err[Setting ERRF = 1
Transfer error] CR_Exec --> CR_Ack{Acknowledge?
(by controller)} CR_Ack -- Yes --> CR_DoneCheck{GETACCCR
received and
completed?} CR_DoneCheck -- Yes --> CR_Update[Updating status register I3C_SR] CR_Update --> CR_Done[Setting CRUPF = 1
Control gaining completed] CR_DoneCheck -- No --> CR_Err[Setting ERRF = 1
Transfer error] HJ_Exec --> HJ_Ack{Acknowledge?
(by controller)} HJ_Ack -- Yes --> HJ_DoneCheck{ENTDAA
received and
completed?} HJ_DoneCheck -- Yes --> HJ_Update[Updating I3C_DEVR0 with DA[6:0] and DAVAL = 1
Updating I3C_SR] HJ_Update --> HJ_Done[Setting DAUPF = 1
Dynamic addressing
assignment completed] HJ_DoneCheck -- No --> HJ_Err[Setting ERRF = 1
Transfer error] BCCC_Exec --> BCCC_Data[If CCC= (DEFORPA or DEFTGTS):
Receiving write data byte(s) into I3C_RDWR] BCCC_Data --> BCCC_ErrCheck{No transfer
error?} BCCC_ErrCheck -- Yes --> BCCC_Action[Executing CCC specific action
Updating related registers including I3C_SR] BCCC_Action --> BCCC_Done[Setting xxUPDF=1
or RSTF=1
GRPF/DEFF=1
CCC completed] BCCC_ErrCheck -- No --> BCCC_Err[Setting ERRF = 1
Transfer error] DCCC_Exec --> DCCC_ErrCheck{No transfer
error?} DCCC_ErrCheck -- Yes --> DCCC_Action[Executing CCC specific action
Updating/using related registers including I3C_SR] DCCC_Action --> DCCC_Done[Setting I3C_EVR.xxUPDF=1
or I3C_EVR.GETF/STAF=1
CCC completed] DCCC_ErrCheck -- No --> DCCC_Err[Setting ERRF = 1
Transfer error] Priv_Exec --> Priv_Data[On write: Receiving write data byte(s) into I3C_RDWR if any
On read: Transmitting read data byte(s) from I3C_TDWR] Priv_Data --> Priv_ErrCheck{No transfer
error?} Priv_ErrCheck -- Yes --> Priv_Update[Updating status register I3C_SR] Priv_Update --> Priv_Done[Setting I3C_EVR.FCF=1
Private read/write completed] Priv_ErrCheck -- No --> Priv_Err[Setting ERRF = 1
Transfer error] end
I3C target state and programming sequence diagram flowchart

Target initialization

When the target is in disabled state (EN = 0 in the I3C_CFGR register), the software must initialize as follows:

Then, the software can enable the I3C peripheral (write and set EN = 1).

Note: The software can write once all the fields of the I3C_CFGR register while enabling it.

Receiving a (broadcast CCC, direct read/write CCC or private read/write) message on the I3C bus

When the target is in idle state (EN = 1 in the I3C_CFGR register), the target is ready to receive a communication message on the I3C bus from the controller, and is ready to switch to the active state.

Typically, first, the active target is receiving a broadcast ENTDAA CCC, possibly after optional received broadcast ENEC/DISEC CCC(s), and is then assigned a dynamic address. The event DAUPF in the I3C_EVR register is raised to 1, the related interrupt is generated if enabled, and the target goes back to idle state.

After that, the idle target is ready to receive any other broadcast CCC message, or direct read/write CCC, or private read/write message from the controller.

For more information about the execution of controller-initiated I3C bus transfers and its related programming as a target, including the updated I3C registers and fields, refer to figures in Section 49.9 :

Figure 672 does not include the FIFOs management (TX-FIFO, RX-FIFO). This is detailed in Section 49.10 .

Read the message status register

For each received and completed message without transfer error, the hardware reports the exchanged transfer on the bus by updating the I3C status register (I3C_SR) , which can be read by the software after being notified by the corresponding flag in the I3C event register (I3C_EVR) , or by the corresponding interrupt if enabled in the I3C interrupt enable register (I3C_IER) .

I3C status register (I3C_SR) must be read by the software after the following messages:

Start a (target-initiated) transfer on the I3C bus

When the target goes first from disabled to idle state (software writes EN = 1 in the I3C_CFGR register), concurrently to be able to receive a broadcast CCC from the controller, the software can initiate a hot-join request (the software writes MTYPE[3:0] = 1000 in the I3C_CR register) to be eligible to participate to a next ENTDAA CCC, provided it is allowed to do so (HJEN = 1 in the I3C_DEVR0 register).

Once a dynamic address is assigned (DAUPF = 1 in the I3C_EVR register), more generally and possibly concurrently to a frame transfer emitted by the controller, the software can initiate an IBI (in-band interrupt request) to the controller, or a controller-role request by writing the related control word into the I3C_CR register.

For more information about the execution of target-initiated I3C bus transfer, and its related programming as a target, refer to figures in Section 49.9 :

Updating the configuration of the I3C peripheral, as target

Back in idle state, the software can update the configuration of the I3C target before a next transfer:

The registers usage vs. the I3C peripheral role as target is summarized in Section 49.8.1 .

The static/dynamic registers fields usage, when acting as target, is summarized in Table 531 .

49.8 I3C registers and programming

49.8.1 I3C register set, as controller/target

Table 529 lists the registers and their usage versus the I3C peripheral role.

Table 529. I3C register usage

RegisterUsed as controllerUsed as target
I3C_CRXX
I3C_CFGRXX
I3C_RDRXX
I3C_RDWRXX
I3C_TDRXX
I3C_TDWRXX
I3C_IBIDRXX
I3C_TGTTDR-X
I3C_SRXX
I3C_SERXX
I3C_RMRXX
I3C_EVRXX
I3C_IERXX
I3C_CEVRXX
I3C_MISRXX

Table 529. I3C register usage (continued)

RegisterUsed as controllerUsed as target
I3C_DEVR0XX
I3C_DEVRx (x = 1 to 4)X-
I3C_MAXRLR-X
I3C_MAXWLR-X
I3C_TIMINGR0X-
I3C_TIMINGR1XX
I3C_TIMINGR2X-
I3C_BCR-X
I3C_DCR-X
I3C_GETCAPR-X
I3C_CRCAPR-X
I3C_GETMXDSR-X
I3C_EPIDR-X

49.8.2 I3C registers and fields use versus peripheral state, as controller

When the I3C peripheral acts as controller, Table 530 lists the registers and their usage versus the controller state (disabled, idle, and active).

Table 530. I3C registers/fields usage versus controller state

RegisterUsed as controllerWritable only in disabled stateTypically written/read in idle stateTypically written/read in idle or active state
I3C_CRX--X

Table 530. I3C registers/fields usage versus controller state (continued)

RegisterUsed as controllerWritable only in disabled stateTypically written/read in idle stateTypically written/read in idle or active state
I3C_CFGRXCRINIT
HKSDAEN
TRIGHWEN,
TRIGPOL and
TRIGSEL[3:0]
EN (1)
Write: any used field except {CRINIT, HKSDAEN, TRIGHWEN, TRIGPOL and TRIGSEL[3:0]}, namely
CDMAEN
SDMAEN
TXDMAEN
RXDMAEN
TMODE
SMODE
TXTHRES
RXTHRES
HJACK
EXITPTRN
RSTPTRN
NOARBH (2)
FCFDIS
CFLUSH
SFLUSH
TXFLUSH
RXFLUSH
TSFSET
-
I3C_RDRX--Read
I3C_RDWRX--Read
I3C_TDRX--Write
I3C_TDWRX--Write
I3C_IBIDRX--Read
I3C_TGTTDR-
I3C_SRX--Read
I3C_SERX-Read-
I3C_RMRX--Read RADD[6:0]
IBIRDCNT[2:0]

Table 530. I3C registers/fields usage versus controller state (continued)

RegisterUsed as controllerWritable only in disabled stateTypically written/read in idle stateTypically written/read in idle or active state
I3C_EVRX--Read (controller-role fields):
HJF
CRF
IBIF
FCF
ERRF
RXTGTENDF
RXFNEF
TXFNFF
SFNEF
CFNFF
RXLASTF
TXLASTF
TXFEF
CFEF
I3C_IERXWrite xIE with x = HJ, CR, IBI, FC, ERR, RXTGTEND, RXFNE, TXFNF, SFNE, CFNF (2)
I3C_CEVRX--Write (controller-role fields, refer to I3C_EVR)
I3C_MISRX--Read (controller-role fields):
HJMIS
CRMIS
IBIMIS
FCMIS
ERRMIS
RXTGTENDMIS
RXFNEMIS
TXFNFEMIS
SFNEMIS
CFNFEMIS
I3C_DEVR0XWrite DA[6:0] (2)-
I3C_DEVRx x = 1..4XWrite SUSP, IBIDEN, IBIACK, CRACK, DA[6:0] (2)-
I3C_MAXRLR-
I3C_MAXWLR-
I3C_TIMINGR0XX--
I3C_TIMINGR1XX--
I3C_TIMINGR2XWrite (2)
I3C_BCR-
I3C_DCR-
I3C_GETCAPR-
I3C_CRCAPR-

Table 530. I3C registers/fields usage versus controller state (continued)

RegisterUsed as controllerWritable only in disabled stateTypically written/read in idle stateTypically written/read in idle or active state
I3C_GETMXDSR-
I3C_EPIDR-
  1. 1. Bit EN in the I3C_CFGGR register is written and set in disabled state (when the same bit is 0). This field can be also written and de-asserted in idle state.
  2. 2. These fields are typically written and initialized in disabled state during bus configuration. They are not write-protected when EN = 0, and can be also written and updated in other state(s).

49.8.3 I3C registers and fields usage versus peripheral state, as target

When the I3C peripheral acts as target, Table 531 lists the registers and their usage versus the I3C target state (disabled, idle, and active).

Table 531. I3C registers/fields usage versus target state

RegisterUsed as targetWritable only in disabled stateTypically written/read in idle stateTypically written/read in idle or active state
I3C_CRX-MTYPE[3:0]
DCNT[2:0]
-
I3C_CFGGRXCRINIT
EN (1)
Write: any used field except CRINIT, namely:
{TXDMAEN
RXDMAEN
TXTHRES
RXTHRES} (2)
TXFLUSH
RXFLUSH
-
I3C_RDRX--Read
I3C_RDWRX--Read
I3C_TDRX--Write
I3C_TDWRX--Write
I3C_IBIDRX-Write-
I3C_TGTTDRX-Write-
I3C_SRX--Read
DIR, XDCNT[15:0]
I3C_SERX-Read DOVR, STALL,
PERR, CODERR[3:0]
-
I3C_RMRX--Read RCODE[7:0]

Table 531. I3C registers/fields usage versus target state (continued)

RegisterUsed as targetWritable only in disabled stateTypically written/read in idle stateTypically written/read in idle or active state
I3C_EVRX--Read (target-role fields):
GRPF
DEFF
INTUPDF
ASUPDF
RSTF
MRLUPDF
MWLUPDF
DAUPDF
STAF
GETF
WKPF
CRUPDF
IBIENDF
ERRF
FCF

RXFNEF
TXFNFF

TXLASTF
TXFEF
I3C_IERXWrite xIE with x = GRP, DEF, INTUPD, ASUPD, RST, MRLUPD, MWLUPD, DAUPD, STA, GET, WKP, CRUPD, IBIEND, ERR, FC, RXFNE, TXFNF (2)
I3C_CEVRX--Write (target-role fields, refer to I3C_EVR)
I3C_MISRXRead (target-role fields):
GRPMIS
DEFMIS
INTUPDMIS
ASUPDMIS
RSTMIS
MRLUPDMIS
MWLUPDMIS
DAUPDMIS
STAMIS
GETMIS
WKPMIS
CRUPDMIS
IBIENDMIS
ERRMIS
FCMIS
RXFNEMIS
TXFNFEMIS

Table 531. I3C registers/fields usage versus target state (continued)

RegisterUsed as targetWritable only in disabled stateTypically written/read in idle stateTypically written/read in idle or active state
I3C_DEVR0XHJEN
CREN
IBIEN
Read RSTVAL,
RSTACT[1:0], and
AS[1:0]
-
I3C_DEVRx
x = 1..4
-
I3C_MAXRLRXX--
I3C_MAXWLRXX--
I3C_TIMINGR0-
I3C_TIMINGR1XAVAL[7:0]--
I3C_TIMINGR2-
I3C_BCRXX--
I3C_DCRXX--
I3C_GETCAPRXX--
I3C_CRCAPRXX--
I3C_GETMXDSRXX--
I3C_EPIDRXX--
  1. 1. Bit EN in the I3C_CFGR register is written and set in disabled state (when the same bit is 0). This field can be also written and de-asserted in idle state.
  2. 2. These fields are typically written and initialized in disabled state during I3C bus configuration. They are not write-protected when EN = 0.

49.9 I3C bus transfers and programming

49.9.1 I3C command set (CCCs), as controller/target

The list of the supported I3C command set (for example, list of CCCs, common command codes) and the overview of how they are handled by the I3C peripheral acting as controller or target, is specified in Table 532 .

Table 532. List of supported I3C CCCs, as controller/target

CCC nameCCC valueRead /writeWith/without defining byte
With/without sub-command byte
With/without optional data byte(s)Use as controllerUse as target, raised I3C_EVR eventWhen target: specific action
Broadcast CCCs
ENEC0x00WriteNo defining/sub-command byteWith one data byte (enable target events byte)XX, INTUPDFUpdate and enable I3C_DEVR0: HJEN, CREN, IBIEN if any
DISEC0x01With one data byte (disable target events byte)XX, INTUPDFUpdate and disable I3C_DEVR0: HJEN, CREN, IBIEN if any
ENTASx
x = 0...3
0x02
...
0x05
No data byteXX, ASUPDFUpdate I3C_DEVR0.AS[1:0]
RSTDAA0x06-XX, DAUPDFClear I3C_DEVR0.DAVAL = 0
ENTDAA0x07-XX, DAUPDF if DAVAL = 0Update I3C_DEVR0: DA[6:0] and set DAVAL = 1
DEFTGTS0x08With [1+ 4x (1+ number_of_targets)] x data bytesXX, DEFFUpdate I3C_RDR/ I3C_RDWR. Refer to Figure 678 .
SETMWL0x09With two data byteXX, MWLUPDFUpdate I3C_MAXWLR
SETMRL0x0AWith 2 or 3 data bytesXX, MRLUPDFUpdate I3C_MAXRLR
ENTTM0x0BWith one data byteX--
SETXTIME0x28With sub-command byteWithout or with one or more data bytesX--
SETAASA0x29No defining/sub-command byteNo data byteX--
RSTACT0x2AWith defining byte (0x00, 0x01 or 0x02)XX, RSTF after detected reset patternUpdate I3C_DEVR0: RSTACT[1:0] and set RSTVAL = 1
DEFGRP0x2BNo defining/sub-command byteWith several data bytesXX, GRPFUpdate I3C_RDR/ RDWR. Refer to Figure 679 .
RSTGRP0x2CNo data byteX--

Table 532. List of supported I3C CCCs, as controller/target (continued)

CCC nameCCC valueRead /writeWith/without defining byte
With/without sub-command byte
With/without optional data byte(s)Use as controllerUse as target, raised I3C_EVR eventWhen target: specific action
Direct CCCsAction if ACK
(if I3C target Address = I3C_DEVR0.DA[6:0] and I3C_DEVR0.DAVAL = 1)
(else NACK)
ENEC0x80WriteNo defining/sub-command byteWith one data byte (enable target events byte)XX, INTUPDFUpdate and enable I3C_DEVR0: HJEN, CREN, IBIEN if any
DISEC0x81With one data byte (disable target events byte)XX, INTUPDFUpdate and disable I3C_DEVR0: HJEN, CREN, IBIEN if any
ENTASx
x = 0...3
0x82..
..0x85
No data byteXX, ASUPDFUpdate I3C_DEVR0.AS[1:0]
SETDASA0x87No data byteX--
SETNEWDA0x88With one data byteXX, DAUPDF if DAVAL = 1Update I3C_DEVR0: DA[6:0] (and keep DAVAL = 1)
SETMWL0x89With two data bytesXX, MWLUPDFUpdate I3C_MAXWLR
SETMRL0x8AWith two or three data bytesXX, MRLUPDFUpdate I3C_MAXRLR
GETMWL0x8BReadNo defining/sub-command byteWith two data bytesXX, GETFReturn data bytes from I3C_MAXWLR[15:0].
Refer to Section 49.16.20 .
GETMRL0x8CWith two or three data bytesXX, GETFReturn data bytes from I3C_MAXRLR[15:0] and if I3C_BCR.BCR2 = 1 return third byte from I3C_MAXRLR.IBIP[2:0].
Refer to Section 49.16.19 .

Table 532. List of supported I3C CCCs, as controller/target (continued)

CCC nameCCC valueRead /writeWith/without defining byte
With/without sub-command byte
With/without optional data byte(s)Use as controllerUse as target, raised I3C_EVR eventWhen target: specific action
GETPID0x8DReadNo defining/sub-command byteWith six data bytesXX, GETFReturn data bytes from I3C_EPIDR. Refer to Section 49.16.29 .
GETBCR0x8EWith one data byteXX, GETFReturn data byte from I3C_BCR[7:0]. Refer to Section 49.16.24 .
GETDCR0x8FXX, GETFReturn I3C_DCR[7:0]. Refer to Section 49.16.25 .
GETSTATUS0x90With or without defining byte (TGTSTAT, PRECR)With two data bytes (format 1 or format 2 with PRECR)XX, STAF if format 1
X, GETF if format 2
Return 2 data bytes, as detailed in Section 49.9.9 .
GETACCCR0x91No defining/sub-command byteWith one data byteXX, CRUPDFReturn data byte from I3C_DEVR0.DA[6:0] with parity bit
GETMXDS0x94With or without defining byte (WRRDTURN, CRHDLY)With two data bytes (format 1) or 5 data bytes (format 2 or format 3 with WRRDTURN) or 1 data byte (format 3 with CRHDLY)XX, GETFReturn data byte(s) from I3C_GETMXDSR. Refer to Section 49.16.28 .
GETCAPS0x95With or without defining byte (TGTSTAT, CRCAPS)With 3 data bytes (format 1 or format 2 with TGTSTAT) or two data bytes (format 2 with CRCAPS)XX, GETFReturn 3 GETCAPx data bytes from I3C_GETCAPR (refer to Section 49.16.26 ) or Return 2 CRCAPx data bytes from I3C_CRCAPR (refer to Section 49.16.27 )
D2DXFER0x97WriteWith defining byteWith defining byteX--
SETXTIME0x98With sub-command byteWith sub-command byteX
GETXTIME0x99ReadNo defining/sub-command byteNo defining/sub-command byteX

Table 532. List of supported I3C CCCs, as controller/target (continued)

CCC nameCCC valueRead /writeWith/without defining byte
With/without sub-command byte
With/without optional data byte(s)Use as controllerUse as target, raised I3C_EVR eventWhen target: specific action
RSTACT0x9ARead/WriteWith defining byte (0x00, 0x01, or 0x02)With defining byte (0x00, 0x01, or 0x02)XX, RSTF if detected reset patternRead: return data byte from RSTACT[1:0] in the I3C_DEVR0 register.
Write: update I3C_DEVR0: RSTACT[1:0] and set RSTVAL = 1
SETGRPA0x9BWriteNo defining/sub-command byteNo defining/sub-command byteX--
RSTGRPA0x9CX

49.9.2 I3C broadcast/direct CCC transfer (except ENTDAA, RSTACT), as controller

Figure 673 illustrates I3C broadcast CCC write transfer (except ENTDAA, RSTACT), and direct CCC read/write transfer, as communicated on the I3C bus, and as programmed when acting as controller.

Figure 673. I3C CCC messages, as controller

Diagram showing I3C CCC messages as controller, including broadcast, direct write, and direct read sequences with timing and control signal details.

The diagram illustrates five types of I3C CCC messages initiated by a controller:

LEGEND

MSV69015V4

Diagram showing I3C CCC messages as controller, including broadcast, direct write, and direct read sequences with timing and control signal details.

49.9.3 I3C broadcast ENTDAA CCC transfer, as controller

Figure 674 illustrates I3C broadcast ENTDAA CCC, as communicated on the I3C bus, and as programmed when acting as controller.

Figure 674. I3C broadcast ENTDAA CCC, as controller

Timing diagram for I3C broadcast ENTDAA CCC transfer. The diagram shows the sequence of events on the I3C bus: 1. Previous transfer ends with Stop (Sr), I3C reserved byte (7'h7E) with RnW=0, and ACK. 2. Controller starts a new transfer with Start (S), I3C reserved byte (7'h7E) with RnW=0, and ACK. 3. Controller sends I3C broadcast CCC (ENTDAA=0x07) with T=0. 4. Controller sends Read data: 8 bytes (48-bit unique ID(*), BCR, DCR). 5. Controller sends Assign address to winning target (7 bits) with PAR. 6. Target(s) respond with ACK/NACK. 7. Controller sends Stop (Sr), I3C reserved byte (7'h7E) with RnW=1, NACK, and P. The diagram also includes control register settings: I3C_CR.CCC[7:0]=0x07, I3C_CR.DCNT[15:0]=0, I3C_SR.MID[7:0], DIR=0, XDCNT[15:0]=# of assigned targets, and I3C_EVR.FCF=1. A legend explains the bus states and signal types.

ENTDAA (I3C broadcast CCC write) (when IP is acting as controller)

Sequence of events on the I3C bus:

  1. Previous transfer: Sr, I3C reserved byte (7'h7E) (RnW=0), ACK
  2. Start: S, I3C reserved byte (7'h7E) (RnW=0), ACK
  3. I3C broadcast CCC (ENTDAA=0x07) with T=0
  4. Read data: 8 bytes (48-bit unique ID(*), BCR, DCR)
  5. Assign address to winning target (7 bits) with PAR
  6. ACK/NACK from target(s)
  7. Stop: Sr, I3C reserved byte (7'h7E) (RnW=1), NACK, P

Control register settings:

LEGEND

(*): 48-bit unique/provisioned ID is subject to arbitration. The target which wins arbitration continues to provide its BCR and DCR.

MSV69013V4

Timing diagram for I3C broadcast ENTDAA CCC transfer. The diagram shows the sequence of events on the I3C bus: 1. Previous transfer ends with Stop (Sr), I3C reserved byte (7'h7E) with RnW=0, and ACK. 2. Controller starts a new transfer with Start (S), I3C reserved byte (7'h7E) with RnW=0, and ACK. 3. Controller sends I3C broadcast CCC (ENTDAA=0x07) with T=0. 4. Controller sends Read data: 8 bytes (48-bit unique ID(*), BCR, DCR). 5. Controller sends Assign address to winning target (7 bits) with PAR. 6. Target(s) respond with ACK/NACK. 7. Controller sends Stop (Sr), I3C reserved byte (7'h7E) with RnW=1, NACK, and P. The diagram also includes control register settings: I3C_CR.CCC[7:0]=0x07, I3C_CR.DCNT[15:0]=0, I3C_SR.MID[7:0], DIR=0, XDCNT[15:0]=# of assigned targets, and I3C_EVR.FCF=1. A legend explains the bus states and signal types.

49.9.4 I3C broadcast/direct RSTACT CCC transfer, as controller

Figure 675 illustrates I3C broadcast (write), direct write and read RSTACT CCC, as communicated on the I3C bus, and as programmed when acting as controller.

Figure 675. I3C broadcast, direct read and direct write RSTART CCC, as controller

Timing diagrams for I3C RSTART conditions: broadcast write, direct write (first and second parts), and direct read (first and second parts).

The figure illustrates five timing diagrams for I3C RSTART conditions when the device is a controller. Each diagram shows the sequence of events on the SDA line, including previous transfers, start conditions, reserved bytes, ACKs, target addresses, defining bytes, and data bytes.

LEGEND

MSV69017V5

Timing diagrams for I3C RSTART conditions: broadcast write, direct write (first and second parts), and direct read (first and second parts).

49.9.5 I3C broadcast/direct CCC transfer
(except ENTDA, DEFTGTS, DEFGRPA), as target

Figure 676 illustrates I3C broadcast CCC write transfer (except ENTDA, DEFTGTS, DEFGRPA), direct CCC read/write transfer, as communicated on the I3C bus, and as programmed when acting as target.

Figure 676. I3C CCC messages, as target

Diagram showing I3C CCC messages as target, including broadcast, direct write, and direct read sequences with timing and control signal details.

I3C broadcast CCC write (except ENTDAA, DEFTGTS, DEFGRPA) (when IP acts as target)

The sequence starts with an optional Previous transfer (Sr, I3C reserved byte (7h7E) (RnW=0), ACK). The controller drives the SDA line low (S) to send the I3C reserved byte (7h7E) (RnW=0). The target drives the SDA line low (ACK). The controller then drives the I3C broadcast CCC (0x00 to 0x7F, not 0x07, not 0x2A) followed by optional write Data-1 to Data-N. Transition bits (T) are inserted. The sequence ends with Sr or P. The I3C_RMR.RCODE[7:0] register is updated with the CCC defining byte/sub-command byte/data byte(s). The I3C_SR (DIR=0, XDCNT[15:0]=number of CCC data bytes) register is updated. One flag of I3C_EVR.xxUPDF/RSTF=1 with xx= INT/AS/DA/MWL/MRL is set.

I3C direct CCC write (when IP acts as target)

The sequence starts with an optional Previous transfer (Sr, I3C reserved byte (7h7E) (RnW=0), ACK). The controller drives the SDA line low (S) to send the I3C reserved byte (7h7E) (RnW=0). The target drives the SDA line low (ACK). The controller then drives the I3C direct CCC (0x80 to 0xFE, not 0x9A) followed by optional write Data-1 to Data-N. Transition bits (T) are inserted. After a repeated start (Sr), if the I3C target address matches I3C_DEVR0.DA[6:0] and I3C_DEVR0.DAVAL=1, the target acknowledges (ACK) and receives Write Data-1 to Data-N. The sequence ends with Sr(*) or P. The I3C_RMR.RCODE[7:0] register is updated. The I3C_SR (DIR=0, XDCNT[15:0]) register is updated. One flag of I3C_EVR.xxUPDF/RSTF=1 with xx= INT/AS/DA/MWL/MRL is set. A specific associated action to the CCC, if any, is performed.

I3C direct CCC read (when IP acts as target)

The sequence starts with an optional Previous transfer (Sr, I3C reserved byte (7h7E) (RnW=0), ACK). The controller drives the SDA line low (S) to send the I3C reserved byte (7h7E) (RnW=0). The target drives the SDA line low (ACK). The controller then drives the I3C direct CCC (0x80 to 0xFE, not 0x9A) followed by optional write Data-1 to Data-N. After a repeated start (Sr), if the I3C target address matches I3C_DEVR0.DA[6:0] and I3C_DEVR0.DAVAL=1, and if I3C_TGTTDR.PRELOAD=1, the target acknowledges (ACK) and sends Read Data-1 to Data-N. The sequence ends with Sr(*) or P. The I3C_RMR.RCODE[7:0] register is updated. The I3C_SR (DIR=1, XDCNT[15:0]) register is updated. One flag of I3C_EVR.GETF/STAF/CRUPDF/RSTF=1 is set. Returned data are provided from a register depending upon the direct CCC read.

LEGEND

MSV69016V6

Diagram showing I3C CCC messages as target, including broadcast, direct write, and direct read sequences with timing and control signal details.

49.9.6 I3C broadcast ENTDAA CCC transfer, as target

Figure 677 illustrates I3C broadcast ENTDAA CCC, as communicated on the I3C bus, and as programmed when acting as target.

Figure 677. I3C broadcast ENTDAA CCC, as target

Timing diagram for I3C broadcast ENTDAA CCC transfer as target. The diagram shows the sequence of events on the I3C bus, including start conditions, reserved bytes, data transfer, and acknowledgments. It includes a legend for signal types and ACK/NACK conditions.

Sequence of Events:

LEGEND:

MSV69014V4

Timing diagram for I3C broadcast ENTDAA CCC transfer as target. The diagram shows the sequence of events on the I3C bus, including start conditions, reserved bytes, data transfer, and acknowledgments. It includes a legend for signal types and ACK/NACK conditions.

49.9.7 I3C broadcast DEFTGTS CCC transfer, as target

Figure 678 illustrates I3C broadcast DEFTGTS CCC, as communicated on the I3C bus, and as programmed when acting as target.

Figure 678. I3C broadcast DEFTGTS CCC, as target

Timing diagram for I3C broadcast DEFTGTS CCC transfer. The diagram shows the sequence of events on the I3C bus between an Active Controller and multiple Target or Group units. The sequence starts with a Previous transfer (Sr, I3C Reserved Byte, ACK) followed by the I3C Broadcast CCC (DEFTGTS=0x08). The controller then drives the bus with T=0, Count[7:0], T, {DynAddr[7:1], 1'b0}, T, DCR[7:0], T, BCR[7:0], T, StaticAddr[7'h7E], and T. Each target/group responds with its own DynAddr, DCR, BCR, and StaticAddr, followed by a transition to Sr or P state. The controller monitors the bus and generates I3C_RMR.RCODE[7:0] and I3C_RDR/RDWR signals. The targets generate I3C_SR (DIR=0, XDCNT[15:0]=1+ 4x Count) and I3C_EVR.DEFF=1 signals. The diagram is repeated for each target/group (i.e. for n=1 to (Count-1)). A legend at the bottom explains the bus states: Controller (target) drives SDA low/high Z in open-drain (arbitrable header), Controller drives SDA in open-drain, Controller drives SDA in push-pull, ACK (Acknowledge from the addressed target(s)), and T (Transition bit (parity bit for CCC) from controller).

DEFTGTS (I3C broadcast CCC write) (when IP is acting as target)

The diagram illustrates the I3C broadcast DEFTGTS CCC transfer sequence. It begins with a Previous transfer consisting of a Start (Sr), an I3C Reserved Byte (7'h7E) (RnW=0) , and an ACK . The Active Controller then initiates the I3C Broadcast CCC (DEFTGTS=0x08) . The bus sequence follows: T=0 , Count[7:0] , T , {DynAddr[7:1], 1'b0} , T , DCR[7:0] , T , BCR[7:0] , T , StaticAddr[7'h7E] , and T . Each Target or Group responds with its own {DynAddr[7:1], 1'b0} , DCR[7:0] , BCR[7:0] , {StaticAddr[7:1], 1'b0} , and T . The targets then transition to Sr or P state, generating I3C_SR (DIR=0, XDCNT[15:0]=1+ 4x Count) and I3C_EVR.DEFF=1 signals. The controller generates I3C_RMR.RCODE[7:0] and I3C_RDR/RDWR signals. The sequence is Repeated for each target/group (i.e. for n=1 to (Count-1)) .

LEGEND

MSV69012V3

Timing diagram for I3C broadcast DEFTGTS CCC transfer. The diagram shows the sequence of events on the I3C bus between an Active Controller and multiple Target or Group units. The sequence starts with a Previous transfer (Sr, I3C Reserved Byte, ACK) followed by the I3C Broadcast CCC (DEFTGTS=0x08). The controller then drives the bus with T=0, Count[7:0], T, {DynAddr[7:1], 1'b0}, T, DCR[7:0], T, BCR[7:0], T, StaticAddr[7'h7E], and T. Each target/group responds with its own DynAddr, DCR, BCR, and StaticAddr, followed by a transition to Sr or P state. The controller monitors the bus and generates I3C_RMR.RCODE[7:0] and I3C_RDR/RDWR signals. The targets generate I3C_SR (DIR=0, XDCNT[15:0]=1+ 4x Count) and I3C_EVR.DEFF=1 signals. The diagram is repeated for each target/group (i.e. for n=1 to (Count-1)). A legend at the bottom explains the bus states: Controller (target) drives SDA low/high Z in open-drain (arbitrable header), Controller drives SDA in open-drain, Controller drives SDA in push-pull, ACK (Acknowledge from the addressed target(s)), and T (Transition bit (parity bit for CCC) from controller).

49.9.8 I3C broadcast DEFGRPA CCC transfer, as target

Figure 679 illustrates I3C broadcast DEFGRPA CCC, as communicated on the I3C bus, and as programmed when acting as target.

Figure 679. I3C broadcast DEFGRPA CCC, as target

Timing diagram for I3C broadcast DEFGRPA CCC transfer as target. The diagram shows a sequence of events on the I3C bus. It starts with a 'Previous transfer' followed by a Start (Sr), an I3C Reserved Byte (7'h7E) (RnW=0), and an ACK. The main part is the 'I3C Broadcast CCC (DEFGRPA=0x2B)' which includes a Transition bit (T=0), Group Addr. (1'b0), a Transition bit (T), Group Descriptor, a Transition bit (T), Count, a Transition bit (T), Dyn Addr#1 (1'b0), and a Transition bit (T). This is followed by DynAddr#n (1'b0), a Transition bit (T), and a Stop or Repeat (Sr or P). Control signals shown include I3C_RMR.RCODE[7:0], I3C_RDR/RDWR, I3C_SR (DIR=0,XDCNT[15:0]), and I3C_EVR.GRPF=1. A legend at the bottom explains the SDA signal states: Controller (& target) drive(s) SDA low/high Z in open-drain (arbitrable header), Controller drives SDA in open-drain, Controller drives SDA in push-pull, and Acknowledge from the addressed target(s).

DEFGRPA (I3C broadcast CCC write) (when IP is acting as target)

The diagram illustrates the I3C bus sequence for a broadcast CCC transfer. It begins with a 'Previous transfer' followed by a Start (Sr), an I3C Reserved Byte (7'h7E) (RnW=0), and an ACK. The main part is the 'I3C Broadcast CCC (DEFGRPA=0x2B)' which includes a Transition bit (T=0), Group Addr. (1'b0), a Transition bit (T), Group Descriptor, a Transition bit (T), Count, a Transition bit (T), Dyn Addr#1 (1'b0), and a Transition bit (T). This is followed by DynAddr#n (1'b0), a Transition bit (T), and a Stop or Repeat (Sr or P). Control signals shown include I3C_RMR.RCODE[7:0], I3C_RDR/RDWR, I3C_SR (DIR=0,XDCNT[15:0]), and I3C_EVR.GRPF=1.

LEGEND

MSV69010V3

Timing diagram for I3C broadcast DEFGRPA CCC transfer as target. The diagram shows a sequence of events on the I3C bus. It starts with a 'Previous transfer' followed by a Start (Sr), an I3C Reserved Byte (7'h7E) (RnW=0), and an ACK. The main part is the 'I3C Broadcast CCC (DEFGRPA=0x2B)' which includes a Transition bit (T=0), Group Addr. (1'b0), a Transition bit (T), Group Descriptor, a Transition bit (T), Count, a Transition bit (T), Dyn Addr#1 (1'b0), and a Transition bit (T). This is followed by DynAddr#n (1'b0), a Transition bit (T), and a Stop or Repeat (Sr or P). Control signals shown include I3C_RMR.RCODE[7:0], I3C_RDR/RDWR, I3C_SR (DIR=0,XDCNT[15:0]), and I3C_EVR.GRPF=1. A legend at the bottom explains the SDA signal states: Controller (& target) drive(s) SDA low/high Z in open-drain (arbitrable header), Controller drives SDA in open-drain, Controller drives SDA in push-pull, and Acknowledge from the addressed target(s).

49.9.9 I3C direct GETSTATUS CCC response, as target

When the I3C acts as target, the hardware returns two data bytes on reception of GETSTATUS CCC, with format 1 (without defining byte or with defining byte TGTSTAT = 0x00), or format 2 (with defining byte PRECR = 0x91).

The returned 2-byte STATUS[15:0] with format 1 on the I3C bus is then as follows:

The returned 2-byte STATUS[15:0] with format 2 on the I3C bus is then as follows:

Completion of a GETSTATUS CCC of format 1 is reported by STAF = 1 in the I3C_EVR register, and the corresponding interrupt if enabled (if STAIE = 1 in the I3C_IER register).

Completion of a GETSTATUS CCC of format 2 is reported by GETF = 1 in the I3C_EVR register, and the corresponding interrupt if enabled (if GETIE = 1 in the I3C_IER register).

49.9.10 I3C private read/write transfer, as controller

Figure 680 illustrates private read/write transfer, as communicated on the I3C bus, and as programmed when acting as controller.

Figure 680. I3C private read/write messages, as controller

Timing diagram for I3C private read/write transfer as controller. It shows two main sections: I3C private write and I3C private read. Each section details the sequence of messages (Start, reserved byte, ACK, Stop, target address, ACK) and the data transfer (Write Data-1 to N or Read Data-1 to N) with associated control signals like I3C_CR_MTYPE, I3C_CR_ADD, I3C_CR_RNW, I3C_CR_DCNT, I3C_CR_MEND, I3C_TDR/TDWR, I3C_RDR/RDWR, and I3C_SR. A legend at the bottom explains the SDA drive modes and ACK types.

I3C private write (when IP acts as controller)

Control signal: I3C_CR_MTYPE[3:0]=0010

Sequence 1 (if I3C_CFGR.NOARBH=0 ): S → I3C reserved byte (0x7E) (RnW=0) → ACK → Sr → I3C target address (RnW=0) → ACK

Sequence 2 (if I3C_CFGR.NOARBH=1 ): S → I3C target address (RnW=0) → ACK

Previous private or I 2 C transfer → Sr → I3C target address (RnW=0) → ACK

Control signals: I3C_CR_ADD[6:0] , I3C_CR_RNW=0

Data transfer: Write Data-1 → T → ... → Write Data-N → T → Sr or P

Control signals: I3C_CR_DCNT[15:0]=N , I3C_CR_MEND , I3C_TDR/TDWR

Status register: I3C_SR (MID[7:0], DIR, XDCNT[15:0])

I3C private read (when IP is acts as controller)

Control signal: I3C_CR_MTYPE[3:0]=0010

Sequence 1 (if I3C_CFGR.NOARBH=0 ): S → I3C reserved byte (0x7E) (RnW=1) → ACK → Sr → I3C target address (RnW=1) → ACK

Sequence 2 (if I3C_CFGR.NOARBH=1 ): S → I3C target address (RnW=1) → ACK

Previous private or I 2 C transfer → Sr → I3C target address (RnW=1) → ACK

Control signals: I3C_CR_ADD[6:0] , I3C_CR_RNW=1

Data transfer: Read Data-1 → T → ... → Read Data-N → T → Sr or P

Control signals: I3C_CR_DCNT[15:0]=N , I3C_CR_MEND , I3C_RDR/RDWR

Status register: I3C_SR (MID[7:0], DIR, ABT, XDCNT[15:0])

LEGEND

MSv69021V6

Timing diagram for I3C private read/write transfer as controller. It shows two main sections: I3C private write and I3C private read. Each section details the sequence of messages (Start, reserved byte, ACK, Stop, target address, ACK) and the data transfer (Write Data-1 to N or Read Data-1 to N) with associated control signals like I3C_CR_MTYPE, I3C_CR_ADD, I3C_CR_RNW, I3C_CR_DCNT, I3C_CR_MEND, I3C_TDR/TDWR, I3C_RDR/RDWR, and I3C_SR. A legend at the bottom explains the SDA drive modes and ACK types.

49.9.11 I3C private read/write transfer, as target

Figure 681 illustrates I3C private read/write transfer, as communicated on the I3C bus, and as programmed when acting as target.

Figure 681. I3C private read/write messages, as target

Timing diagrams for I3C private read and write transfers as target, including a legend for signal states and acknowledge types.

I3C private write (when IP is acting as target)

The diagram shows a sequence of messages on the I3C bus. It starts with a Start (S) followed by an I3C Reserved Byte (7'h7E) with RnW=0, then an Acknowledge (ACK), a Stop (Sr), and an I3C Target Address with RnW=0. This is followed by a series of write data blocks (Write Data-1 to Write Data-N), each ending with a Transition bit (T). The sequence concludes with a Stop (Sr) or a repeated Start (P). Below the bus signals, there are control signal indicators: I3C_RDR/RDWR, I3C_SR (DIR=0, XDCNT[15:0]), and I3C_EVR.FCF=1. A condition for the transfer is given as: If I3C Target Address = I3C_DEVVR0.DA[6:0] and I3C_DEVVR0.DAVAL=1.

I3C private read (when IP is acting as target)

The diagram shows a sequence of messages on the I3C bus. It starts with a Start (S) followed by an I3C Reserved Byte (7'h7E) with RnW=1, then an Acknowledge (ACK), a Stop (Sr), and an I3C Target Address with RnW=1. This is followed by a series of read data blocks (Read Data-1 to Read Data-N), each ending with a Transition bit (T). The sequence concludes with a Stop (Sr) or a repeated Start (P). Below the bus signals, there are control signal indicators: I3C_TDR/TDWR, I3C_SR (DIR=1, XDCNT[15:0]), and I3C_EVR.FCF=1. Conditions for the transfer are given as: If I3C Target Address = I3C_DEVVR0.DA[6:0] and I3C_DEVVR0.DAVAL=1, and I3C_TGTDDR.PRELOAD=1 and I3C_TGTDDR.TGTDDCNT[15:0]=N.

LEGEND

(*): Target is not able to acknowledge an addressed private read/write if it is emitted without arbitrable header (i.e. after a start) and if it occurs at the same SCL clock cycle as an IBI request from this target. In order to avoid such an address-based arbitration collision, the controller should emit a private read/write with arbitrable header when the IBI request is enabled.

Timing diagrams for I3C private read and write transfers as target, including a legend for signal states and acknowledge types.

MSV69022V4

49.9.12 Legacy I 2 C read/write transfer, as controller

Figure 682 illustrates legacy I 2 C read/write transfer, as communicated on the I3C bus, and as programmed when acting as controller.

Figure 682. Legacy I 2 C read/write messages, as controller

Diagram showing legacy I2C read/write transfer sequences as a controller on an I3C bus. It includes write and read sequences with start/stop conditions, addresses, data blocks, and acknowledgments, along with a legend for signal states.

Legacy I 2 C write (when IP is acting as controller) I3C_CR.MTYPE[3:0]=0100

Sequence 1 (if I3C_CFGR.NOARBH=0):
S (Controller) → I3C Reserved Byte (7'h7E) (RnW=0) (Target) → ACK (Controller) → Sr (Controller) → Legacy I 2 C Target Address (RnW=0) (Controller) → ACK (Target)
Control: I3C_CR.ADD[6:0], I3C_CR.RNW=0

Sequence 2 (if I3C_CFGR.NOARBH=1):
S (Controller) → Legacy I 2 C Target Address (RnW=0) (Controller) → ACK (Target)
Control: I3C_CR.ADD[6:0], I3C_CR.RNW=0

Data transfer:
Write Data-1 → ACK/NACK (Target) ... Write Data-N → ACK/NACK (Target) → Sr or P (Controller)
Control: I3C_TDR/TDWR, I3C_CR.DCNT[15:0]=N, I3C_CR.MEND
Interrupt: I3C_SR (MID[7:0], DIR=0, XDCNT[15:0])

Legacy I 2 C read (when IP is acting as controller) I3C_CR.MTYPE[3:0]=0100

Sequence 1 (if I3C_CFGR.NOARBH=0):
S (Controller) → I3C Reserved Byte (7'h7E) (RnW=0) (Target) → ACK (Controller) → Sr (Controller) → Legacy I 2 C Target Address (RnW=1) (Controller) → ACK (Target)
Control: I3C_CR.ADD[6:0], I3C_CR.RNW=1

Sequence 2 (if I3C_CFGR.NOARBH=1):
S (Controller) → Legacy I 2 C Target Address (RnW=1) (Controller) → ACK (Target)
Control: I3C_CR.ADD[6:0], I3C_CR.RNW=1

Data transfer:
Read Data-1 (Target) → ACK (Controller) ... Read Data-N (Target) → NACK (Controller) → Sr or P (Controller)
Control: I3C_RDR/RDWR, I3C_CR.DCNT[15:0]=N, I3C_CR.MEND
Interrupt: I3C_SR (MID[7:0], DIR=1, XDCNT[15:0])

LEGEND

MSv69009V4

Diagram showing legacy I2C read/write transfer sequences as a controller on an I3C bus. It includes write and read sequences with start/stop conditions, addresses, data blocks, and acknowledgments, along with a legend for signal states.

49.9.13 I3C IBI transfer, as controller/target

Figure 683 illustrates IBI (in-band interrupt) transfer, as communicated on the I3C bus, and as programmed when acting as target or received as controller.

Figure 683. IBI transfer, as controller/target

Figure 683. IBI transfer, as controller/target. This diagram illustrates the IBI transfer process on an I3C bus, divided into two main sections: 'I3C in-band interrupt (when IP acts as target)' and 'I3C in-band interrupt from target (when IP acts as controller)'. The target section shows the flow from an interrupt request to the bus, through start request, CAS, and data bytes (Mandatory Data Byte, Optional Payload Data Bytes 1-3) to an ACK or NACK. The controller section shows the flow from a target address to the bus, through start request, CAS, and data bytes to an ACK or NACK. A legend at the bottom explains the symbols used for SDA and SCL driving modes.

I3C in-band interrupt (when IP acts as target)

The target initiates an IBI when I3C_CR.MTYPE[3:0]=1010 . The process starts with a 'Start request' (S) when the bus is available ( \( t > t_{bus} = 1\mu s \) ). The elapsed time for the start request is \( t_s, t_{bus} = 1\mu s/100\mu s/2ms/50ms \) . The target then provides the 'I3C (own) target address (RnW=1)' (CAS). The data transfer consists of a 'Mandatory Data Byte' followed by up to three 'Optional Payload Data Bytes' (Byte-1, Byte-2, Byte-3). The target drives SDA in open-drain (S) and SCL in push-pull. The transfer ends with an 'ACK' or 'NACK' (Sr or P (**)).

I3C in-band interrupt from target (when IP acts as controller)

The controller receives an IBI from a target. The process starts with a 'Start request' (S) when the bus is available ( \( t > t_{bus} = 1\mu s \) ). The elapsed time for the start request is \( t_s, t_{bus} = 1\mu s/100\mu s/2ms/50ms \) . The controller then provides the 'I3C target I address (RnW=1)' (CAS). The data transfer consists of a 'Mandatory Data Byte' followed by up to three 'Optional Payload Data Bytes' (Byte-1, Byte-2, Byte-3). The controller drives SDA in push-pull and SCL in open-drain. The transfer ends with an 'ACK' or 'NACK' (Sr or P (**)).

LEGEND

(*): Target is not able to acknowledge an addressed private read/write if it is emitted without arbitrable header (i.e. after a start), and if it occurs at the same SCL clock cycle as an IBI request from this target. To avoid such an address-based arbitration collision, the controller should emit a private read/write with arbitrable header when the IBI request is enabled.

(**): Repeated start (Sr) if there is a pending transfer to execute and if I3C_DEVIRL.SUSP = 0 , else stop (P) in push-pull

Figure 683. IBI transfer, as controller/target. This diagram illustrates the IBI transfer process on an I3C bus, divided into two main sections: 'I3C in-band interrupt (when IP acts as target)' and 'I3C in-band interrupt from target (when IP acts as controller)'. The target section shows the flow from an interrupt request to the bus, through start request, CAS, and data bytes (Mandatory Data Byte, Optional Payload Data Bytes 1-3) to an ACK or NACK. The controller section shows the flow from a target address to the bus, through start request, CAS, and data bytes to an ACK or NACK. A legend at the bottom explains the symbols used for SDA and SCL driving modes.

MSv69020V4

When the I3C peripheral acts as controller, the I3C_IBIDR register is used to receive the IBI data payload. Consequently, the IBI request from the target must not exceed a 4-byte data payload. If there is more information to be exchanged in the context of this in-band interrupt, the controller software must issue a private read.

49.9.14 I3C hot-join request transfer, as controller/target

Figure 684 illustrates hot-join request transfer, as communicated on the I3C bus, and as programmed when acting as target or received as controller.

Figure 684. Hot-join request transfer, as controller/target

Timing diagram for I3C hot-join request transfer. The diagram is split into two horizontal sections. The top section shows the 'I3C hot-join request (when IP is acting as target)' sequence. The bottom section shows the 'I3C hot-join request from target i (when IP is acting as controller)' sequence. A legend at the bottom defines the bus states and symbols.

I3C hot-join request (when IP is acting as target)

I3C_CR.MTYPE[3:0]=1000

While no (DISEC CCC with DISHJ=1)
[i.e. while I3C_DEVR0.HJEN=1]

If I3C_DEVR0.HJEN=1

Bus idle condition
( \( t > t_{IDLE} = 200 \mu s \) )

Start
request

Elapsed time
(managed by controller)
( \( t_{<} t_{CASmax} = 1 \mu s/100 \mu s/2 ms/50 ms \) )

CAS

Bus free condition (managed by controller)
( \( t > t_{CASmin/BUFmin} = 38.4 ns/1.3 \mu s \) for pure/mixed bus
and
\( t < t_{CASmax} = 1 \mu s/100 \mu s/2 ms/50 ms \) )

S

Reserved Address
(0x02) (RnW=0)

I3C_EVR.INTUPDF=1

I3C_DEVR0.HJEN=0

If DISEC CCC with DISHJ=1 completed

NACK

Sr or P (**)

ACK

Sr or P (**)

After ENTDAA
CCC completed

I3C_DEVR0.DA[6:0] updated and I3C_DEVR0.DAVAL=1

I3C_EVR.DAUPF=1

I3C hot-join request from target i
(when IP is acting as controller)

Bus idle condition
(managed by target)
( \( t > t_{IDLE} = 200 \mu s \) )

Start
request

Elapsed time
( \( t_{<} t_{CASmax} = 1 \mu s/100 \mu s/2 ms/50 ms \) )

CAS

Bus free condition
( \( t > t_{CASmin/BUFmin} = 38.4 ns/1.3 \mu s \) for pure/mixed bus
and
\( t < t_{CASmax} = 1 \mu s/100 \mu s/2 ms/50 ms \) )

S

Reserved Address
(0x02) (RnW=0)

If I3C_CFGR.HJACK=0

NACK

Sr or P (**)

If I3C_CFGR.HJACK=1

ACK

Sr or P (**)

I3C_EVR.HJF=1

LEGEND

(**): Repeated start (Sr) if there is a pending transfer to execute, else stop (P)

MSv69019V2

Timing diagram for I3C hot-join request transfer. The diagram is split into two horizontal sections. The top section shows the 'I3C hot-join request (when IP is acting as target)' sequence. The bottom section shows the 'I3C hot-join request from target i (when IP is acting as controller)' sequence. A legend at the bottom defines the bus states and symbols.

49.9.15 I3C controller-role request transfer, as controller/target

Figure 685 illustrates controller-role request transfer, as communicated on the I3C bus, and as programmed when acting as target or received as controller.

Figure 685. Controller-role request transfer, as controller/target

Figure 685. Controller-role request transfer, as controller/target. This diagram shows two flowcharts for I3C controller-role request transfers. The top flowchart is for when the IP is acting as a target, and the bottom flowchart is for when the IP is acting as a controller. Both flowcharts detail the sequence of events from bus availability to the final status register updates. A legend at the bottom defines the symbols used for SDA driving and SCL clocking.

I3C controller-role request (when IP is acting as target)

Condition: I3C_CR.MTYPE[3:0]=1001

Flow:

I3C controller-role request from target i (when IP is acting as controller)

Flow:

LEGEND

Figure 685. Controller-role request transfer, as controller/target. This diagram shows two flowcharts for I3C controller-role request transfers. The top flowchart is for when the IP is acting as a target, and the bottom flowchart is for when the IP is acting as a controller. Both flowcharts detail the sequence of events from bus availability to the final status register updates. A legend at the bottom defines the symbols used for SDA driving and SCL clocking.

MSV69018V2

49.10 I3C FIFOs management, as controller

49.10.1 C-FIFO management, as controller

When controller, as illustrated in figures of Section 49.9 , C-FIFO can be used during any of the following transfers:

Figure 686 illustrates the management of the C-FIFO for queuing control word(s) on the I3C bus, when the I3C peripheral acts as controller.

Figure 686. C-FIFO management, as controller

Flowchart illustrating C-FIFO management as a controller. The process starts with I3C state = DISABLED, followed by Initialization (enabling DMA mode and interrupt/polling mode). Then, I3C is enabled. The process enters I3C state = IDLE, where a frame transfer can be initiated by software (writing a control word) or by a trigger (SW or HW). The process then enters I3C state = ACTIVE, where it checks if I3C_EVR.CNFNF = 1. If yes, a control word is pushed into the C-FIFO. If no, it checks if there is a transfer error. If no error, it checks if the message is the last of the frame. If yes, FCF is set to 1 and the frame is completed. If no, it loops back to the control word push. If an error occurs, ERRF is set to 1. Finally, the process ends.
graph TD
    Start([I3C state = DISABLED]) --> Init["Initialization
Enable/disable DMA mode for C-FIFO: I3C_CFGR.CDMAEN
Configure interrupt/polling mode for any event: I3C_IER"] Init --> Enable["Enable I3C: write and set I3C_CFGR.EN = 1"] Enable --> Idle["I3C state = IDLE"] Idle --> InitTransfer["Initiate a frame transfer, by software:
iii) No triggering: write a (first) control word (I3C_CR) into C-FIFO"] Idle --> InitTriggered["Initiate a triggered frame transfer, by:
i) SW-triggered: write and set I3C_CFGR.TSFSET = 1
ii) HW-triggered1: on a detected HW trigger hit"] InitTransfer --> Active["I3C state = ACTIVE"] InitTriggered --> CNFNF{"I3C_EVR.CNFNF = 1 ?"} CNFNF -- N --> CNFNF CNFNF -- Y --> Push["Push-on a control word into C-FIFO (write a I3C_CR). Either:
i) directly by software (via polling or interrupt)
ii) automatically by hardware in DMA mode"] Push --> NoError{"No transfer error ?"} NoError -- N --> Update["Update (or not):
DMA mode for C-FIFO:
I3C_CFGR.CDMAEN"] Update --> Idle NoError -- Y --> Last{"Is transferred message
the last of the frame ?"} Last -- N --> Push Last -- Y --> FCF["Setting FCF = 1
Frame completed"] FCF --> End([End]) NoError -- Y --> Error{"Transfer error ?"} Error -- Y --> ERRF["Setting ERRF = 1
Transfer error"] ERRF --> Update
Flowchart illustrating C-FIFO management as a controller. The process starts with I3C state = DISABLED, followed by Initialization (enabling DMA mode and interrupt/polling mode). Then, I3C is enabled. The process enters I3C state = IDLE, where a frame transfer can be initiated by software (writing a control word) or by a trigger (SW or HW). The process then enters I3C state = ACTIVE, where it checks if I3C_EVR.CNFNF = 1. If yes, a control word is pushed into the C-FIFO. If no, it checks if there is a transfer error. If no error, it checks if the message is the last of the frame. If yes, FCF is set to 1 and the frame is completed. If no, it loops back to the control word push. If an error occurs, ERRF is set to 1. Finally, the process ends.

MSV69033V3

1. This feature is implementation-dependent and can be unavailable. Refer to Section 49.3.5 .

Note: The software can disable the generation of FCF flag by writing 1 into the FCFDIS bit of the I3C_CFGR register. This can be used with hardware triggers and autonomous DMA (if this feature is available, see Section 49.3 ) to stream a series of frames.

First, the software must initialize the C-FIFO management via CDMAEN in the I3C_CFGR register, to be written either:

In any case, if C-FIFO is empty and a restart must be emitted with a new control word, a C-FIFO underrun is reported (ERRF = 1 in the I3C_EVR register and COVR = 1 in the I3C_SER register). If enabled by ERRIE = 1 in the I3C_IER register, an interrupt is generated.

The DMA mode for the C-FIFO management can be modified when the I3C peripheral is not in active state.

When controller, if a transfer error occurs (ERRF = 1 in the I3C_EVR register), the C-FIFO is flushed automatically by the hardware.

49.10.2 TX-FIFO management, as controller

When controller, as shown in figures of Section 49.9 , TX-FIFO can be used during any of the following transfers:

Figure 687 illustrates the management of the TX-FIFO for queuing data bytes or word(s) to be transmitted on the I3C bus, when the I3C peripheral acts as controller.

Figure 687. TX-FIFO management, as controller

Flowchart illustrating TX-FIFO management as a controller. The process starts with I3C state = DISABLED, followed by Initialization (configuring TXDMAEN, TXTHRES, TMODE, and IER). Then, I3C is enabled. The state becomes I3C state = IDLE. A frame transfer is initiated (SW-triggered, HW-triggered, or no triggering). The state becomes I3C state = ACTIVE. A loop exists for pushing data into the TX-FIFO until TXFNFF=1. After data is pushed, the flow checks for transfer errors or frame completion. If an error occurs, ERRF is set. If the frame is completed, FCF is set. The process ends. A side note indicates that TX-FIFO configuration can be updated via I3C_CFGR.
graph TD
    subgraph DISABLED [I3C state = DISABLED]
        Init[Initialization:
Enable/disable DMA mode for TX-FIFO: I3C_CFGR.TXDMAEN
Configure TX-FIFO byte/word threshold: I3C_CFGR.TXTHRES
Enable/disable TX-FIFO and C-FIFO preload: I3C_CFGR.TMODE
Configure interrupt/polling mode for any event: I3C_IER] Enable[Enable I3C: write and set I3C_CFGR.EN=1] Init --> Enable end Enable --> IDLE [I3C state = IDLE] subgraph IDLE [I3C state = IDLE] InitFrame[Initiate a frame transfer, by any following method:
i) SW-triggered: write and set I3C_CFGR.TSFSET=1
ii) HW-triggered: on a detected HW trigger bit
iii) No triggering, write (first) I3C_CR: write first I3C_CR control word by software] end InitFrame --> ACTIVE [I3C state = ACTIVE] subgraph ACTIVE [I3C state = ACTIVE] Poll[Is TXFNFF=1?] Push[Push-on a data byte/word into TX-FIFO:
write a I3C_TDR/TDWR depending on TXTHRES. Either:
i) directly by software (via polling or interrupt)
ii) automatically by hardware in DMA mode] Error{Transfer error?} End{Is transferred message the last of the frame?} Poll -- N --> End Poll -- Y --> Push Push --> Poll Push --> End End -- N --> Poll End -- Y --> Done[Setting FCF = 1
Frame completed] Done --> EndFlow[End] Error -- Y --> Err[Setting ERRF = 1
Transfer error] Err --> EndFlow end Update[Update (or not) configuration of TX-FIFO via I3C_CFGR:
TXDMAEN, TXTHRES, TMODE] --> IDLE
Flowchart illustrating TX-FIFO management as a controller. The process starts with I3C state = DISABLED, followed by Initialization (configuring TXDMAEN, TXTHRES, TMODE, and IER). Then, I3C is enabled. The state becomes I3C state = IDLE. A frame transfer is initiated (SW-triggered, HW-triggered, or no triggering). The state becomes I3C state = ACTIVE. A loop exists for pushing data into the TX-FIFO until TXFNFF=1. After data is pushed, the flow checks for transfer errors or frame completion. If an error occurs, ERRF is set. If the frame is completed, FCF is set. The process ends. A side note indicates that TX-FIFO configuration can be updated via I3C_CFGR.

MSV69037V2

First, the software must initialize the TX-FIFO management via the following fields in the I3C_CFGR register:

Then, depending upon bit TXDMAEN in the I3C_CFGR register, the TX-FIFO is written either:

An I3C message begins from a start or a repeated start, and ends with a stop or a repeated start. At message level, the last data byte/word to be transmitted is flagged by TXLASTF = 1 in the I3C_EVR register. When an I3C frame is described with multiple messages (separated by a repeated start), this event can be used by the software to update the pointer to the buffer where the byte(s)/word(s) of the next message is/are stored.

When frame completion is reported (FCF = 1 in the I3C_EVR register, and the corresponding interrupt is enabled), the TX-FIFO is empty.

If the TX-FIFO is empty and a data byte must be transmitted on the I3C bus, a TX-FIFO underrun is reported (ERRF = 1 in the I3C_EVR register and DOVR = 1 in the I3C_SER register). If enabled by ERRRIE = 1 in the I3C_IER register, an interrupt is generated.

The configuration for the TX-FIFO management can be modified when the I3C peripheral is not in active state.

When controller, if a transfer error occurs (ERRF = 1), the TX-FIFO is automatically flushed by the hardware.

No C-FIFO/TX-FIFO preload

As defined in Table 523 , C-FIFO size is two words, TX-FIFO size is 8 bytes.

When no C-FIFO/TX-FIFO preload is configured (TMODE = 0 in the I3C_CFGR register), the I3C peripheral emits a start on the I3C bus as soon as the first control word is written into the C-FIFO. Then, it decodes the I3C_CR register, and requires a next data byte/word to be written, if needed within this message. As soon as a next control word is detected as required by the hardware to be transmitted on the I3C bus (if a repeated start must be emitted on the I3C bus or if the C-FIFO gets available room), this control word is requested to be written into the C-FIFO until the last message (MEND = 1 in the I3C_CR register).

Similarly, as soon as another data byte/word is detected as required by the hardware to be transmitted on the I3C bus (if a repeated start must be emitted on the I3C bus, and if TX-FIFO is not full, and if data byte(s)/word(s) must be transmitted during this I3C message), this data byte/word must be written in the TX-FIFO.

C-FIFO and TX-FIFO preload

When C-FIFO/TX-FIFO preload is configured (TMODE = 1 in the I3C_CFGR register), before emitting a start on the bus, the I3C peripheral waits for loading as much as possible both the C-FIFO and the TX-FIFO, as follows:

  1. 1. Wait for a first control word to be written into the C-FIFO.
  2. 2. Wait for data byte(s)/word(s) to be written in the TX-FIFO, if any, as defined by the first control word (if RNW = 0 and DCNT[15:0] = 0 in the I3C_CR register), and up to the TX-FIFO size.
  3. 3. If TX-FIFO is not full and if the first control word is not the last of the frame (MEND = 0 in the I3C_CR register):
    1. a) Wait for a second control word to be written into the C-FIFO, then C-FIFO is full.
    2. b) If TX-FIFO is not full, wait for data byte(s)/word(s) to be written in the TX-FIFO, if any, as defined by the second control word (RNW = 0 and DCNT[15:0] = 0 in the I3C_CR register), and up to the TX-FIFO size.

Then, as soon as a next control word is detected as required by the hardware to be transmitted on the I3C bus (if a repeated start must be emitted on the I3C bus), this control

word is requested to be written into the C-FIFO until the last message (MEND = 1 in the I3C_CR register).

Similarly, as soon as a next data byte/word is detected as required by the hardware to be transmitted on the I3C bus (if a repeated start must be emitted on the I3C bus and if TX-FIFO is not full and if data byte(s)/word(s) are to be transmitted during this I3C message), this data byte/word must be written in the TX-FIFO.

49.10.3 RX-FIFO management, as controller

When controller, as shown in figures of Section 49.9 , RX-FIFO is used during any of the following transfers:

Figure 688 illustrates the management of the RX-FIFO for queuing and popping-out data bytes or word(s) as received from the I3C bus, when the I3C peripheral acts as controller.

Figure 688. RX-FIFO management, as controller

Flowchart illustrating RX-FIFO management as controller. The process starts with I3C state = DISABLED, followed by Initialization (DMA mode, RX-FIFO threshold, interrupt/polling mode) and enabling I3C. It then enters I3C state = IDLE, where a frame transfer is initiated. The process then enters I3C state = ACTIVE, where it checks for RX-FIFO non-empty status, pops out data, and checks for transfer error or end of frame. If an error occurs, ERRF is set. If the frame is completed, FCF is set. The process ends.
graph TD
    subgraph DISABLED [I3C state = DISABLED]
        Init[Initialization:
Enable/disable DMA mode for RX-FIFO: I3C_CFGR.RXDMAEN
Configure RX-FIFO byte/word threshold: I3C_CFGR.RXTHRES
Configure interrupt/polling mode for any event: I3C_IER] EnableI3C[Enable I3C: write and set I3C_CFGR.EN=1] end subgraph IDLE [I3C state = IDLE] InitFrame[Initiate a frame transfer, by any following method:
i) SW-triggered: write and set I3C_CFGR.TSFSET=1 on a detected HW trigger hit
ii) HW-triggered: write first I3C_CR control word by software
iii) No triggering, write first I3C_CR: write first I3C_CR control word by software] end subgraph ACTIVE [I3C state = ACTIVE] NonEmpty{I3C_EVR.RXNFNEF=1?} PopOut[Pop-out a data byte/word from RX-FIFO:
read a I3C_RDR/RDWDR depending on RXTHRES. Either:
i) directly by software (via polling or interrupt)
ii) automatically by hardware in DMA mode] Error{Transfer error?} LastFrame{Is transferred message the last of the frame?} SetERRF[Setting ERRF = 1
Transfer error] SetFCF[Setting FCF = 1
Frame completed] end DISABLED --> Init --> EnableI3C --> IDLE IDLE --> InitFrame --> ACTIVE ACTIVE --> NonEmpty --> PopOut --> LastFrame LastFrame -- N --> NonEmpty LastFrame -- Y --> SetFCF SetFCF --> End NonEmpty -- N --> LastFrame Error -- Y --> SetERRF SetERRF --> End UpdateConfig[Update (or not) configuration of RX-FIFO via I3C_CFGR:
RXDMAEN, RXTHRES] --> UpdateConfig --> IDLE
Flowchart illustrating RX-FIFO management as controller. The process starts with I3C state = DISABLED, followed by Initialization (DMA mode, RX-FIFO threshold, interrupt/polling mode) and enabling I3C. It then enters I3C state = IDLE, where a frame transfer is initiated. The process then enters I3C state = ACTIVE, where it checks for RX-FIFO non-empty status, pops out data, and checks for transfer error or end of frame. If an error occurs, ERRF is set. If the frame is completed, FCF is set. The process ends.

MSv69034V2

First, the software must initialize the RX-FIFO management via the following fields of the I3C_CFGFR register:

Then, depending on RXDMAEN, the RX-FIFO is read either:

An I3C message begins from a start or a repeated start, and ends with a stop or a repeated start. At message level, the last received data byte/word from the I3C bus is flagged by IRXLASTF = 1 in the I3C_EVR register. When an I3C frame is described with multiple messages (separated by a repeated start), this event can be used by the software for updating the pointer to the buffer where is/are stored the data byte(s)/word(s) of the next message.

If RX-FIFO is full and a data byte is received on the I3C bus, an RX-FIFO overrun is reported (ERRF = 1 in the I3C_EVR register and DOVR = 1 in the I3C_SER register). If enabled by ERRRIE = 1 in the I3C_IER register, an interrupt is generated.

The configuration for the RX-FIFO management can be modified when the I3C peripheral is not in active state.

Early read termination from the target

A private read message can be early completed (also known as prematurely ended) by the addressed target.

In any case, if the S-FIFO is disabled (if SMODE = 0 in the I3C_CFGR register), the software is notified that an early read termination occurs by RXTGTENDF = 1 in the I3C_EVR register, and the corresponding interrupt if enabled. Then, software can read the status register I3C_SR to check information related to the last message ,and get the number of received data bytes on the prematurely ended read transfer (XDCNT[15:0] in the I3C_SR register).

In any case, if the S-FIFO is enabled (SMODE = 1 in the I3C_CFGR register), the software or the DMA (depending upon SDMAEN in the I3C_CFGR register) must read for each message the status register I3C_SR. The number of effective received data bytes on the prematurely ended read message is reported by XDCNT[15:0] (and then ABT = 1) in the I3C_SR register.

For more information, refer to I3C status register (I3C_SR) and Section 49.10.4 .

49.10.4 S-FIFO management, as controller

When controller, S-FIFO can be used by the software to be able to read the I3C status register (I3C_SR) for each transferred message.

Reading status register with disabled S-FIFO

If SMODE = 0 in the I3C_CFGR register, the S-FIFO is disabled and the status register can be read as a usual register:

If SMODE = 0, for the specific case of a private read prematurely ended by the target:

Typically, I3C_SR can be read when FCF = 1, or ERRF = 1, or RXTGTENDF = 1 in the I3C_EVR register. XDCNT[15:0] in the I3C_SR register can be read to get the effective number of received data bytes on a private read, after an early termination from the target (refer to Section 49.10.3 ).

Reading status register with enabled S-FIFO

If SMODE = 1 in the I3C_CFGR register, the S-FIFO is enabled. Figure 689 illustrates the management of the S-FIFO for queuing and popping-out a status word for each executed message on the I3C bus, when the I3C peripheral acts as controller.

Figure 689. S-FIFO management, as controller

Flowchart illustrating S-FIFO management as a controller. The process starts with I3C state = DISABLED, followed by initialization (enable S-FIFO, enable/disable DMA mode, configure interrupt/polling mode). Then, I3C is enabled. The state transitions to I3C state = IDLE, where a frame transfer is initiated (SW-triggered, HW-triggered, or no triggering). The state then transitions to I3C state = ACTIVE, where the controller waits for a status word from the S-FIFO. If a transfer error occurs (ERRF = 1), the error is set. If the transferred message is the last of the frame (FCF = 1), the frame is completed. The state returns to I3C state = IDLE. A side note indicates that the S-FIFO configuration can be updated via I3C_CFGR.SDMAEN.
graph TD
    subgraph DISABLED [I3C state = DISABLED]
        Init[Initialization:
Enable S-FIFO: I3C_CFGR.SMODE=1
Enable/disable DMA mode for S-FIFO: I3C_CFGR.SDMAEN
Configure interrupt/polling mode for any event: I3C_IER] Enable[Enable I3C: write and set I3C_CFGR.EN=1] Init --> Enable end Enable --> IDLE [I3C state = IDLE] subgraph IDLE [I3C state = IDLE] InitFrame[Initiate a frame transfer, by any following method:
i) SW-triggered: write and set I3C_CFGR.TSFSET=1
ii) HW-triggered: on a detected HW trigger hit
iii) No triggering, write (first) I3C_CR: write first I3C_CR control word by software] end InitFrame --> ACTIVE [I3C state = ACTIVE] subgraph ACTIVE [I3C state = ACTIVE] WaitSFNEF{I3C_EVR.SFNEF=1?} PopOut[Pop-out a status word from S-FIFO: read I3C_SR. Either:
i) directly by software (via polling or interrupt)
ii) automatically by hardware in DMA mode] TransfErr{Transfer error?} LastMsg{Is transferred message the last of the frame?} SetErrf[Setting ERRF = 1
Transfer error] SetFcf[Setting FCF = 1
Frame completed] WaitSFNEF -- N --> PopOut PopOut --> WaitSFNEF WaitSFNEF -- Y --> LastMsg LastMsg -- N --> PopOut LastMsg -- Y --> SetFcf SetFcf --> End((End)) TransfErr -- Y --> SetErrf SetErrf --> End TransfErr -- N --> LastMsg end End --> IDLE Update[Update (or not) configuration of S-FIFO via I3C_CFGR.SDMAEN] --> IDLE
Flowchart illustrating S-FIFO management as a controller. The process starts with I3C state = DISABLED, followed by initialization (enable S-FIFO, enable/disable DMA mode, configure interrupt/polling mode). Then, I3C is enabled. The state transitions to I3C state = IDLE, where a frame transfer is initiated (SW-triggered, HW-triggered, or no triggering). The state then transitions to I3C state = ACTIVE, where the controller waits for a status word from the S-FIFO. If a transfer error occurs (ERRF = 1), the error is set. If the transferred message is the last of the frame (FCF = 1), the frame is completed. The state returns to I3C state = IDLE. A side note indicates that the S-FIFO configuration can be updated via I3C_CFGR.SDMAEN.

MSV69036V2

First, the software must initialize the S-FIFO management via the SDMAEN field (enable/disable DMA mode for S-FIFO) in the I3C_CFGR register. Then, depending on SDMAEN, the S-FIFO is read either:

Each message status must be read, else an overrun error is asserted by the hardware (ERRF = 1 in the I3C_EVR register and COVR = 1 in the I3C_SER register) when the S-FIFO is full and a next message status must be written. The corresponding interrupt is raised if enabled by ERRRIE = 1 in the I3C_IER register.

The frame completion (FCF = 1 in the I3C_EVR register) is reported only when the S-FIFO is empty.

The configuration for the S-FIFO management can be modified when the I3C peripheral is not in active state.

49.11 I3C FIFOs management, as target

49.11.1 RX-FIFO management, as target

When target, as shown in figures of Section 49.9 , the RX-FIFO is used during any of the following received and acknowledged transfers:

Figure 690 illustrates the management of the RX-FIFO for queuing and popping-out data bytes or word(s) as received on the I3C bus, when the I3C peripheral acts as target.

Figure 690. RX-FIFO management, as target on the I3C bus

Flowchart of RX-FIFO management as target on the I3C bus. It starts with I3C state = DISABLED, followed by Initialization (configuring RX-FIFO thresholds and DMA mode, then enabling I3C). Then I3C state = IDLE, where configuration can be updated. Finally, I3C state = ACTIVE, which involves receiving a private write or broadcast CCC, checking if RXFNEF=1, popping data if necessary, and then either setting an error flag or completing the transfer.
graph TD
    subgraph DISABLED [I3C state = DISABLED]
        Init["Initialization<br/>Configure RX-FIFO byte/word threshold: I3C_CFGR.RXTHRES<br/>Enable/disable DMA mode for RX-FIFO: I3C_CFGR.RXDMAEN"]
        Enable["Enable I3C: write and set I3C_CFGR.EN=1"]
        Init --> Enable
    end
    subgraph IDLE [I3C state = IDLE]
        Update["Update (or not) configuration of RX-FIFO via I3C_CFGR: RXDMAEN, RXTHRES"]
    end
    subgraph ACTIVE [I3C state = ACTIVE]
        Recv["Receiving and acknowledging a private write<br/>or a broadcast DEFGRPA/DEFTGTS CCC<br/>on the I3C bus"]
        Decision{"I3C_EVR.RXFNEF=1 ?"}
        Pop["Pop-out a data byte/word from RX-FIFO:<br/>read a I3C_RDR/RDWR depending on RXTHRES. Either:<br/>i) directly by software (via polling or interrupt)<br/>ii) automatically by hardware in DMA mode"]
        Error["Setting ERRF = 1<br/>Transfer error"]
        Done["Setting FCF = 1 or DEFF=1 or DEFGRPF=1<br/>Transfer completed"]
        End[/End/]

        Recv --> Decision
        Decision -- Y --> Pop
        Pop --> Decision
        Decision -- N --> Done
        Done --> Error
        Done --> End
    end
    Enable --> IDLE
    IDLE --> Update
    Update --> ACTIVE
Flowchart of RX-FIFO management as target on the I3C bus. It starts with I3C state = DISABLED, followed by Initialization (configuring RX-FIFO thresholds and DMA mode, then enabling I3C). Then I3C state = IDLE, where configuration can be updated. Finally, I3C state = ACTIVE, which involves receiving a private write or broadcast CCC, checking if RXFNEF=1, popping data if necessary, and then either setting an error flag or completing the transfer.

MSV69035V2

First, the software must initialize the RX-FIFO management via the following I3C_CFGFR register fields:

Then, depending on RXDMAEN, the RX-FIFO is read either:

If RX-FIFO is full and a new data byte is received on the I3C bus, a RX-FIFO overrun is reported (ERRF = 1 in the I3C_EVR register and DOVR = 1 in the I3C_SER register) and the corresponding interrupt if enabled.

When the transfer is completed (in the I3C_EVR register, FCF = 1, or GRPF = 1, or DEFF = 1):

The configuration for the RX-FIFO management can be modified when the I3C peripheral is not in active state.

49.11.2 TX-FIFO management, as target

Main scheme

When target, as shown in figures of Section 49.9 , the TX-FIFO is used only during a private read ( Figure 681 ).

Figure 691 illustrates the management of the TX-FIFO for queuing and pushing-on data bytes or word(s) to be transmitted on the I3C bus, when the I3C peripheral acts as target.

Figure 691. TX-FIFO management with I3C_TGTTDR, as target on the I3C bus

Flowchart illustrating TX-FIFO management with I3C_TGTTDR as a target on the I3C bus. The process starts with I3C state = DISABLED, followed by initialization (configuring TX-FIFO thresholds and DMA mode, and enabling I3C). It then enters I3C state = IDLE, where the I3C_TGTTDR register is configured. Upon receiving a private read, it enters I3C state = ACTIVE. A loop checks if I3C_EVR.TXFNFF=1. If yes, data is pushed into the TX-FIFO. If no, it checks for transfer completion (FCF=1) or error (ERRF=1). If completed, it returns to IDLE. If in error, it updates configuration and returns to IDLE. The process ends.
graph TD
    subgraph I3C_state_DISABLED [I3C state = DISABLED]
        Init["Initialization
Configure TX-FIFO byte/word threshold: I3C_CFGR.TXTHRES
Enable/disable DMA mode for TX-FIFO: I3C_CFGR.TXDMAEN"] EnableI3C["Enable I3C: write and set I3C_CFGR.EN=1"] Init --> EnableI3C end EnableI3C --> ConfigTGTTDR["Configure I3C_TGTTDR"] subgraph I3C_state_IDLE [I3C state = IDLE] ConfigTGTTDR UpdateConfig["Update (or not) configuration of
TX-FIFO via I3C_CFGR:
TXDMAEN, TXTHRES"] end ConfigTGTTDR --> Receiving["Receiving and acknowledging a private read on the I3C bus"] subgraph I3C_state_ACTIVE [I3C state = ACTIVE] Receiving --> Decision1{"I3C_EVR.TXFNFF=1 ?"} Decision1 -- Y --> PushData["Push-on a data byte/word into TX-FIFO:
write a I3C_TDR/TDWR depending on TXTHRES. Either:
i) directly by software (via polling or interrupt)
ii) automatically by hardware in DMA mode"] PushData --> Decision1 Decision1 -- N --> Decision2{"I3C_EVR.TXFNFF=1 ?"} Decision2 -- N --> PushData Decision2 -- Y --> Error["Setting ERRF = 1
Transfer error"] Decision2 -- Y --> Success["Setting FCF = 1
Transfer completed"] end Error --> UpdateConfig Success --> End[/End/] UpdateConfig --> ConfigTGTTDR
Flowchart illustrating TX-FIFO management with I3C_TGTTDR as a target on the I3C bus. The process starts with I3C state = DISABLED, followed by initialization (configuring TX-FIFO thresholds and DMA mode, and enabling I3C). It then enters I3C state = IDLE, where the I3C_TGTTDR register is configured. Upon receiving a private read, it enters I3C state = ACTIVE. A loop checks if I3C_EVR.TXFNFF=1. If yes, data is pushed into the TX-FIFO. If no, it checks for transfer completion (FCF=1) or error (ERRF=1). If completed, it returns to IDLE. If in error, it updates configuration and returns to IDLE. The process ends.

MSV69038V2

First, the software must initialize the TX-FIFO management and write I3C_CFGR with

Then, before receiving a private read on the I3C bus, the software must configure the I3C target transmit configuration register (I3C_TGTTDR) to preload the TX-FIFO with a number of data bytes (write TGTTDCNT[15:0] and PRELOAD = 1 in a single access), so that data bytes from the target are ready to be transmitted on the serial bus:

Note: TX-FIFO size is 8 bytes (refer to Table 523).

Depending upon TXDMAEN, the TX-FIFO is preloaded either:

Then, in the same way, either directly by the software or by the allocated DMA channel, if there are remaining TGTDCNT[15:0] in the I3C_TGTDR register to be loaded into TX-FIFO for continuing the private read (set PRELOAD = 1 and TGTDCNT[15:0] > TX-FIFO size), and provided that the private read is not yet completed by the controller:

The private read transfer is completed (FCF = 1 in the I3C_EVR register) when either the target or the controller first terminates the data byte transfer.

On transfer completion, the software can:

If TX-FIFO is empty and a data byte must be transmitted on the serial bus, a TX-FIFO underrun is reported (ERRF = 1 in the I3C_EVR register and DOVR = 1 in the I3C_SER register). If enabled by ERRRIE = 1 in the I3C_EVR register, an interrupt is generated.

The configuration for the TX-FIFO management can be modified when the I3C peripheral is not in active state.

Alternative without I3C_TGTDR, if less bytes than the TX-FIFO size

Alternatively to the use of the I3C_TGTDR register, as shown in the Figure 692 , when the DMA is not used (TDMAEN = 0), provided that the number of data bytes to be read on the serial bus is less than the TX-FIFO size, the software can directly prepare and fill the TX-FIFO with the number of bytes to be read directly by the software, by successive writes to the I3C_TDR or I3C_TDWR, depending upon TXTHRES.

Figure 692. TX-FIFO management by software without I3C_TGTTDR if reading less bytes than TX-FIFO size, as target

Flowchart showing TX-FIFO management by software without I3C_TGTTDR. It starts with I3C state = DISABLED, followed by initialization (configure TX-FIFO threshold, disable DMA), then enabling I3C. Next is I3C state = IDLE, where TX-FIFO is filled. Then I3C state = ACTIVE, where data is received and acknowledged. If the read is less than TX-FIFO size, an error (ERRF = 1) is set. If the transfer is completed, FCF = 1 is set. The process ends. A side note indicates configuration can be updated via I3C_CFGR:TXTHRES.
graph TD
    subgraph I3C_state_DISABLED [I3C state = DISABLED]
        Init[Initialization<br/>Configure TX-FIFO byte/word threshold: I3C_CFGR.TXTHRES<br/>Disable DMA mode for TX-FIFO: I3C_CFGR.TXDMAEN=0]
        Enable[Enable I3C: write and set I3C_CFGR.EN=1]
        Init --> Enable
    end
    Enable --> I3C_state_IDLE
    subgraph I3C_state_IDLE [I3C state = IDLE]
        Fill[Fill TX-FIFO: successive writes to I3C_TD(W)R]
        Update[Update (or not) configuration of<br/>TX-FIFO via I3C_CFGR:<br/>TXTHRES]
        Fill --> I3C_state_ACTIVE
    end
    subgraph I3C_state_ACTIVE [I3C state = ACTIVE]
        Recv[Receiving and acknowledging on the bus a<br/>read of data bytes less than TX-FIFO size]
        Error[Setting ERRF = 1<br/>Transfer error]
        Done[Setting FCF = 1<br/>Transfer completed]
        Recv --> Error
        Recv --> Done
    end
    Done --> End{End}
    Update --> Fill
    
Flowchart showing TX-FIFO management by software without I3C_TGTTDR. It starts with I3C state = DISABLED, followed by initialization (configure TX-FIFO threshold, disable DMA), then enabling I3C. Next is I3C state = IDLE, where TX-FIFO is filled. Then I3C state = ACTIVE, where data is received and acknowledged. If the read is less than TX-FIFO size, an error (ERRF = 1) is set. If the transfer is completed, FCF = 1 is set. The process ends. A side note indicates configuration can be updated via I3C_CFGR:TXTHRES.

MSv69039V3

49.12 I3C error management

49.12.1 Controller error management

Table 533 enumerates the I3C bus error conditions, and, for each of them, the corresponding detection, action and reporting when the I3C peripheral acts as controller.

Table 533. I3C controller error management

Error typeDescriptionError detectionController actionReported error (1)
CE0Illegally formatted CCC (e.g. less returned data byte(s))Prematurely ended read data by target on a direct CCC read (2)Hardware emits a stop.ERRF = 1 and PERR = 1 and CODERR[3:0] = 0000

Table 533. I3C controller error management (continued)

Error typeDescriptionError detectionController actionReported error (1)
CE1Monitoring errorAn incorrect ACK is detected at the end of a legacy I 2 C readHardware keeps SCL running for nine clock cycles and another byte to be possibly exchanged, then emits again a NACK, followed by a stop.ERRF = 1 and
PERR = 1 and
CODERR[3:0] = 0001
Restart or stop cannot be generated at the end of an I3C SDR readSCL is kept running. Software can stop SCL by writing a control word with MTYPE[3:0] = 0000 in the I3C_CR register (header message), then must typically wait at least 150 µs before emitting another message.
After a CE1 error, a start cannot be generated
CE2No response to broadcast address (0b111_1110)Header (0b111_1110 + RnW = 0) is detected as NACK-ed during a message different from escalation fault or reset pattern messageHardware emits an HDR exit pattern followed by a stop.ERRF = 1 and
PERR = 1 and
CODERR[3:0] = 0010
CE3Failed controller hand-offNew controller has not driven SCL low after having SDA low (after a start via a test header or a start request from a target) and after the delay time defined by its activity state has elapsedHardware emits a start + 0b111_1110 + RnW = 0, followed by ACK/NACK from target(s), then stops.ERRF = 1 and
PERR = 1 and
CODERR[3:0] = 0011
-Incorrect returned 7-bit target address with parity bit on a GETACCCR CCCIncorrect dynamic address and/or parity bit is detectedHardware cancels the GETACCCR CCC by emitting a Restart + 0b111_1110 + RnW = 0, followed by ACK/NACK from target(s), then stops.ERRF = 1 and
DERR = 1
-Addressed target is NACK-ed on a direct CCC read for the first timeNACK is detectedHardware performs a single-retry by emitting a Restart + 7-bit same target address + RnW = 1.-
-Addressed target is NACK-ed on either a direct CCC write, an I3C private read/write, a legacy I 2 C, or a direct CCC read for the second timeNACK is detectedHardware emits a stop.ERRF = 1 and
ANACK= 1

Table 533. I3C controller error management (continued)

Error typeDescriptionError detectionController actionReported error (1)
-Assigned/transmitted dynamic address with parity bit is NACK-ed on a ENTDAA CCC for the first timeNACK is detectedHardware performs a single-retry assignation loop by emitting a Restart + 0b111_1110 + RnW = 1, followed by an ACK and 8-byte read data from the (most-priority) target, followed by the assigned address + parity bit.-
-Assigned/transmitted dynamic address with parity bit is NACK-ed on a ENTDAA CCC for the second timeNACK is detectedHardware emits a stop.ERRF = 1 and DNACK= 1
-Write data is NACK-ed on a legacy I2C write
-Control word, status word, transmitted data or read data is not written/read in time vs. I3C bus timingsSCL stall timeoutHardware emits a stop.ERRF = 1 and (COVR = 1 or DOVR = 1)
  1. 1. ERRF in the I3C_EVR register, PERR, CODERR[3:0], DERR, ANACK, DNACK, COVR, and DOVR in the I3C_SER register.
  2. 2. MIPI v1.1: on a GETCAPS CCC, the number of received data bytes can be 2, 3 or 4. However a target compliant with MIPI v1.0 can return only the first byte as per previously named GETHDRCAP CCC. As a result, CE0 is not generated if the number is lower than 4. On a GETMXDS CCC, the number of received data bytes can be 2 or 5. CE0 is not generated if the number is lower than 5.

49.12.2 Target error management

Table 534 enumerates the I3C bus error conditions, the corresponding detection, action, and reporting when the I3C peripheral acts as target.

Table 534. I3C target error management

Error typeDescriptionError detectionNext (when emitted by the controller)Reported error (1)
TE0Invalid broadcast address (0b111_1110+RnW = 0) or Invalid 7-bit dynamic address + RnW = 1 after DAA assignmentA forbidden address is detected after a start or a repeated startHardware waits for an HDR exit patternERRF = 1 and PERR = 1 and ODERR[3:0] = 1000
TE1CCC codeA CCC code is detected with a parity errorERRF = 1 and PERR = 1 and ODERR[3:0] = 1001

Table 534. I3C target error management (continued)

Error typeDescriptionError detectionNext (when emitted by the controller)Reported error (1)
TE2Write dataA write data byte is detected with a parity error on an I3C private write messageHardware waits for a stop or a repeated startERRF = 1 and
PERR = 1 and
ODERR[3:0] = 1010
TE3Assigned address during dynamic address arbitrationAssigned dynamic address is detected with a parity error on a ENTDAA CCCERRF = 1 and
PERR = 1 and
ODERR[3:0] = 1011
TE40b111_1110 + RnW = 1 missing after Sr during dynamic address arbitrationMissing {0b111_1110 + RnW = 1} after Sr during dynamic address arbitration is detectedERRF = 1 and
PERR = 1 and
ODERR[3:0] = 1100
TE5Transaction after detecting CCCInvalid CCC direction is detected vs. direction provided during address phase, on a CCC direct read/writeERRF = 1 and
PERR = 1 and
ODERR[3:0] = 1101
TE6Monitoring error of I3C busSDA is detected as driven at unexpected value on an data read (during a CCC direct read or a private read or an IBI)Hardware releases SDA, then waits for a stop or a repeated startERRF = 1 and
PERR = 1 and
ODERR[3:0] = 1110
-Monitoring SCL on an SDR data readSCL is detected as stable for more than 125 µs on an SDR data read (during a CCC direct read or a private read or an IBI)ERRF = 1 and
STALL = 1
-Data to be transmitted not written/available in time vs. I3C bus timingsData to be transmitted not written by software or DMA in due time on a private readHardware detects a stop or a repeated startERRF = 1 and
DOVR = 1
-Received data cannot be registered in time vs. I3C bus timingsReceived data is not read by software or DMA in due time on a private write or a DEFTGTS or a DEFGRPA CCC

1. ERRF in the I3C_EVR register, PERR, ODERR[3:0], STALL, and DOVR in the I3C_SER register.

49.13 I3C wake-up from low-power mode(s)

49.13.1 Wake-up from Stop

The user must first configure the reset and clock controller (RCC) to set up the clock data path down to the I3C peripheral: to select the source oscillator for the I3C kernel clock, the source oscillator for the I3C APB clock, and to set the clocks frequency. At initialization via the RCC, the user must enable the I3C clocks for a given I3C peripheral to be functional, separately for Run/Sleep mode and for Stop mode. For more details about RCC programming, refer to Section Reset and clock control (RCC).

The I3C hardware automatically manages its own clocks gating and generates a separated clock request output signal to the RCC for its kernel clock and its APB clock, whenever the device is in Run, Sleep or Stop mode.

When entering a Stop mode, the \( V_{CORE} \) domain is supplied, by default any clock oscillator is disabled, and in any case, neither the system clock nor a peripheral clock is running in the domain.

As controller: wake-up on an IBI without MDB, a hot-join request or a controller-role request

When the peripheral acts as controller, before the product enters a low-power mode, the software must issue an ENTASx CCC, generally with \( x = 0, 1, 2 \) or \( 3 \) , to inform targets that the I3C controller is not expected to exit from idle state neither to communicate on the I3C bus before an interval of, respectively, \( 1\ \mu\text{s} \) , \( 100\ \mu\text{s} \) , \( 2\ \text{ms} \) or \( 50\ \text{ms} \) , has elapsed. This delay defines the \( T_{CAS} \) delay for the controller to set the SCL bus clock low and running, after a start condition. More specifically for a Stop mode, the CCC must be restricted to an ENTASx with the value \( x = 1, 2 \) , or \( 3 \) .

The general scheme for the I3C wake-up from Stop is the following:

  1. 1. First the I3C peripheral requests its kernel clock to the system:
    • – On a detected start condition on the I3C bus (SDA line is detected to be driven low while SCL is high).
    • – As controller, as initiated by an external I3C target device for a hot-join/in-band interrupt/controller-role request. Once the kernel clock is provided and running, the I3C hardware uses an internal timer to wait for the corresponding \( T_{CAS} \) time to elapse, then drives low SCL and continues toggling SCL to let the target perform its hot-join/in-band interrupt/controller-role request on the I3C bus.
    • – On a detected hardware trigger to initiate an I3C transfer on the I3C bus (refer to Section 49.3.5: I3C triggers to determine whether the trigger feature is supported).
  2. 2. The system enables the source oscillator of the I3C kernel clock, and the clock gets ready (after few microseconds from HSI). The user can keep the source oscillator ON in Stop mode to reduce this startup latency, at the expense of power consumption.
    • – The I3C peripheral maintains the kernel clock request until the generation of the Stop condition on the I3C bus.
  3. 3. After that the kernel clock is running, as controller the I3C peripheral requests its APB clock to the system:
    • – On the ACKed address of a received IBI request ( Figure 683 ), and it maintains the APB clock request until that IBIF is cleared.
      If the IBI is without MDB: a Stop is normally generated on the I3C bus, even if the APB clock is not yet provided.
    • – On the ACKed address of a received controller-role request ( Figure 684 ), and it maintains the APB clock request until that CRF is cleared.
    • – On the ACKed address of a hot-join request ( Figure 685 ), and it maintains the APB clock request until that HJF is cleared.
  4. 4. The system is notified of the I3C APB clock request, and the power management unit of the PWR module is awaken.
  5. 5. An additional delay may be needed for the regulator, if it must increase the voltage for Run mode.
  6. 6. The system enables the system clock that drives the APB clock. There is an additional delay if the selected oscillator source for the system and APB clocks is not the same as

the one driving the I3C kernel clock. If so, the system enables the source oscillator of the system clock, which gets ready after a delay.

  1. 7. With the APB clock running, the I3C peripheral can log the I3C transfer in its status and data registers. When the bus transfer is completed, the I3C peripheral generates the corresponding flag (IBIF/CRF/HJF), and the enabled interrupt can wake up the CPU.

As target: wake-up on a I3C reset pattern

The target reset pattern is a specific scheme for a controller to wake up and possibly reset a target from a low power mode. It consists both in the RSTACT CCC and in the in-band reset pattern generation.

As target, the sequence for the I3C wake-up from Stop on a reset pattern is the following:

  1. 1. When the I3C peripheral detects a reset pattern on the bus (14 SDA transitions while SCL is kept low), it requests its APB clock to the system to set the RSTF flag of the I3C_EVR register
  2. 2. The system is notified of the I3C APB clock request, and the power management unit of the PWR module is awaken (after few microseconds).
  3. 3. An additional delay may be needed for the regulator, if it must increase the voltage for Run mode.
  4. 4. The system enables the source oscillator of the system clock, which gets ready after few microseconds.
  5. 5. With the APB clock running, the I3C peripheral can raise the RSTF flag of the I3C_EVR register, and the enabled interrupt can wake up the CPU.

As target: wake-up on a missed start on the serial bus

  1. 1. The I3C peripheral requests its kernel clock to the system:
    • – On a detected start condition on the serial bus (SDA line is detected to be driven low while SCL is high)
    • – If the kernel clock is not provided before that SCL is driven low by the external controller, then the I3C target detects that a bus start is missed and waits for the kernel clock to be provided. A controller message that is specifically addressed to this low-power device may have been missed (and NACKed). However the I3C peripheral can also detect a missed start if the controller started a CCC or private or legacy I 2 C message to another addressed target, or if another target initiated a start for an IBI/CR/HJ request.
    • – On a detected hardware trigger to initiate an I3C IBI/CR/HJ transfer on the I3C bus (refer to Section 49.3.5: I3C triggers to determine whether the trigger feature is supported).
  2. 2. The system enables the source oscillator of the I3C kernel clock, and the clock gets ready (after few microseconds if HSI). The user may keep the source oscillator ON in
  1. Stop mode to reduce this startup latency, at the expense of power consumption. Especially if the controller is in an Activity State of x = 0 (with a 1 µs \( T_{CAS} \) latency).
    1. 3. After that the kernel clock is running, as target, the I3C peripheral requests its APB clock to the system to raise the WKPF flag:
    2. 4. The system is notified of the I3C APB clock request, and the power management unit of the PWR module is awaken (after few microseconds).
    3. 5. An additional delay may be needed for the regulator, if it must increase the voltage for Run mode.
    4. 6. The system enables the system clock, which drives the APB clock. There is an additional delay if the selected oscillator source for the system and APB clocks is not the same as the one driving the I3C kernel clock. If so, the system enables the source oscillator of the system clock, which gets ready after few microseconds.
    5. 7. With the APB clock running:
      • – The missed start flag (WKPF of the I3C_EVR register) is raised if it occurred, and the enabled interrupt can wake up the CPU. It is then known that a serial bus transaction was missed, but not whether the target was addressed or not. The software uses a timeout to return to Stop mode, if it is not addressed by the controller again within this interval.

49.13.2 I3C wake-up from Standby

As target: wake-up on a I3C reset pattern

49.14 I3C in low-power modes

Table 535. Effect of low-power modes

ModeDescription
SleepNo effect. I3C interrupts cause the device to exit Sleep mode.
Stop (1)

The content of the I3C registers is kept when entering Stop mode.

I3C hardware manages automatically its own clocks gating and generates, for its kernel clock and APB clock, a clock request output signal to the RCC. I3C interrupts can cause the device to wake up and exit Stop mode. Serial bus transfers can occur and can be assisted with an autonomous DMA for data transfers to/from memory, provided that the autonomous DMA can operate in Stop mode.

Refer to Section 49.13 for more details.

Standby

The I3C peripheral is powered down and must be reinitialized after exiting Standby mode.

The I3C reset pattern detection module in the \( V_{DD} \) domain can wake up the device from Standby, if enabled via the PWR module.

  1. 1. Refer to Section 49.3.2: I3C wake-up from low-power mode(s) and Table 522 to see which, if any, Stop modes are supported.

49.15 I3C interrupts

49.16 I3C registers

The I3C registers must be accessed with a 32-bit word aligned address.

Note: I3C_RDR and I3C_TDR registers must be accessed with a single significant LSB data byte for, respectively, reading RX-FIFO and writing TX-FIFO.

49.16.1 I3C message control register (I3C_CR)

Address offset: 0x000

Reset value: 0x0000 0000

This register must be used to control the message to emit on the I3C bus:

When I3C acts as controller:

When I3C acts as target, this register is used in register mode:

31302928272625242322212019181716
MENDMTYPE[3:0]Res.Res.Res.ADD[6:0]RNW
wwwwwwwwwwwww
1514131211109876543210
DCNT[15:0]
wwwwwwwwwwwwwwww

Bit 31 MEND : Message end type/last message of a frame (when the I3C acts as controller)
0: this message from controller is followed by a repeated start (Sr), before another message must be emitted
1: this message from controller ends with a stop (P), being the last message of a frame

Bits 30:27 MTYPE[3:0] : Message type (whatever I3C acts as controller/target)

Condition: when I3C acts as I3C controller

0000: SCL clock is forced to stop until a next control word is executed

Bits[26:0] are ignored. On a CE1 error detection (ERRF = 1 in the I3C_EVR register and CODERR[3:0] = 0001 in the I3C_SER register) where a start/restart/stop is prevented from being generated, the software must use this message type for SCL “stuck at” recovery. Refer to Table 533 .

0001: header message

Bits[26:0] are ignored. If the addressed target is not responding with an ACK to a private/direct message, as an escalation stage after a failed GETSTATUS tentative, the software must program this with EXITPTRN = 1 in the I3C_CFGR register, so that an HDR exit pattern is emitted on the bus, whatever the header is ACK-ed or NACK-ed (to avoid the target to consider that the I3C bus is in HDR mode). Refer to Table 533 and MIPI specification about escalation handling.

If the fields of the I3C_CFGR register are programmed with EXITPTRN= 0 and RSTPTRN=1, a target reset pattern is sent on the I3C bus after the header message, whatever the header is ACK-ed or NACK-ed. This can be used to generate and broadcast a target reset pattern, especially in the case of an I3C bus topology with a single I3C target in deep sleep. Alternatively, and more generally, a target reset pattern can be encapsulated within a RSTACT CCC command (refer to Figure 675 ).

0010: private message (refer to Figure 680 )

Bits[23:17] (ADD[6:0]) are the emitted 7-bit dynamic address.

Bit[16] (RNW) is the emitted RnW bit.

Bits[15:0] (DCNT[15:0]) are the number of programmed data bytes.

The transferred private message is:

0011: direct message (second part of an I3C SDR direct CCC command) (refer to Figure 673 )

Bits[23:17] (ADD[6:0]) are the emitted 7-bit dynamic address.

Bit[16] (RNW) is the emitted RnW bit.

Bits[15:0] (DCNT[15:0]) are the number of programmed data bytes.

The transferred direct message is: Sr + 7-bit DynAddr + RnW + (8-bit Data + T)* + Sr/P

0100: legacy I 2 C message (refer to Figure 682 )

Bits[23:17] (ADD[6:0]) are the emitted 7-bit static address.

Bit[16] (RNW) is the emitted RnW bit.

Bits[15:0] (DCNT[15:0]) are the number of programmed data bytes.

The transferred legacy I 2 C message is:

Others: reserved

Condition: when I3C acts as I3C target

1000: hot-join request (W) (refer to Figure 684 )

The transferred hot-join request is {S +} 0b000_0010 addr + RnW = 0.

Writing the control word initiates the hot-join request if target is allowed to do so (HJEN = 1 in the I3C_DEVR0 register), either actively after a bus idle condition via the hardware issuing a start request (SDA low) and waiting for the controller to activate SCL clock, or passively if the controller initiates a concurrent message.

1001: controller-role request (W) (refer to Figure 685 )

The transferred controller-role request is {S +} DA[6:0] + RnW = 0 (DA in the I3C_DEVR0 register)

Writing the control word initiates the controller-role request if target is allowed to do so (CREN = 1 and DAVAL = 1 in the I3C_DEVR0 register), either actively after a bus idle condition via the hardware issuing a start request (SDA low) and waiting for the controller to activate SCL clock, or passively if the controller initiates a concurrent message.

1010: IBI (in-band interrupt) request (R) (refer to Figure 683 )

Bits[15:0] (DCNT[15:0]) are the number of the IBI data payload (including the first MDB), if any.

The transferred IBI request is {S +} DA[6:0] + RnW = 1 + optional IBI data payload. Writing the control word initiates the IBI request if target is allowed to do so (IBIEN = 1 and DAVAL = 1 in the I3C_DEVR0 register), either actively after a bus idle condition via the hardware issuing a start request (SDA low) and waiting for the controller to activate SCL clock, or passively if the controller initiates a concurrent message.

When acknowledged from controller, the transmitted IBI payload data (optional, depending upon BCR2 in the I3C_BCR register) is defined by DCNT[15:0] in the I3C_CR register and I3C_IBIDR, and must be consistently programmed vs. the IBI payload data size defined by IBIP[2:0] in the I3C_IBIDR register.

Others: reserved

Bits 26:24 Reserved, must be kept at reset value.

Bits 23:17 ADD[6:0] : 7-bit I3C dynamic / I 2 C static target address (when I3C acts as controller)

When I3C acts as controller, this field is used if MTYPE[3:0] = 0010 (private message), or MTYPE[3:0] = 0011 (direct message), or MTYPE[3:0] = 0100 (legacy I 2 C message)

Bit 16 RNW : Read / non-write message (when I3C acts as controller)

When I3C acts as controller, this field is used if MTYPE[3:0] = 0010 (private message), or MTYPE[3:0] = 0011 (direct message), or MTYPE[3:0] = 0100 (legacy I 2 C message), to emit the RnW bit on the I3C bus.

0: write message

1: read message

Bits 15:0 DCNT[15:0] : Count of data to transfer during a read or write message, in bytes (whatever I3C acts as controller/target)

When I3C acts as controller, this field is used if MTYPE[3:0] = 0010 (private message), or MTYPE[3:0] = 0011 (direct message), or MTYPE[3:0] = 0100 (legacy I 2 C message), to set the number of exchanged data bytes on the bus. In case of a private or legacy I 2 C read/write message, this field must be non-null.

When I3C acts as target, this field is used if MTYPE[3:0] = 1010 (IBI request) and if any IBI data payload (data to be transmitted if BCR2 = 1 in the I3C_BCR register), to set the number of bytes of the IBI data payload (1, 2, 3, or 4).

Linear encoding up to 64 Kbytes - 1

0x0000: no data to transfer

0x0001: 1 byte

0x0002: 2 bytes

...

0xFFFF: 64 Kbytes - 1 byte

49.16.2 I3C message control register [alternate] (I3C_CR)

Address offset: 0x000

Reset value: 0x0000 0000

This write register description must be used to control the message for when the controller has to emit a CCC (whatever is the type of the CCC: for a CCC broadcast, a CCC direct, or a CCC Enter HDR).

This is the alternate description of register I3C_CR, for when MTYPE[3:0] = 0110. Else refer to I3C message control register (I3C_CR) .

If the control FIFO (also known as C-FIFO) is not full (CFNFF = 1 in the I3C_EVR register), writing into this register means pushing a new control word into the C-FIFO; either by the software or automatically by DMA, as defined by the CDMAEN bit in the I3C_CFGR register.

When the last message of the frame is completed (a message with MEND = 1 in the I3C_CR register), the I3C hardware asserts the frame completed flag (FCF = 1 in the I3C_EVR register) and the corresponding interrupt, if enabled.

31302928272625242322212019181716
MENDMTYPE[3:0]Res.Res.Res.CCC[7:0]
wwwwwwwwwwwww
1514131211109876543210
DCNT[15:0]
wwwwwwwwwwwwwwww

Bit 31 MEND : Message end type/last message of a frame (when I3C acts as controller)

0: this message from controller is followed by a repeated start (Sr), before another message must be emitted

1: the message from the controller ends with a stop (P), being the last message of a frame

Bits 30:27 MTYPE[3:0] : Message type (when I3C acts as controller)

Condition: when I3C acts as I3C controller

0110: broadcast/direct CCC command (refer to Table 532 , Figure 673 , Figure 674 , Figure 675 )

Bits[23:16] (CCC[7:0]) are the emitted 8-bit CCC code

Bits[15:0] (DCNT[15:0]) are the number of the CCC defining bytes, or CCC sub-command bytes, or CCC data bytes.

If Bit[23] = CCC[7] = 1: this is the first part of an I3C SDR direct CCC command

The transferred direct CCC command (first part) message is:

If Bit[23] = CCC[7] = 0: this is an I3C SDR broadcast CCC command (including specific ENTDAA, refer to Figure 674 )

The transferred broadcast CCC command message is:

Others : reserved

Bits 26:24 Reserved, must be kept at reset value.

Bits 23:16 CCC[7:0] : 8-bit CCC code (when I3C acts as controller)

If bit[23] = CCC[7] = 1, this is the first part of an I3C SDR direct CCC command.

If bit[23] = CCC[7] = 0, this is an I3C SDR broadcast CCC command (including ENTDAA).

Bits 15:0 DCNT[15:0] : Count of related data to the CCC command to transfer as CCC defining bytes, or CCC sub-command bytes, or CCC data bytes, in bytes

Linear encoding up to 64 Kbytes - 1.

0x0000: no data to transfer.

Note: Value mandatory when emitting ENTDA broadcast CCC (refer to Figure 674).

0x0001: 1 byte

Note: Value mandatory when emitting RSTACT direct/broadcast CCC (refer to Figure 675).

0x0002: 2 bytes

...

0xFFFF: 64 Kbytes - 1 byte

49.16.3 I3C configuration register (I3C_CFGR)

Address offset: 0x004

Reset value: 0x0000 0000

This register is used to configure:

The configuration fields CRINIT, HKSDAEN, TRIGHWEN, TRIGPOL, and TRIGSEL[3:0] can be modified only when EN = 0. This condition is respected if they are modified at the same time when EN is set to 1 (it is not necessary to set EN later on, with another write operation).

31302928272625242322212019181716
Res.TSFSETTRIGHWENTRIGPOLTRIGSEL[3:0]FCFDISRes.CFLUSHCDMAENTMODESMODESFLUSHSDMAEN
wrwrwrwrwrwrwrwwrwrwrwwrw
1514131211109876543210
Res.TXTHRESTXFLUSHTXDMAENRes.RXTHRESRXFLUSHRXDMAENHJACKRes.HKSDAENEXITPTRNRSTPTRNNOARBHCRINITEN
rwwrwrwwrwrwrwrwrwrwrwrw

Bit 31 Reserved, must be kept at reset value.

Bit 30 TSFSET : Frame transfer set (software trigger) (when I3C acts as controller)

This bit can only be written. When I3C acts as I3C controller:

0: no action

1: setting this bit initiates a frame transfer by causing the hardware to assert the flag CFNFF in the I3C_EVR register (C-FIFO not full and a control word is needed)

Note: If this bit is not set, the other alternative for the software to initiate a frame transfer is to directly write the first control word register (I3C_CR) while C-FIFO is empty (CFEF = 1 in the I3C_EVR register). Then, if the first written control word is not tagged as a message end (MEND = 0 in the I3C_CR register), it causes the hardware to assert CFNFF.

Bit 29 TRIGHWEN : Hardware trigger enable (when IP acts as controller)

When I3C acts as controller, this bit defines the trigger mode: hardware-triggered or software-triggered.

This bit can be modified only when the IP is disabled (EN = 0 in the I3C_CFGR register).

0: hardware trigger mode is disabled

1: hardware trigger mode is enabled

Note: In hardware trigger mode, the selected trigger is not monitored meanwhile there is an on-going frame transfer. When there is no on-going frame transfer, the selected hardware trigger is monitored and on a trigger hit, the transfer is initiated by asserting CFNFF.

Bit 28 TRIGPOL : Hardware trigger signal polarity (when IP acts as controller)

This bit defines the polarity of the selected trigger signal as defined by TRIGSEL[3:0], for when IP acts as I3C controller and hardware trigger mode is enabled (TRIGHWEN = 1).

This bit can be modified only when the IP is disabled (EN = 0 in the I3C_CFGR register).

0: rising edge

1: falling edge

Bits 27:24 TRIGSEL[3:0] : Hardware trigger signal selection (when IP acts as controller)

This bitfield selects the trigger signal as per Table 524 for when IP acts as I3C controller and hardware trigger mode is enabled (TRIGHWEN = 1).

This bitfield can be modified only when the IP is disabled (EN = 0 in the I3C_CFGR register).

Bit 23 FCFDIS : FCF generation disable (when I3C acts as controller)

When the IP acts as controller, the generation of the FCF flag in the register I3C_EVR can be disabled. The software can avoid clearing this flag between two generated I3C frames (by writing 1 into CFCF in the I3C_CEVR register), especially in hardware-triggered autonomous mode.

0: enable the generation of the flag FCF in the I3C_EVR register

1: disable the generation of the flag FCF in the I3C_EVR register

Bit 22 Reserved, must be kept at reset value.

Bit 21 CFLUSH : C-FIFO flush (when I3C acts as controller)

This bit can only be written.

0: no action

1: flush C-FIFO

Bit 20 CDMAEN : C-FIFO DMA request enable (when I3C acts as controller)

When I3C acts as controller:

0: DMA mode is disabled for C-FIFO

1: DMA mode is enabled for C-FIFO

Bit 19 TMODE : Transmit mode (when I3C acts as controller)

When I3C acts as controller, this bit is used for the C-FIFO and TX-FIFO management vs. the emitted frame on the I3C bus.

0: C-FIFO and TX-FIFO are not preloaded before starting to emit a frame transfer.

A frame transfer starts as soon as the first control word is present in C-FIFO.

1: C-FIFO and TX-FIFO are first preloaded (also TX-FIFO if needed, depending on the frame format) before starting to emit a frame transfer. Refer to Section 49.10.2 for more details.

Bit 18 SMODE : S-FIFO enable / status receive mode (when I3C acts as controller)

When I3C acts as controller, this bit is used to enable the FIFO for the status (S-FIFO) of the exchanged message on the I3C bus.

When I3C acts as target, this bit must be cleared.

0: S-FIFO is disabled

1: S-FIFO is enabled.

Bit 17 SFLUSH : S-FIFO flush (when I3C acts as controller)

This bit can be written and used only when I3C acts as controller.

0: no action

1: flush S-FIFO

Bit 16 SDMAEN : S-FIFO DMA request enable (when I3C acts as controller)

This bit must be cleared if SMODE = 0 in the I3C_CFGR register (S-FIFO is disabled). In other words, DMA mode cannot be used if S-FIFO is disabled. Then the status register I3C_SR can be read or not.

This bit can be set or cleared if SMODE = 1 (S-FIFO is enabled). In other words, status register I3C_SR must be read for each message, either by software, or via an allocated DMA channel.

0: DMA mode is disabled for reading status register I3C_SR

1: DMA mode is enabled for reading status register I3C_SR

Bit 15 Reserved, must be kept at reset value.

Bit 14 TXTHRES: TX-FIFO threshold (whatever I3C acts as controller/target)

This threshold defines, compared to the TX-FIFO level, when the TXFNFF flag is set in the I3C_EVR register (and consequently if TXDMAEN = 1 when is asserted a DMA TX request).

0: 1-byte threshold

TXFNFF is set when 1 byte must be written in TX-FIFO (in I3C_TDR).

1: 1-word / 4-byte threshold

TXFNFF is set when 1 word / 4 bytes must be written in TX-FIFO (in the I3C_TDWR register). If the a number of the last transmitted data is not a multiple of 4 bytes (XDCNT[1:0] = 00 in the I3C_SR register), only the relevant 1, 2, or 3 valid LSB bytes of the last word are taken into account by the hardware, and sent on the I3C bus.

Bit 13 TXFLUSH: TX-FIFO flush (whatever I3C acts as controller/target)

This bit can only be written.

When the I3C acts as target, this bit can be used to flush the TX-FIFO on a private read if the controller has aborted the data read (driven low the T bit), and there is/are remaining data in the TX-FIFO (ABT = 1, and XDCNT[15:0] in the I3C_SR register < TGTTDCNT[15:0] in the I3C_TGTTDR register).

0: no action

1: flush TX-FIFO

Bit 12 TXDMAEN: TX-FIFO DMA request enable (whatever I3C acts as controller/target)

0: DMA mode is disabled for TX-FIFO

- Software writes and pushes a data byte/word into TX-FIFO (writes I3C_TDR or I3C_TDWR register), to be transmitted over the I3C bus.

- A next data byte/word must be written by the software either via polling on the flag TXFNFF = 1 or via interrupt notification (enabled by TXFNIE = 1).

1: DMA mode is enabled for TX-FIFO

- DMA writes and pushes data byte(s)/word(s) into TX-FIFO (writes I3C_TDR or I3C_TDWR register).

- A next data byte/word transfer is automatically pushed by the programmed hardware (via the asserted TX-FIFO DMA request from the I3C and the programmed DMA channel).

Bit 11 Reserved, must be kept at reset value.

Bit 10 RXTHRES: RX-FIFO threshold (whatever I3C acts as controller/target)

This threshold defines, compared to the RX-FIFO level, when the RXFNEF flag in the I3C_EVR register is set (and consequently if RXDMAEN = 1 when is asserted a DMA RX request).

0: 1-byte threshold

RXFNEF is set when 1 byte must be read in RX-FIFO (in the I3C_RDR register).

1: 1-word/4-bytes threshold

RXFNEF is set when 1 word / 4 bytes is/are to be read in RX-FIFO (in I3C_RDWR). In the case of a number of last received data being not a multiple of 4 bytes, only the relevant 1, 2 or 3 valid LSB bytes of the last word are to be considered by the software. The number of effective received data bytes is reported by XDCNT[15:0] in the I3C_SR register.

Bit 9 RXFLUSH: RX-FIFO flush (whatever I3C acts as controller/target)

This bit can only be written.

0: no action

1: flush RX-FIFO

Bit 8 RXDMAEN : RX-FIFO DMA request enable (whatever I3C acts as controller/target)

0: DMA mode is disabled for RX-FIFO

1: DMA mode is enabled for RX-FIFO

Bit 7 HJACK : Hot-join request acknowledge (when I3C acts as a controller)

0: hot-join request is not acknowledged

After the NACK, the controller continues as initially programmed (the hot-joining target is aware of the NACK and must emit another hot-join request later on).

1: hot-join request is acknowledged

After the ACK, the controller continues as initially programmed. The software is notified by the HJ interrupt (flag HJF is set in the I3C_EVR register), and must initiate the ENTDAA sequence later on, potentially preventing other hot-join requests with a disable target events command (DISEC, with DISHJ = 1).

Bit 6 Reserved, must be kept at reset value.

Bit 5 HKSDAEN : High-keeper enable on SDA line (when I3C acts as a controller)

0: High-keeper is disabled

1: High-keeper is enabled, and the weak pull-up is effective on the T bit, instead of the open-drain class pull-up.

Note: This bit can be modified only when EN = 0 in the I3C_CFGGR register.

Bit 4 EXITPTRN : HDR exit pattern enable (when I3C acts as a controller)

This bit can be modified only when there is no on-going frame.

0: HDR exit pattern is not sent after the issued message header (MTYPE[3:0] = 0001 in the I3C_CR register). This is used to send the header, to test ownership of the bus when there is a suspicion of a problem after controller-role hand-off (new controller did not assert its controller-role by accessing the previous one in less than the delay defined by the activity state).

1: HDR exit pattern is sent after the issued message header (MTYPE[3:0] = 0001). This is used on a controller error detection and escalation handling, in case of a not responding target to a private message or a direct read CCC.

The HDR exit pattern is sent whatever the message header {S/Sr + 0x7E addr + W} is ACK-ed or NACK-ed..

Bit 3 RSTPTRN : HDR reset pattern enable (when I3C acts as a controller)

This bit can be modified only when there is no on-going frame.

0: standard stop emitted at the end of a frame

1: HDR reset pattern is inserted before the stop of any emitted frame that includes a RSTACT CCC command

Additionally, if RSTPTRN = 1 and EXITPTRN = 0, a reset pattern is sent after the issued message header (MTYPE[3:0] = 0001 in the I3C_CR register), whatever the message header is ACK-ed or NACK-ed.

Bit 2 NOARBH : No arbitrable header after a start (when I3C acts as a controller)

This bit can be modified only when there is no on-going frame.

0: An arbitrable header (0b111_1110 + RnW = 0) is emitted after a start and before a legacy I 2 C message or an I3C SDR private read/write message (default).

1: No arbitrable header

- The target address is emitted directly after a start in case of a legacy I 2 C message or an I3C SDR private read/write message.

- This is a more performing option (when the emission of the 0x7E arbitrable header is useless), but must be used only when the controller is sure that the addressed target device cannot emit concurrently an IBI or a controller-role request (to ensure no misinterpretation and no potential conflict between the address emitted by the controller in open-drain mode and the same address a target device can emit after a start, for IBI or MR).

Bit 1 CRINIT : Initial controller/target role

This bit can be modified only when EN = 0 in the I3C_CFGR register.

0: target role

Once enabled by setting EN = 1, the I3C peripheral initially acts as a target. I3C does not drive SCL line and does not enable SDA pull-up, until it eventually acquires the controller role.

1: controller role

Once enabled by setting EN = 1, the I3C peripheral initially acts as a controller. It has the I3C controller role, so drives SCL line and enables SDA pull-up, until it eventually offers the controller role to an I3C secondary controller.

Bit 0 EN : I3C enable (whatever I3C acts as controller/target)

0: I3C is disabled

- Except registers, the I3C peripheral is under reset (partial reset).

- Before clearing EN, when I3C acts as a controller, all the possible target requests must be disabled using DISEC CCC.

- When I3C acts as a target, software must not disable the I3C, unless a partial reset is needed.

1: I3C is enabled

In this state, some register fields cannot be modified (like CRINIT, HKSDAEN, TRIGHWEN, TRIGSEL[7:0] and TRIGPOL for the I3C_CFGR)

49.16.4 I3C receive data byte register (I3C_RDR)

Address offset: 0x010

Reset value: 0x0000 0000

This register is used to read received data bytes from the I3C bus if the RX-FIFO is configured with a byte-based read access (RXTHRES = 0 in the I3C_CFGR register). Then:

register and by a data overrun flag DOVRF = 1 in the I3C_SER register (and corresponding interrupt if enabled).

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.RDB0[7:0]
rrrrrrrr

Bits 31:8 Reserved, must be kept at reset value.

Bits 7:0 RDB0[7:0] : 8-bit received data on I3C bus.

49.16.5 I3C receive data word register (I3C_RDWR)

Address offset: 0x014

Reset value: 0x0000 0000

This register is used to read received data bytes from the I3C bus if the RX-FIFO is configured with a 32-bit word-based read access (RXTHRES = 1 in the I3C_CFGR register). Then:

31302928272625242322212019181716
RDB3[7:0]RDB2[7:0]
rrrrrrrrrrrrrrrr
1514131211109876543210
RDB1[7:0]RDB0[7:0]
rrrrrrrrrrrrrrrr

Bits 31:24 RDB3[7:0] : 8-bit received data (latest byte on I3C bus).

Bits 23:16 RDB2[7:0] : 8-bit received data (next byte after RDB1 on I3C bus).

Bits 15:8 RDB1[7:0] : 8-bit received data (next byte after RDB0 on I3C bus).

Bits 7:0 RDB0[7:0] : 8-bit received data (earliest byte on I3C bus).

49.16.6 I3C transmit data byte register (I3C_TDR)

Address offset: 0x018

Reset value: 0x0000 0000

This register is used to write data bytes to be transmitted over the I3C bus.

This register implements a byte-based write access to the transmit FIFO (TX-FIFO), and is used when TXTHRES = 0 in the I3C_CFGR register.

When the I3C acts as controller:

When the I3C acts as target:

If the TX-FIFO is empty and the controller cannot wait longer a data byte to be transmitted, the software is notified by an error flag ERRF = 1 in the I3C_EVR register and a data underrun flag DOF = 1 (and corresponding interrupt if enabled) in the I3C_SER register.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.TDB0[7:0]
wwwwwwww

Bits 31:8 Reserved, must be kept at reset value.

Bits 7:0 TDB0[7:0] : 8-bit data to transmit on I3C bus.

49.16.7 I3C transmit data word register (I3C_TDWR)

Address offset: 0x01C

Reset value: 0x0000 0000

This register is used to write 32-bit data words to be transmitted over the I3C bus.

This register implements a word-based write access to the transmit FIFO (TX-FIFO), and is used when TXTHRES = 1 in the I3C_CFGR register.

When the I3C acts as controller:

When the I3C acts as target:

If the TX-FIFO is empty and the controller/target cannot wait longer a data byte to be transmitted, the software is notified by an error flag ERRF = 1 in the I3C_EVR register and a

data underrun flag DOF = 1 in the I3C_SER register (and corresponding interrupt if enabled).

31302928272625242322212019181716
TDB3[7:0]TDB2[7:0]
wwwwwwwwwwwwwwww
1514131211109876543210
TDB1[7:0]TDB0[7:0]
wwwwwwwwwwwwwwww

Bits 31:24 TDB3[7:0] : 8-bit transmit data (latest byte on I3C bus).

Bits 23:16 TDB2[7:0] : 8-bit transmit data (next byte after TDB1[7:0] on I3C bus).

Bits 15:8 TDB1[7:0] : 8-bit transmit data (next byte after TDB0[7:0] on I3C bus).

Bits 7:0 TDB0[7:0] : 8-bit transmit data (earliest byte on I3C bus)

49.16.8 I3C IBI payload data register (I3C_IBIDR)

Address offset: 0x020

Reset value: 0x0000 0000

This register is used for the IBI payload data.

When I3C acts as target:

When I3C acts as controller: if IBIACK= 1 in the I3C_DEVRx register, once it acknowledges on the I3C bus the IBI request from the target x:

31302928272625242322212019181716
IBIDB3[7:0]IBIDB2[7:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
IBIDB1[7:0]IBIDB0[7:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:24 IBIDB3[7:0] : 8-bit IBI payload data (latest byte on I3C bus).

Bits 23:16 IBIDB2[7:0] : 8-bit IBI payload data (next byte on I3C bus after IBIDB1[7:0]).

Bits 15:8 IBIDB1[7:0] : 8-bit IBI payload data (next byte on I3C bus after IBIDB0[7:0]).

Bits 7:0 IBIDB0[7:0] : 8-bit IBI payload data (earliest byte on I3C bus, MDB[7:0] mandatory data byte).

49.16.9 I3C target transmit configuration register (I3C_TGTTDR)

Address offset: 0x024

Reset value: 0x0000 0000

When I3C acts as target, this register must be used to preload a number of data bytes in the TX-FIFO, so that they are ready to be transmitted on the I3C bus, when they are accepted/acknowledged by the controller, whatever the DMA mode is used or not (independently from TXDMAEN in the I3C_CFGR register).

When I3C acts as target, alternatively, if the number of data bytes to be transmitted is less than or equal to the TX-FIFO size (8 bytes), the software can directly use and write byte(s) into the I3C_TDR register (or I3C_TDWR register, depending upon TXTHRES in the I3C_CFGR register), via polling on the TX-FIFO empty flag (TXFEF = 1 in the I3C_EVR register), or via the corresponding enabled interrupt.

In any case, since an I3C target is unable to stretch/stall the SCL line, the software can identify a TX-FIFO underrun via DOR = 1 in the I3C_EVR register.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PRELOAD
rw
1514131211109876543210
TGTTDCNT[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:17 Reserved, must be kept at reset value.

Bit 16 PRELOAD : Preload of the TX-FIFO (when I3C is configured as target)

This bit must be written and asserted by software in the same access when is written and defined the number of bytes to preload into the TX-FIFO and to transmit.

This bit is cleared by hardware when all the data bytes to transmit are loaded into the TX-FIFO.

0: no TX-FIFO preload

1: TX-FIFO preload

Bits 15:0 TGTTDCNT[15:0] : Transmit data counter, in bytes (when I3C is configured as target)

This bitfield must be written by software in the same access when is asserted PRELOAD, in order to define the number of bytes to preload and to transmit.

This bitfield is updated by hardware and reports, when read, the remaining number of bytes to be loaded into the TX-FIFO.

49.16.10 I3C status register (I3C_SR)

Address offset: 0x030

Reset value: 0x0000 0000

This register is used to read the status about the exchanged message on the I3C bus:

31302928272625242322212019181716
MID[7:0]Res.Res.Res.Res.Res.DIRABTRes.
rrrrrrrrrr
1514131211109876543210
XDCNT[15:0]
rrrrrrrrrrrrrrrr

Bits 31:24 MID[7:0] : Message identifier/counter of a given frame (when the I3C acts as controller)

When I3C acts as controller, this fbitfield identifies the control word message (I3C_CR) to whom the I3C_SR status register refers.

First message of a frame is identified with MID[7:0] = 0.

This bitfield is incremented (by hardware) on the completion of a new message control word (I3C_CR) over I3C bus. This field is reset for every new frame start.

Bits 23:19 Reserved, must be kept at reset value.

Bit 18 DIR : Message direction

Whatever the I3C acts as controller or target, this bit indicates the direction of the related message on the I3C bus

0: write

1: read

Note: ENTDAA CCC is considered as a write command.

Bit 17 ABT : A private read message is ended prematurely by the target (when the I3C acts as controller)

When the I3C acts as controller, this bit indicates if the private read data transmitted by the target early terminates (the target drives T bit low earlier vs. what the controller expects in terms of programmed number of read data bytes DCNT[15:0] in the I3C_CR register).

0: no early completion from the target

1: early completion from the target

Bit 16 Reserved, must be kept at reset value.

Bits 15:0 XDCNT[15:0] : Data counter

Condition: during the dynamic address assignment process (ENTDAA CCC)

- When the I3C acts as controller: number of targets detected on the bus

- When the I3C acts as target: number of transmitted bytes

Condition: for other transfers, during the message

- Whatever the I3C acts as controller or target: number of data bytes read from or transmitted on the I3C bus during the message

49.16.11 I3C status error register (I3C_SER)

Address offset: 0x034

Reset value: 0x0000 0000

This read register is used to get more information about the error when an error is raised by hardware and notified to the software via the error flag ERRF = 1 in the I3C_EVR register (and corresponding interrupt if enabled).

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.DERRDNACKANACKCOVRDOVRSTALLPERRCODERR[3:0]
rrrrrrrrrrr

Bits 31:11 Reserved, must be kept at reset value.

Bit 10 DERR : Data error (when the I3C acts as controller)

0: no detected error

1: controller detected a data error during the controller-role hand-off procedure (GETACCCR CCC, formerly known as GETACCMST) when the received target address or/and the parity bit do not match. Active controller keeps controller-role.

Bit 9 DNACK : Data not acknowledged (when the I3C acts as controller)

0: no detected error

1: controller detected that a data byte is not acknowledged by a target, either during:

i) a legacy I2C write transfer

ii) the second trial when sending dynamic address during ENTDAA procedure

Bit 8 ANACK : Address not acknowledged (when the I3C is configured as controller)

0: no detected error

1: controller detected that the static/dynamic address was not acknowledged by a target, either during:

Bit 7 COVR : C-FIFO underrun or S-FIFO overrun (when the I3C acts as controller)

0: no detected error

1: controller detected either:

Bit 6 DOVR : RX-FIFO overrun or TX-FIFO underrun

0: no detected error

1: whatever controller or target, hardware detected either:

Bit 5 STALL : SCL stall error (when the I3C acts as target)

0: no detected error

1: target detected that SCL was stable for more than 125 µs during an I3C SDR data read (during a direct CCC read, a private read, or an IB)

Bit 4 PERR : Protocol error

0: no detected error

1: whatever controller or target, hardware detected a protocol error, as detailed in CODERR[3:0]

  1. Bits 3:0 CODERR[3:0] : Protocol error code/type
    • 0000: CE0 error (transaction after sending CCC):
      controller detected an illegally formatted CCC
    • 0001: CE1 error (monitoring error):
      controller detected that transmitted data on the bus is different from expected
    • 0010: CE2 error (no response to broadcast address):
      controller detected a not acknowledged broadcast address (0b111_1110)
    • 0011: CE3 error (failed controller-role hand-off):
      controller detected the new controller did not drive bus after controller-role hand-off
    • 1000: TE0 error (invalid broadcast address 0b111_1110 + W):
      target detected an invalid broadcast address 0b111_1110 + W
    • 1001: TE1 error (CCC code):
      target detected a parity error on a CCC code via a parity check (vs. T bit)
    • 1010: TE2 error (write data):
      target detected a parity error on a write data via a parity check (vs. T bit)
    • 1011: TE3 error (assigned address during dynamic address arbitration):
      target detected a parity error on the assigned address during dynamic address arbitration via a parity check (vs. PAR bit)
    • 1100: TE4 error (0b111_1110 + R missing after Sr during dynamic address arbitration):
      target detected a 0b111_1110 + R missing after Sr during dynamic address arbitration
    • 1101: TE5 error (transaction after detecting CCC):
      target detected an illegally formatted CCC
    • 1110: TE6 error (monitoring error):
      target detected that transmitted data on the bus is different from expected
    • others: reserved

49.16.12 I3C received message register (I3C_RMR)

Address offset: 0x040

Reset value: 0x0000 0000

When the I3C acts as controller, this read register is used to log the received target address, and the IBI received payload data size.

When the I3C acts as target, this read register is used to log the received CCC code

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.RADD[6:0]Res.
rrrrrrr
1514131211109876543210
RCODE[7:0]Res.Res.Res.Res.Res.IBIRDCNT[2:0]
rrrrrrrrrrr

Bits 31:24 Reserved, must be kept at reset value.

Bits 23:17 RADD[6:0] : Received target address (when the I3C is configured as controller)

When the I3C is configured as controller, this field logs the received dynamic address from the target during acknowledged IBI or controller-role request.

Bit 16 Reserved, must be kept at reset value.

Bits 15:8 RCODE[7:0] : Received CCC code (when the I3C is configured as target)

When the I3C is configured as target, this field logs the received CCC code.

Bits 7:3 Reserved, must be kept at reset value.

Bits 2:0 IBIRDCNT[2:0] : IBI received payload data count (when the I3C is configured as controller)

When the I3C is configured as controller, this field logs the number of data bytes effectively received in the I3C_IBIDR register.

49.16.13 I3C event register (I3C_EVR)

Address offset: 0x050

Reset value: 0x0000 0003

This is a read register, used for reporting event flags.

31302928272625242322212019181716
GRPFDEFFINT
UPDF
AS
UPDF
RSTFMRL
UPDF
MWL
UPDF
DA
UPDF
STAFGETFWKPFRes.HJFCR
UPDF
CRFIBI
ENDF
rrrrrrrrrrrrrrr

1514131211109876543210
IBIFRes.Res.Res.ERRFRXTGT
ENDF
FCFRes.RX
LASTF
TX
LASTF
RX
FNEF
TX
FNFF
SFNEFCFNFFTXFEFCFEF
rrrrrrrrrrrr

Bit 31 GRPF : Group addressing flag (when the I3C acts as target)

When the I3C acts as target (and is typically controller-capable), this flag is asserted by hardware to indicate that the broadcast DEFGPRPA CCC (define list of group addresses) has been received. Then, software can store the received data for when getting controller role. The flag is cleared when software writes 1 into the corresponding CGRPF bit in the I3C_CR register.

Bit 30 DEFF : DEFTGTS flag (when the I3C acts as target)

When the I3C acts as target (and is typically controller capable), this flag is asserted by hardware to indicate that the broadcast DEFTGTS CCC (define list of targets) has been received. Then, software can store the received data for when getting the controller role. The flag is cleared when software writes 1 into the corresponding CDEFF bit in the I3C_CEVR register.

Bit 29 INTUPDF : Interrupt/controller-role/hot-join update flag (when the I3C acts as target)

When the I3C acts as target, this flag is asserted by hardware to indicate that the direct or broadcast ENEC/DISEC CCC (enable/disable target events) has been received, where a target event is either an interrupt/IBI request, a controller-role request, or an hot-join request. Then, software must read respectively IBIEN, CREN, or HJEN in the I3C_DEVR0 register. The flag is cleared when software writes 1 into the corresponding CINTUPDF bit in the I3C_CEVR register.

Bit 28 ASUPDF : Activity state update flag (when the I3C acts as target)

When the I3C acts as target, this flag is asserted by hardware to indicate that the direct or broadcast ENTASx CCC (with x = 0...3) has been received. Then, software must read AS[1:0] in the I3C_DEVR0 register. The flag is cleared when software writes 1 into the corresponding CASUPDF bit in the I3C_CEVR register.

Bit 27 RSTF: Reset pattern flag (when the I3C acts as target)

When I3C acts as target, this flag is asserted by hardware to indicate that a reset pattern has been detected (14 SDA transitions while SCL is low, followed by repeated start, then stop).

Then, when not in Stop mode, software must read RSTACT[1:0] and RSTVAL in the I3C_DEVR0 register, to know the required reset level.

When in Stop mode, the corresponding interrupt can be used to wake up the device.

The flag is cleared when software writes 1 into the corresponding CRSTF bit in the I3C_CEVR register.

Bit 26 MRLUPDF: Maximum read length update flag (when the I3C acts as target)

When the I3C acts as target, this flag is asserted by hardware to indicate that a direct SETMRL CCC (set max read length) has been received. Then, software must read MRL[15:0] in the I3C_MAXRLR register to get the maximum read length value.

The flag is cleared when software writes 1 into the corresponding CMRLUPDF bit in the I3C_CEVR register.

Bit 25 MWLUPDF: Maximum write length update flag (when the I3C acts as target)

When the I3C acts as target, this flag is asserted by hardware to indicate that a direct SETMWL CCC (set max write length) has been received. Then, software must read MWL[15:0] in the I3C_MAXRLR register to get the maximum write length value.

The flag is cleared when software writes 1 into the corresponding CMWLUPDF bit in the I3C_CEVR register.

Bit 24 DAUPDF: Dynamic address update flag (when the I3C acts as target)

When the I3C acts as target, this flag is asserted by hardware to indicate that a dynamic address update has been received via any of the broadcast ENTDAA, RSTDAA and direct SETNEWDA CCC. Then, software must read DA[6:0] and DAVAL in the I3C_DEVR0 register to get the dynamic address update.

The flag is cleared when software writes 1 into the corresponding CDAUPDF bit in the I3C_CEVR register.

Bit 23 STAF: Get status flag (when the I3C acts as target)

When the I3C acts as target, this flag is asserted by hardware to indicate that a direct GETSTATUS CCC of format 1 (without defining byte or with defining byte TGTSTAT) has been received.

The flag is cleared when software writes 1 into the corresponding CSTAF bit in the I3C_CEVR register.

Bit 22 GETF: Get flag (when the I3C acts as target)

When the I3C acts as target, this flag is asserted by hardware to indicate that any direct CCC of get type (GET*** CCC) except the GETSTATUS of format 1 (but including GETSTATUS of format 2) has been received.

The flag is cleared when software writes 1 into the corresponding CGETF bit in the I3C_CEVR register.

Bit 21 WKPF : Wake-up/missed start flag (when the I3C acts as target)

When the I3C acts as target, this flag is asserted by hardware to indicate that a start has been detected (an SDA falling edge followed by an SCL falling edge) but on the next SCL falling edge, the I3C kernel clock is (still) gated. Thus an I3C bus transaction may have been lost by the target.

The corresponding interrupt can be used to wake up the device from a low power (Sleep or Stop) mode.

The flag is cleared when software writes 1 into the corresponding CWKPF bit in the I3C_CEVR register.

Bit 20 Reserved, must be kept at reset value.

Bit 19 HJF : Hot-join flag (when the I3C acts as controller)

When the I3C acts as controller, this flag is asserted by hardware to indicate that an hot join request has been received.

The flag is cleared when software writes 1 into the corresponding CHJF bit in the I3C_CEVR register.

Bit 18 CRUPDF : Controller-role update flag (when the I3C acts as target)

When the I3C acts as target, this flag is asserted by hardware to indicate that it has now gained the controller role after the completed controller-role hand-off procedure.

The flag is cleared when software writes 1 into the corresponding CCRUPDF bit in the I3C_CEVR register.

Bit 17 CRF : Controller-role request flag (when the I3C acts as controller)

When the I3C acts as controller, this flag is asserted by hardware to indicate that a controller-role request has been acknowledged and completed (by hardware). The software must then issue a GETACCCR CCC (get accept controller role) for the controller-role hand-off procedure.

The flag is cleared when software writes 1 into the corresponding CCRF bit in the I3C_CEVR register.

Bit 16 IBIENDF : IBI end flag (when the I3C acts as target)

When the I3C acts as target, this flag is asserted by hardware to indicate that an IBI transfer has been received and completed (IBI acknowledged and IBI data bytes read by controller if any).

The flag is cleared when software writes 1 into the corresponding CIBIENDF bit in the I3C_CEVR register.

Bit 15 IBIF : IBI flag (when the I3C acts as controller)

When the I3C acts as controller, this flag is asserted by hardware to indicate that an IBI request has been received.

The flag is cleared when software writes 1 into the corresponding CIBIF bit in the I3C_CEVR register.

Bits 14:12 Reserved, must be kept at reset value.

Bit 11 ERRF : Flag (whatever the I3C acts as controller/target)

This flag is asserted by hardware to indicate that an error occurred. Then, software must read I3C_SER to get the error type.

The flag is cleared when software writes 1 into the corresponding CERRF bit in the I3C_CEVR register.

Bit 10 RXTGTENDF : Target-initiated read end flag (when the I3C acts as controller)

When the I3C acts as controller, and only if the S-FIFO is disabled (SMODE = 0 in the I3C_CFGR register), this flag is asserted by hardware to indicate that the target has prematurely ended a read transfer. Then, software must read the status register I3C_SR to check information related to the last message and get the number of received data bytes on the prematurely read transfer (XDCNT in the I3C_SR register).

The flag is cleared when software writes 1 into the corresponding CRXTGTENDF bit in the I3C_CEVR register.

Bit 9 FCF : Frame complete flag (whatever the I3C acts as controller/target)

When the I3C acts as controller, this flag is asserted by hardware to indicate that a frame has been (normally) completed on the I3C bus, for example, when a stop is issued.

When the I3C acts as target, this flag is asserted by hardware to indicate that a message addressed to/by this target has been (normally) completed on the I3C bus, for example, when a next stop or repeated start is then issued by the controller.

The flag is cleared when software writes 1 into the corresponding CFCF bit in the I3C_CEVR register.

Bit 8 Reserved, must be kept at reset value.

Bit 7 RXLASTF : Last read data byte/word flag (when the I3C acts as controller)

When the I3C acts as controller, this flag is asserted by hardware to indicate that the last data byte/word (depending upon RXTHRES in the I3C_CFGR register) of a message must be read from the RX-FIFO. The flag is de-asserted by hardware when the last data byte/word of a message is read.

Bit 6 TXLASTF : Last written data byte/word flag (whatever the I3C acts as controller/target)

This flag is asserted by hardware to indicate that the last data byte/word (depending upon TXTHRES in the I3C_CFGR register) of a message must be written to the TX-FIFO. The flag is de-asserted by hardware when the last data byte/word of a message is written.

Bit 5 RXFNEF : RX-FIFO not empty flag (whatever the I3C acts as controller/target)

This flag is asserted/de-asserted by hardware to indicate that a data byte must/must not be read from the RX-FIFO.

Note: The software must wait for RXFNEF = 1 (by polling or via the enabled interrupt) before reading from RX-FIFO (reading from I3C_RDR or I3C_RDWR, depending upon RXTHRES).

Bit 4 TXFNFF : TX-FIFO not full flag (whatever the I3C acts as controller/target)

This flag is asserted/de-asserted by hardware to indicate that a data byte/word must/must not be written to the TX-FIFO.

Note: The software must wait for TXFNFF = 1 (by polling or via the enabled interrupt) before writing to TX-FIFO (writing to I3C_TDR or I3C_TDWR, depending upon TXTHRES).

Note: When the I3C acts as target, if the software intends to use the TXFNFF flag for writing into I3C_TDR/I3C_TDWR, it must have configured and set the TX-FIFO preload (write PRELOAD in the I3C_TGTTDR register).

Bit 3 SFNEF : S-FIFO not empty flag (when the I3C acts as controller)

When the I3C acts as controller, if the S-FIFO is enabled (SMODE = 1 in the I3C_CFGR register), this flag is asserted by hardware to indicate that a status word must be read from the S-FIFO. The flag is de-asserted by hardware to indicate that a status word is not to be read from the S-FIFO.

Bit 2 CFNFF : C-FIFO not full flag (when the I3C acts as controller)

When the I3C acts as controller, this flag is asserted by hardware to indicate that a control word must be written to the C-FIFO. The flag is de-asserted by hardware to indicate that a control word is not to be written to the C-FIFO.

Note: The software must wait for CFNFF = 1 (by polling or via the enabled interrupt) before writing to C-FIFO (writing to I3C_CR).

Bit 1 TXFEF : TX-FIFO empty flag (whatever the I3C acts as controller/target)

This flag is asserted by hardware to indicate that the TX-FIFO is empty.

This flag is de-asserted by hardware to indicate that the TX-FIFO is not empty.

Bit 0 CFEF : C-FIFO empty flag (whatever the I3C acts as controller)

This flag is asserted by hardware to indicate that the C-FIFO is empty when controller, and that the I3C_CR register contains no control word (none IBI/CR/HJ request) when target.

This flag is de-asserted by hardware to indicate that the C-FIFO is not empty when controller, and that the I3C_CR register contains one control word (a pending IBI/CR/HJ request) when target.

Note: When the I3C acts as controller, if the C-FIFO and TX-FIFO preload is configured (TMODE = 1 in the I3C_CFGR register), the software must wait for TXFEF = 1 and CFEF = 1 before starting a new frame transfer.

49.16.14 I3C interrupt enable register (I3C_IER)

Address offset: 0x054

Reset value: 0x0000 0000

This register is used to enable/disable, at bit level, an interrupt, for each of the following event/flag.

31302928272625242322212019181716
GRPIEDEFIEINTUPDIEASUPDIERSTIEMRLUPDIEMWLLUPDIEDAUPDIESTAIEGETIEWKPIERes.HJIECRUPDIECRIEIBIENDIE
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

1514131211109876543210
IBIIERes.Res.Res.ERRIERXTGTENDIEFCIERes.Res.Res.RXFNEIETXFNEIESFNEIECFNIERes.Res.
rwrwrwrwrwrwrwrw

Bit 31 GRPIE : DEFGRA CCC interrupt enable (when the I3C acts as target)

0: interrupt disabled

1: interrupt enabled

Bit 30 DEFIE : DEFTGTS CCC interrupt enable (when the I3C acts as target)

0: interrupt disabled

1: interrupt enabled

Bit 29 INTUPDIE : ENEC/DISEC CCC interrupt enable (when the I3C acts as target)

0: interrupt disabled

1: interrupt enabled

  1. Bit 28 ASUPDIE : ENTASx CCC interrupt enable (when the I3C acts as target)
    0: interrupt disabled
    1: interrupt enabled
  2. Bit 27 RSTIE : reset pattern interrupt enable (when the I3C acts as target)
    0: interrupt disabled
    1: interrupt enabled
  3. Bit 26 MRLUPDIE : SETMRL CCC interrupt enable (when the I3C acts as target)
    0: interrupt disabled
    1: interrupt enabled
  4. Bit 25 MWLUPDIE : SETMWL CCC interrupt enable (when the I3C acts as target)
    0: interrupt disabled
    1: interrupt enabled
  5. Bit 24 DAUPDIE : ENTDAARSTDAA/SETNEWDA CCC interrupt enable (when the I3C acts as target)
    0: interrupt disabled
    1: interrupt enabled
  6. Bit 23 STAIE : format 1 GETSTATUS CCC interrupt enable (when the I3C acts as target)
    0: interrupt disabled
    1: interrupt enabled
  7. Bit 22 GETIE : GETxxx CCC interrupt enable (except GETSTATUS of format 1) (when the I3C acts as target)
    0: interrupt disabled
    1: interrupt enabled
  8. Bit 21 WKPIE : Wake-up interrupt enable (when the I3C acts as target)
    0: interrupt disabled
    1: interrupt enabled
  9. Bit 20 Reserved, must be kept at reset value.
  10. Bit 19 HJIE : Hot-join interrupt enable (when the I3C acts as controller)
    0: interrupt disabled
    1: interrupt enabled
  11. Bit 18 CRUPDIE : Controller-role update interrupt enable (when the I3C acts as target)
    0: interrupt disabled
    1: interrupt enabled
  12. Bit 17 CRIE : Controller-role request interrupt enable (when the I3C acts as controller)
    0: interrupt disabled
    1: interrupt enabled
  13. Bit 16 IBIENDIE : IBI end interrupt enable (when the I3C acts as target)
    0: interrupt disabled
    1: interrupt enabled
  14. Bit 15 IBIIE : IBI request interrupt enable (when the I3C acts as controller)
    0: interrupt disabled
    1: interrupt enabled
  15. Bits 14:12 Reserved, must be kept at reset value.

Bit 11 ERRIE : error interrupt enable (whatever the I3C acts as controller/target)

0: interrupt disabled

1: interrupt enabled

Bit 10 RXTGTENDIE : target-initiated read end interrupt enable (when the I3C acts as controller)

0: interrupt disabled

1: interrupt enabled

Bit 9 FCIE : frame complete interrupt enable (whatever the I3C acts as controller/target)

0: interrupt disabled

1: interrupt enabled

Bits 8:6 Reserved, must be kept at reset value.

Bit 5 RXFNEIE : RX-FIFO not empty interrupt enable (whatever the I3C acts as controller/target)

0: interrupt disabled

1: interrupt enabled

Bit 4 TXFNFIE : TX-FIFO not full interrupt enable (whatever the I3C acts as controller/target)

0: interrupt disabled

1: interrupt enabled

Bit 3 SFNEIE : S-FIFO not empty interrupt enable when the I3C acts as controller

0: interrupt disabled

1: interrupt enabled

Bit 2 CFNFIE : C-FIFO not full interrupt enable when the I3C acts as controller

0: interrupt disabled

1: interrupt enabled

Bits 1:0 Reserved, must be kept at reset value.

49.16.15 I3C clear event register (I3C_CEVR)

Address offset: 0x058

Reset value: 0x0000 0000

This write register is used to clear individually, at bit level, the corresponding event flag of the I3C_EVR register.

31302928272625242322212019181716
CGRPFCDEFFCINTUPDFCASUPDFCRSTFCMRLUPDFCMWLUPDFCDAUPDFCSTAFCGETFCWKPFRes.CHJFCCRUPDFCCRFCIBENDF
wwwwwwwwwwwwwww
1514131211109876543210
CIBIFRes.Res.Res.CERRFCRXTGTENDFCFCFRes.Res.Res.Res.Res.Res.Res.Res.Res.
wwww

Bit 31 CGRPF : Clear DEFGRPA CCC flag (when the I3C acts as target)

0: no effect

1: clear GRPF

  1. Bit 30 CDEFF : Clear DEFTGTS CCC flag (when the I3C acts as target)
    0: no effect
    1: clear DEFF
  2. Bit 29 CINTUPDF : Clear ENEC/DISEC CCC flag (when the I3C acts as target)
    0: no effect
    1: clear CINTUPDF
  3. Bit 28 CASUPDF : Clear ENTASx CCC flag (when the I3C acts as target)
    0: no effect
    1: clear ASUPDF
  4. Bit 27 CRSTF : Clear reset pattern flag (when the I3C acts as target)
    0: no effect
    1: clear RSTF
  5. Bit 26 CMRLUPDF : Clear SETMRL CCC flag (when the I3C acts as target)
    0: no effect
    1: clear MRLUPDF
  6. Bit 25 CMWLUPDF : Clear SETMWL CCC flag (when the I3C acts as target)
    0: no effect
    1: clear MWLUPDF
  7. Bit 24 CDAUPDF : Clear ENTDAAR/STDAA/SETNEWDA CCC flag (when the I3C acts as target)
    0: no effect
    1: clear DAUPDF
  8. Bit 23 CSTAF : Clear format 1 GETSTATUS CCC flag (when the I3C acts as target)
    0: no effect
    1: clear STAF
  9. Bit 22 CGETF : Clear GETxxx CCC flag (except GETSTATUS of format 1) (when the I3C acts as target)
    0: no effect
    1: clear GETF
  10. Bit 21 CWPKF : Clear wake-up flag (when the I3C acts as target)
    0: no effect
    1: clear WKPF
  11. Bit 20 Reserved, must be kept at reset value.
  12. Bit 19 CHJF : Clear hot-join flag (when the I3C acts as controller)
    0: no effect
    1: clear HJF
  13. Bit 18 CCRUPDF : Clear controller-role update flag (when the I3C acts as target)
    0: no effect
    1: clear CRUPDF
  14. Bit 17 CCRF : Clear controller-role request flag (when the I3C acts as controller)
    0: no effect
    1: clear CRF
  15. Bit 16 CIBIENDF : Clear IBI end flag (when the I3C acts as target)
    0: no effect
    1: clear IBIENDF

Bit 15 CIBIF : Clear IBI request flag (when the I3C acts as controller)

0: no effect

1: clear IBIF

Bits 14:12 Reserved, must be kept at reset value.

Bit 11 CERRF : Clear error flag (whatever the I3C acts as controller/target)

0: no effect

1: clear ERRF

Bit 10 CRXTGTENDF : Clear target-initiated read end flag (when the I3C acts as controller)

0: no effect

1: clear RXTGTENDF

Bit 9 CFCF : Clear frame complete flag (whatever the I3C acts as controller/target)

0: no effect

1: clear FCF

Bits 8:0 Reserved, must be kept at reset value.

49.16.16 I3C masked interrupt status register (I3C_MISR)

Address offset: 0x05C

Reset value: 0x0000 0000

This is a read register, containing the masked interrupt status for each individual event flag bit. Each bit is the logical AND of the corresponding interrupt enable bit of the I3C_IER register and the event flag bit of the I3C_EVR register.

31302928272625242322212019181716
GRPMISDEFMISINTUPDMISASUPDMISRSTMISMRLUPDMISMWLUPDMISDAUPDMISSTAMISGETMISWKPMISRes.HJMISCRUPDMISCRMISIBIENDMIS
rrrrrrrrrrrrrrr
1514131211109876543210
IBIMISRes.Res.Res.ERRMISRXTGTENDMISFCMISRes.Res.Res.RXFNEMISTXFNEMISSFNEMISCFNEMISRes.Res.
rrrrrrrr

Bit 31 GRPMIS : DEFGRPA CCC masked interrupt status (when the I3C acts as target)

Bit 30 DEFMIS : DEFTGTS CCC masked interrupt status (when the I3C acts as target)

Bit 29 INTUPDMIS : ENEC/DISEC CCC masked interrupt status (when the I3C acts as target)

Bit 28 ASUPDMIS : ENTASx CCC masked interrupt status (when the I3C acts as target)

Bit 27 RSTMIS : reset pattern masked interrupt status (when the I3C acts as target)

Bit 26 MRLUPDMIS : SETMRL CCC masked interrupt status (when the I3C acts as target)

Bit 25 MWLUPDMIS : SETMWL CCC masked interrupt status (when the I3C acts as target)

Bit 24 DAUPDMIS : ENTDAAR/STDAAR/SETNEWDA CCC masked interrupt status (when the I3C acts as target)

  1. Bit 23 STAMIS : format 1 GETSTATUS CCC masked interrupt status (when the I3C acts as target)
  2. Bit 22 GETMIS : GETxxx CCC masked interrupt status, except GETSTATUS of format 1 (when the I3C acts as target)
  3. Bit 21 WKPMIS : Wake-up/missed start masked interrupt status (when the I3C acts as target)
  4. Bit 20 Reserved, must be kept at reset value.
  5. Bit 19 HJMIS : Hot-join masked interrupt status (when the I3C acts as controller)
  6. Bit 18 CRUPDMIS : Controller-role update masked interrupt status (when the I3C acts as target)
  7. Bit 17 CRMIS : Controller-role request masked interrupt status (when the I3C acts as controller)
  8. Bit 16 IBIENDMIS : IBI end masked interrupt status (when the I3C acts as target)
  9. Bit 15 IBIMIS : IBI request masked interrupt status (when the I3C acts as controller)
  10. Bits 14:12 Reserved, must be kept at reset value.
  11. Bit 11 ERRMIS : error masked interrupt status (whatever the I3C acts as controller/target)
  12. Bit 10 RXTGTENDMIS : target-initiated read end masked interrupt status (when the I3C acts as controller)
  13. Bit 9 FCMIS : frame complete masked interrupt status (whatever the I3C acts as controller/target)
  14. Bits 8:6 Reserved, must be kept at reset value.
  15. Bit 5 RXFNEMIS : RX-FIFO not empty masked interrupt status (whatever the I3C acts as controller/target)
  16. Bit 4 TXFNFMIS : TX-FIFO not full masked interrupt status (whatever the I3C acts as controller/target)
  17. Bit 3 SFNEMIS : S-FIFO not empty masked interrupt status (when the I3C acts as controller)
  18. Bit 2 CFNFMIS : C-FIFO not full masked interrupt status (when the I3C acts as controller)
  19. Bits 1:0 Reserved, must be kept at reset value.

49.16.17 I3C own device characteristics register (I3C_DEVR0)

Address offset: 0x060

Reset value: 0x0000 0000

When the I3C peripheral acts as target, this register is used to write or read its own device characteristics.

When the I3C peripheral acts as controller, the field DA[6:0] is used to write and store its own dynamic address.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.RSTVALRSTACT[1:0]AS[1:0]HJENRes.CRENIBIEN
rrrrrr
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.DA[6:0]DAVAL
rr
  1. Bits 31:25 Reserved, must be kept at reset value.

Bit 24 RSTVAL : Reset action is valid (when the I3C acts as target)

This bit is asserted by hardware to indicate that the RSTACT[1:0] field has been updated on the reception of a broadcast or direct write RSTACT CCC (target reset action) and is valid.

This bit is cleared by hardware when the target receives a frame start.

When the device is not in Stop mode:

When in Stop mode, the corresponding interrupt can be used to wake up the device.

Bits 23:22 RSTACT[1:0] : Reset action/level on received reset pattern (when the I3C acts as target)

This read field is used by hardware on the reception of a direct read RSTACT CCC in order to return the corresponding data byte on the I3C bus.

This read field is updated by hardware on the reception of a broadcast or direct write RSTACT CCC (target reset action).

Only the defining bytes 0x00, 0x01 and 0x02 are mapped, and RSTACT[1:0] = Defining Byte[1:0].

00: no reset action

01: first level of reset: the application software must either:

  1. a) partially reset the I3C peripheral, by a write and clear of the enable bit of the I3C configuration register (write EN = 0). This resets the I3C bus interface and the I3C kernel sub-parts, without modifying the content of the I3C APB registers (except the EN bit).
  2. b) fully reset the I3C peripheral, including all its registers, via a write and set of the I3C reset control bit of the RCC (reset and clock controller) register.

10: second level of reset: the application software must issue a warm reset, also known as a system reset:

11: no reset action

Bits 21:20 AS[1:0] : Activity state (when the I3C acts as target)

This read field is updated by hardware on the reception of a ENTASx CCC (enter activity state, with x = 0-3):

00: activity state 0

01: activity state 1

10: activity state 2

11: activity state 3

Bit 19 HJEN : Hot-join request enable (when the I3C acts as target)

This bit is initially written by software when EN = 0, and is updated by hardware on the reception of DISEC CCC with DISHJ= 1 (cleared) and the reception of ENEC CCC with ENHJ= 1 (set). This bit can only be written by software when EN = 0 in the I3C_CFGR register.

0: hot-join request disabled

1: hot-join request enabled

Bit 18 Reserved, must be kept at reset value.

Bit 17 CREN : Controller-role request enable (when the I3C acts as target)

This bit is initially written by software when EN = 0, and is updated by hardware on the reception of DISEC CCC with DISCR = 1 (cleared) and the reception of ENEC CCC with ENCR = 1 (set). This bit can only be written by software when EN = 0 in the I3C_CFGR register.

0: controller-role request disabled

1: controller-role request enabled

Bit 16 IBIEN : IBI request enable (when the I3C acts as target)

This bit is initially written by software when EN = 0, and is updated by hardware on the reception of DISEC CCC with DISINT = 1 (cleared) and the reception of ENEC CCC with ENINT = 1 (set). This bit can only be written by software when EN = 0 in the I3C_CFGR register.

0: IBI request disabled

1: IBI request enabled

Bits 15:8 Reserved, must be kept at reset value.

Bits 7:1 DA[6:0] : 7-bit dynamic address

When the I3C acts as controller, this field can be written by software, for defining its own dynamic address.

When the I3C acts as target, this field is updated by hardware on the reception of either the broadcast ENTDAA CCC or the direct SETNEWDA CCC.

Bit 0 DAVAL : Dynamic address is valid (when the I3C acts as target)

When the I3C acts as controller, this bit can be written by software, for validating its own dynamic address, for example before a controller-role hand-off.

When the I3C acts as target, this bit is asserted by hardware on the acknowledge of the broadcast ENTDAA CCC or the direct SETNEWDA CCC, and this field is cleared by hardware on the acknowledge of the broadcast RSTDAA CCC.

49.16.18 I3C device x characteristics register (I3C_DEVRx)

Address offset: 0x060 + 0x4 * x, (x = 1 to 4)

Reset value: 0x0000 0000

When the I3C peripheral acts as controller, this register is used to define and store some characteristics of a device target x with their related management from the controller, to communicate accordingly with any of this target x over the I3C bus. Then, the hardware can autonomously identify and acknowledge an allowed IBI or/and controller-role request from a target x, receive the expected IBI payload data if any, and notify the software via the corresponding flag IBIF/CRF (and the corresponding interrupt if enabled) in the I3C_EVR register.

31302928272625242322212019181716
DISRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.SUSPIBIDENCRACKIBIACK
rrwrwrwrw
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.DA[6:0]Res.
rwrwrwrwrwrwrw

Bit 31 DIS : Disables writes to DA[6:0] (when the I3C acts as controller)

When the I3C acts as controller, once the software sets IBIACK= 1 or CRACK= 1, this read bit is set by hardware (DIS= 1) to lock the configured DA[6:0] and IBIDEN values.

Then, to be able to modify DA[6:0], IBIDEN or SUSP, the software must wait for DIS to be de-asserted by hardware (polling on DIS= 0) before modifying these three assigned values to the target x. Indeed, the target can request an IBI or a controller-role while the controller intends to modify DA[6:0], IBIDEN or SUSP.

0: write to DA[7:0] and to IBIDEN in the I3C_DEVRx register is allowed

1: write to DA[7:0] and to IBIDEN is disabled/locked

Bits 30:20 Reserved, must be kept at reset value.

Bit 19 SUSP : Suspend/stop I3C transfer on received IBI (when the I3C acts as controller)

When the I3C acts as controller, this bit can be used to receive an IBI from target x with pending read notification feature (received MDB[7:5] = 3'b101).

If this bit is set, when an IBI is received and completed (IBIF = 1 in the I3C_EVR register), a stop is emitted on the I3C bus and both C-FIFO and TX-FIFO are automatically flushed by hardware. The controller execution flow is stopped, even if a next control message is programmed. When the IBI is completed, the controller software can issue a new control word, such as a private read, to the target device that initiated the IBI request.

0: C-FIFO and TX-FIFO are not flushed after an IBI request from target x is acknowledged and completed, and depending on the presence or absence of a next control word, a repeated start or a stop is emitted

1: I3C transfer is stopped and both C-FIFO and TX-FIFO are flushed after receiving an IBI request from target x

Bit 18 IBIDEN : IBI data enable (when the I3C acts as controller)

When the I3C acts as controller, this bit must be written by software to store the BCR[2] bit as received from the target x during broadcast ENTDAA or direct GETBCR CCC via the received I3C_RDR.

Writing to this field has no impact when the DIS = 1 in the I3C_DEVRx register.

0: no data byte follows the acknowledged IBI from target x

1: the mandatory data byte MDB[7:0] follows the acknowledged IBI from target x

Bit 17 CRACK : Controller-role request acknowledge (when the I3C acts as controller)

When the I3C acts as controller, this bit is written by software to define the acknowledge policy to be applied on the I3C bus on the reception of a controller-role request from target x:

0: a controller-role request from target x must be NACK-ed

After the NACK, the message continues as initially programmed (the target is aware of the NACK and can emit another controller-role request later on)

1: a controller-role request (with 7-bit dynamic address DA[6:0]) from target x must be ACKed

- The field DIS is asserted by hardware to protect DA[6:0] from being modified by software meanwhile the hardware can store internally the current DA[6:0] into the kernel clock domain.

- After the ACK, the message continues as initially programmed. The software is notified by the controller-role request flag (CRF = 1 in the I3C_EVR register) and/or the corresponding interrupt if enabled; For effectively granting the controller-role to the requesting secondary controller, software must issue a GETACCCR (formerly known as GETACCMST), followed by a stop.

- Independently of CRACK configuration for this or other devices, further controller-role request(s) are NACK-ed until controller-role request flag (CRF) and IBI flag (IBIF) in the I3C_EVR register are both cleared.

Bit 16 IBIACK : IBI request acknowledge (when the I3C acts as controller)

When the I3C acts as controller, this bit is written by software to define the acknowledge policy to be applied on the I3C bus on the reception of an IBI request from target x:

0: an IBI request from target x must be NACK-ed

1: an IBI request (with 7-bit dynamic address DA[6:0]) from target x must be ACKed

Bits 15:8 Reserved, must be kept at reset value.

Bits 7:1 DA[6:0] : Assigned I3C dynamic address to target x (when the I3C acts as controller)

When the I3C acts as controller, this field must be written by software to store the 7-bit dynamic address that the controller sends via a broadcast ENTDAA or a direct SETNEWDA CCC acknowledged by the target x.

Writing to this field has no impact when the read field DIS = 1 in the I3C_DEVRx register.

Bit 0 Reserved, must be kept at reset value.

49.16.19 I3C maximum read length register (I3C_MAXRLR)

Address offset: 0x090

Reset value: 0x0000 0000

When the I3C acts as target, this register is used to set or get the maximum read length value exchanged with the controller during respectively GETMRL or SETMRL CCC. This register is also used to set the IBI data payload size.

This register can be written by the software when EN = 0 in the I3C_CFGR register.

When receiving a private read message, the target ends the data transmission (by driving T-bit = 0) when the count of transmitted data reaches MRL[15:0] in the I3C_MAXRLR register.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.IBIP[2:0]
rwrwrw
1514131211109876543210
MRL[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:19 Reserved, must be kept at reset value.

Bits 18:16 IBIP[2:0] : IBI payload data maximum size, in bytes (when I3C acts as target)

This field is initially written by software when EN = 0 to set the maximum number of data bytes to be sent to the controller after an IBI request has been acknowledged. This field can be updated by hardware on the reception of SETMRL command (which potentially also updated IBIP[2:0]).

Software is notified of an MRL update by MRLUPF in the I3C_EVR register and the corresponding interrupt, if enabled.

000: null payload data size (only allowed when BCR2 = 0 in the I3C_BCR register)

001: 1 byte (mandatory data byte MDB[7:0])

010: 2 bytes (including first MDB[7:0])

011: 3 bytes (including first MDB[7:0])

100: 4 bytes (including first MDB[7:0])

others: same as 100

Bits 15:0 MRL[15:0] : Maximum data read length (when I3C acts as target)

This field is initially written by software when EN = 0 and updated by hardware on the reception of SETMRL command (with potentially also updated IBIP[2:0]).

Software is notified of an MRL update by MRLUPF and the corresponding interrupt, if enabled.

This field is used by hardware to return the value on the I3C bus when the target receives a GETMRL CCC.

49.16.20 I3C maximum write length register (I3C_MAXWLR)

Address offset: 0x094

Reset value: 0x0000 0000

When the I3C acts as target, this register is used to set or get the maximum write length value exchanged with the controller during respectively GETMWL or SETMWL CCC.

This register can be written by the software when EN = 0 in the I3C_CFGR register.

On receiving a private write message, the target stops the data reception (extra received data are not written into RX-FIFO) when the count of received data reaches MWL[15:0] in the I3C_MAXWLR register.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
MWL[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:16 Reserved, must be kept at reset value.

Bits 15:0 MWL[15:0] : Maximum data write length (when I3C acts as target)

This field is initially written by software when EN = 0 and updated by hardware on the reception of SETMWL command.

Software is notified of an MWL update by MWLUPF in the I3C_EVR register and the corresponding interrupt, if enabled.

This field is used by hardware to return the value on the I3C bus when the target receives a GETMWL CCC.

49.16.21 I3C timing register 0 (I3C_TIMINGR0)

Address offset: 0x0A0

Reset value: 0x0000 0000

When the I3C acts as controller, this register is used to configure the SCL clock signal waveform.

This register can be written by the software when EN = 0 in the I3C_CFGR register.

31302928272625242322212019181716
SCLH_I2C[7:0]SCLL_OD[7:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
SCLH_I3C[7:0]SCLL_PP[7:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:24 SCLH_I2C[7:0] : SCL high duration, used for legacy I 2 C messages, in number of kernel clocks cycles:

\[ t_{SCLH\_I2C} = (SCLH\_I2C + 1) \times t_{I3CCLK} \]

Note: SCLH_I2C is used to generate \( t_{DIG\_H} \) (I 2 C) timing when communicating with I 2 C devices.

Note: With I 2 C Fm+ device \( t_{DIG\_Hmin} = 260 \) ns, with I 2 C Fm+ device \( t_{DIG\_Hmin} = 600 \) ns.

Bits 23:16 SCLL_OD[7:0] : SCL low duration in open-drain phases, used for legacy I 2 C messages and for I3C open-drain phases (address phase following a start, ACK phase during controller-initiated messages, and T bit phase during direct/private/IBI payload), in number of kernel clocks cycles:

\[ t_{SCLL\_OD} = (SCLL\_OD + 1) \times t_{I3CCLK} \]

Note: SCLL_OD is used to generate both \( t_{DIG\_L} \) (I 2 C) and \( t_{DIG\_OD\_L} \) (I3C) timings.

Note: With I 2 C Fm+ device \( t_{DIG\_Lmin} = 500 \) ns, with I 2 C Fm device \( t_{DIG\_Lmin} = 1320 \) ns.

Note: I3C messages: \( t_{DIG\_OD\_Lmin} = 200 \) ns.

Note: If a single I3C frame is gathering I 2 C and I3C messages, the SCL low duration during I3C open-drain phases is increased to fit I 2 C timings.

Bits 15:8 SCLH_I3C[7:0] : SCL high duration, used for I3C messages (both in push-pull and open-drain phases), in number of kernel clocks cycles:

\[ t_{SCLH\_I3C} = (SCLH\_I3C + 1) \times t_{I3CCLK} \]

Note: SCLH_I3C is used to generate both \( t_{DIG\_H} \) (I3C) and \( t_{DIG\_H\_MIXED} \) timings.

Note: For mixed bus (with at least one I 2 C target): \( t_{DIG\_H\_MIXEDmin} = 32 \) ns and \( t_{DIG\_H\_MIXEDmax} = 45 \) ns (due to I 2 C 50 ns spike filter).

Note: For pure I3C bus (with no I 2 C targets): \( t_{DIG\_Hmin} = 32 \) ns.

Bits 7:0 SCLL_PP[7:0] : SCL low duration in I3C push-pull phases, in number of kernel clocks cycles:

\[ t_{SCLL\_PP} = (SCLL\_PP + 1) \times t_{I3CCLK} \]

Note: SCLL_PP is used to generate \( t_{DIG\_L} \) (I3C in PP) timing.

Note: \( t_{DIG\_Lmin} = 32 \) ns (max 40/60 duty cycle at 12.5 MHz).

49.16.22 I3C timing register 1 (I3C_TIMINGR1)

Address offset: 0x0A4

Reset value: 0x0000 0000

When the I3C acts as controller, this register is used to configure some I3C timing settings.

When the I3C acts as target and is controller-capable, this register is used to configure a timing for the controller-role hand-off procedure.

This register can be written by the software when EN = 0 in the I3C_CFGR register.

31302928272625242322212019181716
Res.Res.SDA_HD[1:0]Res.Res.Res.Res.Res.FREE[6:0]
rwrwrwrwrwrwrwrwrw

1514131211109876543210
Res.Res.Res.Res.Res.Res.ASNCR[1:0]AVAL[7:0]
rwrwrwrwrwrwrwrwrwrw

Bits 31:30 Reserved, must be kept at reset value.

Bits 29:28 SDA_HD[1:0] : SDA hold time (when the I3C acts as controller), in number of kernel clocks cycles (refer to MIPI timing SDA hold time in push-pull \( t_{HD\_PP} \) ):

\[ \text{SDA hold time} = (\text{SDA\_HD}[1:0] + 0.5) \times t_{I3CCLK} \]

Note: when controller: \( t_{HD\_PPmin} = \min(t_{CR}, t_{CF}) + 3 \text{ ns} \) .

Bits 27:23 Reserved, must be kept at reset value.

Bits 22:16 FREE[6:0] : Number of kernel clocks cycles that is used to set some MIPI timings like bus free condition time (when the I3C acts as controller)

When the I3C acts as controller:

  1. for I3C start timing: it must wait for (bus free condition) time to be elapsed after a stop and before a start, refer to MIPI timings (I3C) \( t_{CAS} \) and ( \( I^2C \) ) \( t_{BUF} \) . These timings are defined by: \( t_{BUF} = t_{CAS} = [(FREE[6:0] + 1) \times 2 - (0.5 + SDA\_HD[1:0])] \times t_{I3CCLK} \)

Note: For pure I3C bus: \( t_{CASmin} = 38.4 \text{ ns} \) , and \( t_{CASmax} = 1 \mu\text{s} \) , \( 100 \mu\text{s} \) , \( 2 \text{ ms} \) , \( 50 \text{ ms} \) for, respectively, ENTAS0, 1, 2, and 3.

Note: For mixed bus with \( I^2C Fm+ \) device \( t_{BUFmin} = 0.5 \mu\text{s} \) , for mixed bus with \( I^2C Fm \) device \( t_{BUFmin} = 1.3 \mu\text{s} \) .

  1. for I3C repeated start timing: must wait for time to be elapsed after a repeated start (SDA is de-asserted) and before driving SCL low, refer to MIPI timing \( t_{CASr} \) . This timing is defined by: \( t_{CASr} = [(FREE[6:0] + 1) \times 2 - (0.5 + SDA\_HD[1:0])] \times t_{I3CCLK} \) .

Note: \( t_{CASr, min} = 19.2 \text{ ns} \) .

  1. for I3C stop timing: must wait for time to be elapsed after that the SCL clock is driven high, and before the stop condition (SDA is asserted). This timing is defined by: \( t_{CBP} = (FREE[6:0] + 1) \times t_{I3CCLK} \) .

Note: \( t_{CBPmin} = 19.2 \text{ ns} \) .

  1. for I3C repeated start timing (T-bit when controller ends read with repeated start followed by stop): must wait for time to be elapsed after that the SCL clock is driven high, and before the repeated start condition (SDA is de-asserted). This timing is defined by: \( t_{CBSr} = (FREE[6:0] + 1) \times t_{I3CCLK} \) .

Note: \( t_{CBSr, min} = 19.2 \text{ ns} \) .

Bits 15:10 Reserved, must be kept at reset value.

Bits 9:8 ASNCR[1:0] : Activity state of the new controller (when I3C acts as active controller)

This field indicates the time to wait before being accessed as new target, refer AVAL[7:0].

This field can be modified only when the I3C acts as controller.

Bits 7:0 AVAL[7:0] : Number of kernel clock cycles to set a time unit of 1 µs, whatever I3C acts as controller or target.

This time unit is then used by the hardware to build some internal timers, corresponding to the following MIPI I3C timings:

When the I3C acts as target:

  1. 1. for bus available condition time: it must wait for (bus available condition) time to be elapsed after a stop and before issuing a start request for an IBI or a controller-role request (bus free condition is sustained for at least \( t_{\text{AVAL}} \) ). Refer to MIPI timing \( t_{\text{AVAL}} = 1 \mu\text{s} \) . This timing is defined by: \( t_{\text{AVAL}} = (\text{AVAL}[7:0] + 2) \times t_{\text{I3CCLK}} \)
  2. 2. for bus idle condition time: it must wait for (bus idle condition) time to be elapsed after that both SDA and SCL are continuously high and stable before issuing a hot-join event. Refer to MIPI v1.1 timing \( t_{\text{IDLE}} = 200 \mu\text{s} \) . This timing is defined by: \( t_{\text{IDLE}} = (\text{AVAL}[7:0] + 2) \times 200 \times t_{\text{I3CCLK}} \)

When the I3C acts as controller, it cannot stall the clock beyond a maximum stall time (stall the SCL clock low), as follows:

  1. 1. on first bit of assigned address during dynamic address assignment: it cannot stall the clock beyond the MIPI timing \( t_{\text{STALLDAA}} = 15 \text{ ms} \) . This timing is defined by: \( t_{\text{STALLDAAmax}} = (\text{AVAL}[7:0] + 1) \times 15000 \times t_{\text{I3CCLK}} \)
  2. 2. on ACK/NACK phase of I3C/I 2 C transfer, on parity bit of write data transfer, on transition bit of I3C read transfer: it cannot stall the clock beyond the MIPI timing \( t_{\text{STALL}} = 100 \mu\text{s} \) . This timing is defined by: \( t_{\text{STALLmax}} = (\text{AVAL}[7:0] + 1) \times 100 \times t_{\text{I3CCLK}} \)

Whatever the I3C acts as controller or as (controller-capable) target, during a controller-role hand-off procedure:

  1. 1. The new controller must wait for \( t_{\text{NEWCRLock}} \) before pulling SDA low (issuing a start) after a completed GETACCR CCC. Then the new controller, within \( t_{\text{CAS}} \) , can pull SCL low to activate SCL clock. The active controller must wait for the same \( t_{\text{NEWCRLock}} \) time, or at least 100 µs, before testing if the new controller has gained control of the bus by pulling SDA low. The time to wait depends upon the value of ASNCR[1:0] in the I3C_TIMINGR1 register:
    • – ASNCR[1:0] = 00: \( t_{\text{NEWCRLock}} = (\text{AVAL}[7:0] + 1) \times t_{\text{I3CCLK}} \)
    • – ASNCR[1:0] = 01: \( t_{\text{NEWCRLock}} = (\text{AVAL}[7:0] + 1) \times 100 \times t_{\text{I3CCLK}} \)
    • – ASNCR[1:0] = 10: \( t_{\text{NEWCRLock}} = (\text{AVAL}[7:0] + 1) \times 2000 \times t_{\text{I3CCLK}} \)
    • – ASNCR[1:0] = 11: \( t_{\text{NEWCRLock}} = (\text{AVAL}[7:0] + 1) \times 50000 \times t_{\text{I3CCLK}} \)

49.16.23 I3C timing register 2 (I3C_TIMINGR2)

Address offset: 0x0A8

Reset value: 0x0000 0000

When the I3C acts as controller, this register is used to configure and enable SCL clock stalling, to enable SCL clock low stalling, if needed by the addressed I3C or legacy I 2 C target(s).

This register can be written only when the I3C acts as controller.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
STALL[7:0]Res.STALLLSTALLSSTALLRSTALLASTALLCSTALLDSTALLT
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:16 Reserved, must be kept at reset value.

Bits 15:8 STALL[7:0] : Controller clock stall time, in number of kernel clock cycles

\[ t_{SCL\_STALL} = \text{STALL} \times t_{I3CCLK} \]

Bit 7 Reserved, must be kept at reset value.

Bit 6 STALLL : Controller clock stall enable in the address ACK/NACK phase (before the ninth bit) of a legacy I 2 C read/write message. This allows the I 2 C target to prepare the next data byte to send/receive.

0: no stall

1: stall enabled

Bit 5 STALLS : Controller clock stall enable in the data ACK/NACK phase of a legacy I 2 C write message. This allows the I 2 C target to prepare the next data byte to receive.

0: no stall

1: stall enabled

Bit 4 STALLR : Controller clock stall enable in the data ACK/NACK phase of a legacy I 2 C read message. This allows the I 2 C target to prepare the next data byte to send.

0: no stall

1: stall enabled

Bit 3 STALLA : Controller clock stall enable on ACK phase

The SCL is stalled (during \( t_{SCL\_STALL} \) as defined by STALL) in the address ACK/NACK phase (before the ninth bit). This allows the target to prepare data. The ACK driven by the controller itself on a target-initiated request (IBI/HJ/CR) is not impacted by this control bit.

0: no stall

1: stall enabled

Bit 2 STALLC : Controller clock stall enable on PAR phase of CCC

The SCL is stalled during \( \text{STALL} \times t_{SCL\_PP} \) in the T-bit phase of common command code (before the ninth bit). This allows the target to decode the command.

0: no stall

1: stall enabled

Note: \( t_{SCL\_PP} = (\text{I3C\_TIMINGR0.SCLL\_PP}[7:0] + 1) \times t_{I3CCLK} \)

Bit 1 STALLD : Controller clock stall enable on PAR phase of Data

The SCL is stalled during \( \text{STALL} \times t_{\text{SCLL\_PP}} \) in the T-bit phase (before the ninth bit). This allows the target to read received data.

0: no stall

1: stall enabled

Note: \( t_{\text{SCLL\_PP}} = (\text{I3C\_TIMINGR0.SCLL\_PP}[7:0] + 1) \times t_{\text{I3CCLK}} \)

Bit 0 STALLT : Controller clock stall enable on T-bit phase of data

The SCL is stalled during \( \text{STALL} \times t_{\text{SCLL\_PP}} \) in the T-bit phase (before the ninth bit). This allows the target to prepare the data to be sent.

0: no stall

1: stall enabled

Note: \( t_{\text{SCLL\_PP}} = (\text{I3C\_TIMINGR0.SCLL\_PP}[7:0] + 1) \times t_{\text{I3CCLK}} \)

49.16.24 I3C bus characteristics register (I3C_BCR)

Address offset: 0x0C0

Reset value: 0x0000 0000

When the I3C acts as target, this register is used to configure three bits used by hardware to return the data byte BCR[7:0] on reception of GETBCR or ENTDAA CCC. The returned byte BCR[7:0] on the I3C bus is then as follows:

This register can be written by software only when EN = 0 in the I3C_CFGGR register.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.Res.BCR6Res.Res.Res.BCR2Res.BCR0
rwrwrw

Bits 31:7 Reserved, must be kept at reset value.

Bit 6 BCR6 : Controller capable

0: I3C target (no controller capable)

1: I3C controller capable

Bits 5:3 Reserved, must be kept at reset value.

Bit 2 BCR2 : in-band interrupt (IBI) payload

0: no data byte follows the accepted IBI

1: at least one mandatory data byte follows the accepted IBI (and at most 4 data bytes)

Bit 1 Reserved, must be kept at reset value.

Bit 0 BCR0 : max data speed limitation

0: no limitation

1: limitation, as described by I3C_GETMXDSR.

49.16.25 I3C device characteristics register (I3C_DCR)

Address offset: 0x0C4

Reset value: 0x0000 0000

When the I3C acts as target, this register is used to configure the device characteristics ID, which is used by hardware to return the data byte DCR[7:0] on reception of GETDCR, ENTDAA, or DEFTGTS CCC.

This register can be written by software only when EN = 0 in the I3C_CFGR register.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.DCR[7:0]
rwrwrwrwrwrwrwrw

Bits 31:8 Reserved, must be kept at reset value.

Bits 7:0 DCR[7:0] : device characteristics ID

0x00: generic device (for v1.0 devices)

others: ID to describe the type of the I3C sensor/device

Note: The latest MIPI DCR ID assignments are available on https://www.mipi.org .

49.16.26 I3C get capability register (I3C_GETCAPR)

Address offset: 0x0C8

Reset value: 0x0000 0000

When the I3C acts as target, this register is used to set the IBI MDB support for pending read notification support, and is used by hardware to return the GETCAP3 byte on reception of GETCAPS CCC, format 1.

The returned byte GETCAP1[7:0] on the I3C bus is then as follows:

The returned byte GETCAP2[7:0] on the I3C bus is then as follows:

The returned byte GETCAP3[7:0] on the I3C bus is then as follows:

This register can be written by software only when EN = 0 in the I3C_CFGGR register.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.CAPP
END
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
rw

Bits 31:15 Reserved, must be kept at reset value.

Bit 14 CAPPEND : IBI MDB support for pending read notification

This bit is written by software during bus initialization (EN = 0), and indicates the support (or not) of the pending read notification via the IBI MDB[7:0] value.

This bit is used to return the GETCAP3 byte in response to the GETCAPS CCC format 1.

0: this I3C when acting as target sends an IBI request without a mandatory data byte value indicating a pending read notification

1: this I3C when acting as target sends an IBI request with a mandatory data byte value (MDB[7:5] = 101), indicating a pending read notification

Bits 13:0 Reserved, must be kept at reset value.

49.16.27 I3C controller-role capability register (I3C_CRCAPR)

Address offset: 0x0CC

Reset value: 0x0000 0000

When the I3C acts as target, this register is used to set features the I3C supports as a secondary controller after controller-role hand-off, and is used by hardware to return the CRCAP1 byte and the CRCAP2 byte on reception of GETCAPS CCC, format 2 with the defining byte CRCAPS (0x91).

The returned CRCAP1[7:0] on the I3C bus is then as follows:

The returned CRCAP2[7:0] on the I3C bus is then as follows:

This register can be written by software only when EN = 0 in the I3C_CFGFR register.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.Res.CAP
GRP
Res.Res.Res.Res.Res.CAP
DHOFF
Res.Res.Res.
rwrw

Bits 31:10 Reserved, must be kept at reset value.

Bit 9 CAPGRP : group management support (when acting as controller)

This bit is written by software during bus initialization (EN = 0), and indicates if the I3C is able to support group management when it acts as a controller (after controller-role hand-off) via emitted DEFGRPA, RSTGRPA, and SETGRPA CCC.

This bit is used to return the CRCAP1 byte in response to the GETCAPS CCC format 2.

0: this I3C does not support group address capabilities

1: this I3C supports group address capabilities (when becoming controller)

Bits 8:4 Reserved, must be kept at reset value.

Bit 3 CAPDHOFF : delayed controller-role hand-off

This bit is written by software during bus initialization (EN = 0), and indicates if this target I3C needs additional time to process a controller-role hand-off requested by the current controller. This bit is used to return the CRCAP2 byte in response to the GETCAPS CCC format 2.

0: this I3C does not need additional time to process a controller-role hand-off

1: this I3C needs additional time to process a controller-role hand-off

Bits 2:0 Reserved, must be kept at reset value.

49.16.28 I3C get max data speed register (I3C_GETMXDSR)

Address offset: 0x0D0

Reset value: 0x0000 0000

When the I3C acts as target, this register is used to set its capabilities and limitations if any. This register is used by hardware to return data byte(s) on reception of GETMXDS CCC, with format 1 (2 bytes, without maxRdTurn), format 2 (5 bytes, with MaxRdTurn), or format 3 (with defining byte WRRDTURN = 0x00: same 5 bytes as format 2, or with defining byte CRHDLY = 0x91: single byte CRHDLY1).

The returned byte MaxWr[7:0] on the I3C bus is then as follows:

The returned byte MaxRd[7:0] on the I3C bus is then as follows:

The returned 3-byte MaxRdTurn[23:0], if FMT[1:0] = 00 in the I3C_GETMXDSR register, on the I3C bus is then as follows:

The returned byte CRHDLY1[7:0] on the I3C bus is then as follows:

This register can be written by software only when EN = 0 in the I3C_CFGR register.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.TSCORDTURN[7:0]
rwrwrwrwrwrwrwrwrw
1514131211109876543210
Res.Res.Res.Res.Res.Res.FMT[1:0]Res.Res.Res.Res.Res.Res.HOFFAS[1:0]
rwrwrwrw

Bits 31:25 Reserved, must be kept at reset value.

Bit 24 TSCO : clock-to-data turnaround time ( \( t_{SCO} \) )

This bit is written by software during bus initialization (EN = 0 in the I3C_CFGR register) and is used to specify the clock-to-data turnaround time \( t_{SCO} \) (vs. the value of 12 ns). This bit is used by the hardware in response to the GETMXDS CCC to return the encoded clock-to-data turnaround time via the returned MaxRd[5:3] bits.

0: \( t_{SCO} \leq 12 \) ns

1: \( t_{SCO} > 12 \) ns (refer to the datasheet for more details)

Bits 23:16 RDTURN[7:0] : programmed byte of the 3-byte MaxRdTurn (maximum read turnaround byte)

This bit is written by software during bus initialization (EN = 0) and writes the value of the selected byte (via the FMT[1:0] field) of the 3-byte MaxRdTurn, which is returned in response to the GETMXDS CCC format 2 to encode the maximum read turnaround time.

Bits 15:10 Reserved, must be kept at reset value.

Bits 9:8 FMT[1:0] : GETMXDS CCC format

This field is written by software during bus initialization (EN = 0) and indicates how is returned the GETMXDS format 1 (without MaxRdTurn) and format 2 (with MaxRdTurn).

This field is used to return the 2-byte format 1 (MaxWr, MaxRd) or 5-byte format 2 (MaxWr, MaxRd, 3-byte MaxRdTurn) byte in response to the GETCAPS CCC.

00: format 1 (2 bytes with MaxWr with no defining byte, MaxRd)

01: format 2 (5 bytes with MaxWr with no defining byte, MaxRd, MaxRdTurn)

10: format 2 (5 bytes with MaxWr with no defining byte, MaxRd, and middle byte of MaxRdTurn)

11: format 2 (5 bytes with MaxWr with no defining byte, MaxRd, MSB of MaxRdTurn)

Bits 7:2 Reserved, must be kept at reset value.

Bits 1:0 HOFFAS[1:0] : Controller hand-off activity state

This field is written by software during bus initialization (EN = 0), and indicates in which initial activity state the (other) current controller must expect the I3C bus after a controller-role hand-off to this controller-capable I3C, when returning the defining byte CRHDLY (0x91) to a GETMXDS CCC.

This 2-bit field is used to return the CRHDLY1 byte in response to the GETCAPS CCC format 3, to state the activity state of this I3C when becoming controller after a controller-role hand-off, and consequently the time the former controller must wait before testing this I3C to be confirmed its ownership.

00: activity state 0 is the initial activity state of this I3C before and when becoming controller

01: activity state 1 is the initial activity state of this I3C when becoming controller

10: activity state 2 is the initial activity state of this I3C when becoming controller

11: activity state 3 is the initial activity state of this I3C when becoming controller

49.16.29 I3C extended provisioned ID register (I3C_EPIDR)

Address offset: 0xD4

Reset value: 0x0208 0000

When the I3C acts as target, this register is used to set the 4-bit MIPI instance ID by software, and some other constant bits used for the 48-bit provisioned ID. It is also used by hardware to return the six bytes for the 48-bit provisioned ID on reception of GETPID and ENTDAA CCC.

The 48-bit provisioned ID on the I3C bus is then returned as:

This register can be written by software only when EN = 0 in the I3C_CFGR register.

31302928272625242322212019181716
MIPIMID[14:0]IDTSEL
rrrrrrrrrrrrrrrr
1514131211109876543210
MIPIID[3:0]Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
rwrwrwrw

Bits 31:17 MIPIMID[14:0] : 15-bit MIPI manufacturer ID

This read field is the 15-bit STMicroelectronics MIPI ID (0x0104).

This field represents bits[47:33] of the 48-bit provisioned ID.

Bit 16 IDTSEL : provisioned ID type selector

This field is set as 0 (vendor fixed value).

This field represents bit[32] of the 48-bit provisioned ID.

Note: Bits[31:16] of the provisioned ID can be 0.

Bits 15:12 MIPIID[3:0] : 4-bit MIPI Instance ID

This field is written by software to set and identify individually each instance of this I3C IP with a specific number on a single I3C bus.

This field represents bits[15:12] of the 48-bit provisioned ID.

Note: Bits[11:0] of the provisioned ID can be 0.

Bits 11:0 Reserved, must be kept at reset value.

49.16.30 I3C register map

Table 536. I3C register map and reset values

OffsetRegister name313029282726252423222120191817161514131211109876543210
0x000I3C_CRMENDMTYPE[3:0]Res.Res.Res.ADD[6:0]
CCC[7:0]
RNWDCNT[15:0]
Reset value00000000000000000000000000000
0x004I3C_CFGRRes.TSFSETTRIGHWENTRIGPOLTRIGSEL [3:0]Res.FCFDISCFLUSHCDMAENTMODESMODESFLUSHSDMAENRes.TXHRESTXFLUSHTXDMAENRes.RXHRESRXFLUSHRXDMAENHJACKRes.HKSDAENEXITPTRNRSTPTRNNOARBHCRINITEN
Reset value000000000000000000000000000
0x010I3C_RDRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.RDB0[7:0]
Reset value00000000
0x014I3C_RDWRRDB3[7:0]RDB2[7:0]RDB1[7:0]RDB0[7:0]
Reset value00000000000000000000000000000000
0x018I3C_TDRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.TDB0[7:0]
Reset value00000000
0x01CI3C_TDWRTDB3[7:0]TDB2[7:0]TDB1[7:0]TDB0[7:0]
Reset value00000000000000000000000000000000
0x020I3C_IBIDRIBIDB3[7:0]IBIDB2[7:0]IBIDB1[7:0]IBIDB0[7:0]
Reset value00000000000000000000000000000000
0x024I3C_TGTTDRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PRELOADTGTTDCNT[15:0]
Reset value00000000000000000
0x030I3C_SRMID[7:0]Res.Res.Res.Res.DIRABTRes.XDCNT[15:0]
Reset value00
0x034I3C_SERRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.DERRDNACKANACKCOVRDOVRSTALLPERRCODERR[3:0]
Reset value0000000
0x040I3C_RMRRes.Res.Res.Res.Res.Res.Res.Res.RADD[6:0]Res.RCODE[7:0]Res.Res.Res.Res.Res.IBIRDCNT[2:0]
Reset value000000000000000000

Table 536. I3C register map and reset values (continued)

OffsetRegister name313029282726252423222120191817161514131211109876543210
0x050I3C_EVRGRPFDEFFINTUPDFASUPDFRSTFMRLUPDFMWLUPDFDAUPDFSTAFGETFWKPFRes.HJFCRUPDFCRFIBIENDFIBIFRes.Res.Res.ERRFRXTGTENDFFCFRes.Res.RXLASTFTXLASTFRXFNEFTXFNEFSFNEFCFNEFTXFEFCFEF
Reset value000000000000000000000000011
0x054I3C_IERGRPIEDEFIEINTUPDIEASUPDIERSTIEMRLUPDIEMWLUPDIEDAUPDIESTAIEGETIEWKPIERes.HJIECRUPDIECRIEIBIENDIEIBIIERes.Res.Res.ERRIERXTGTENDIEFCIERes.Res.Res.Res.RXFNEIETXFNEIESFNEIECFNEIERes.Res.
Reset value00000000000000000000000
0x058I3C_CEVRCGRPFCDEFFCINTUPDFCASUPDFCRSTFCMRLUPDFCMWLUPDFCDAUPDFCSTAFCGETFCWKPFRes.CHJFCRRUPDFCCRFCIBIENDFCIBIFRes.Res.Res.CERRFCRXTGTENDFCFCFRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.
Reset value0000000000000000000
0x05CI3C_MISRGRPMISDEFMISINTUPDMISASUPDMISRSTMISMRLUPDMISMWLUPDMISDAUPDMISSTMISGETMISWKPMISRes.HJMISCRUPDMISCRMISIBIENDMISIBIMISRes.Res.Res.ERRMISRXTGTENDMISFCMISRes.Res.Res.Res.RXFNEISTXFNEISSFNEISCFNEISRes.Res.
Reset value00000000000000000000000
0x060I3C_DEVR0Res.Res.Res.Res.Res.Res.Res.Res.RSTVALRSTACT [1:0]AS [1:0]HJENRes.CRENIBIENRes.Res.Res.Res.Res.Res.Res.Res.DA[6:0]
Reset value000000000000000
0x060 + 4 * x,
(x = 1 to 4)
I3C_DEVRxDISRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.SUSPIBIDENCRACKIBIACKRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.DA[6:0]
Reset value000000000000
0x090I3C_MAXRLRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.IBIP [2:0]MRL[15:0]
Reset value000000000000000000
0x094I3C_MAXWLRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.MWL[15:0]
Reset value0000000000000000
0x0A0I3C_TIMINGR0SCLH_I2C[7:0]SCLL_OD[7:0]SCLH_I3C[7:0]SCLL_PP[7:0]
Reset value00000000000000000000000000000000
0x0A4I3C_TIMINGR1Res.Res.SDA_HDRes.Res.Res.Res.Res.Res.FREE[6:0]Res.Res.Res.Res.Res.Res.ASNCR[1:0]AVAL[7:0]
Reset value0000000000000000000
0x0A8I3C_TIMINGR2Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.AVAL[7:0]Res.STALL LSTALL SSTALL RSTALL ASTALL CSTALL DSTALL T
Reset value000000000000000

Table 536. I3C register map and reset values (continued)

OffsetRegister name313029282726252423222120191817161514131211109876543210
0x0C0I3C_BCRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.BCR6Res.Res.Res.BCR2Res.BCR0
Reset value000
0x0C4I3C_DCRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.DCR[7:0]
Reset value00000000
0x0C8I3C_GETCAPRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.CAPPENDRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
Reset value0
0x0CCI3C_CRCAPRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.CAPGRRes.Res.Res.Res.Res.Res.CAPDHOFFRes.Res.Res.
Reset value00
0x0D0I3C_GETMXDSRRes.Res.Res.Res.Res.Res.Res.TSCORDTURN[7:0]Res.Res.Res.Res.Res.Res.FMT[1:0]Res.Res.Res.Res.Res.Res.Res.HOFFAS [1:0]
Reset value0000000000000
0x0D4I3C_EPIDRMIPIMID[14:0]IDTSELMIPIID[3:0]Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
Reset value0000001000001000000000

Refer to Section 2.3: Memory organization for the register boundary addresses.