Mipi I3C interface, NXP P3T1755DP/Q900Z temperature sensor (Part 2)

In our previous I3C article we have shown the setup used for this I3C introductory series using the Raspberry Pico 2 and the Sparkfun Logic Analyzer to illustrate the I3C transactions with the sigrok I3C decoder.

The second I3C command used in this series was the following,

digikey_coffee_cup #> i3c_rstdaa                                                                    
OK(0) 

The Sparkfun Logic Analyzer captured the RSTDAA I3C command (This will remove any I3C address in the bus if previously assigned),

In this snapshot we can see the transition from open drain to push pull mode in the I3C bus. Those small pulses in the SCL line are very short pulses used in the standard as way to isolate the I2C legacy protocol devices from the I3C devices since these have an internal filter for this purpose. Also the broadcast address 0x7E emitted is captured in the bus.

The next command used is the I2C scan address to identify I2C mode devices in the line which in this case is,

digikey_coffee_cup #>i2c_scan
OK(0),0x48

This performs a classic I2C address scan in the bus.

The NXP P3T1755DP/Q900Z temperature sensor has a I2C slave address of 0x48. This is seen in the zoomed are of the previous capture,

Now issue the I3C_scan command,

digikey_coffee_cup #>i3c_scan
OK(0),0x00,0x48,0x7e

There is the I2C slave address identified previously as 0x48. At this point proceed to send the following I3C_ENTDAA command,

digikey_coffee_cup #> i3c_entdaa 0x21
OK(0),0x02,0x36,0x15,0x2a,0x00,0x90,0x03,0x63

This command enter controller initiation of I3C target dynamic address assignment process as 0x21. The I3C slave does not participate if the target already has an address assigned. Now that we have assigned the I3C address to the slave, we can verify it has been assigned properly using the following command,

digikey_coffee_cup #> i3c_scan                                                                                                                    
OK(0),0x21,0x7e 

Now the Raspberry Pico 2 via the minicom terminal has confirmed the successful I3C dynamic assignment as 0x21. (0x7E is a broadcast address)

At this point we can read the NXP P3T1755DP/Q900Z temperature sensor I3C Provisional-ID field which is a 6-byte read-only (48 bits) word with this information:

• 15 bits with the manufacturer name, unique per manufacturer (for example, NXP)
• 1 bit indicating whether the device has a random ID or a structured Provisional-ID
• 16 bits with the device identification, assigned by manufacturer
• 4 bits providing the device instantiation information (for example, the address pin binary input)
• 12 bits with the device revision, assigned by NXP the manufacturer

The exact Mipi-I3C Provisional-ID composition is shown in Table 5 and Table 6 with detailed data content in the NXP P3T1755DP/Q900Z temperature sensor datasheet.

In order to read this I3C provisional ID perform a SDR CCC Direct Read command at address 0x8D (Bus characterization register (BCR) address in Table 9)

and read those 6 bytes from BCR address 0x8D from the I3C slave with address 0x21 as follows,

digikey_coffee_cup #> i3c_sdr_ccc_direct_read 0x21 0x8d 6                                                                                         
OK(0),0x02,0x36,0x15,0x2a,0x00,0x90   

The 6 bytes 0x02,0x36,0x15,0x2a,0x00,0x90 I3C received data, matches the device I3C provisional ID (48 bits) per previous tables in the NXP P3T1755DP/Q900Z temperature sensor specification therefore confirming a successful I3C transaction from the Raspberry Pico 2 via I3C.

In our next article we will show how to read the temperature via I3C from the NXP P3T1755DP/Q900Z temperature sensor.

Have a great day!

This article is avaialble in spanish here.

Este artículo está disponible en español aquí.

1 Like