28. Inter-integrated circuit interface (I2C)

28.1 Introduction

The I2C peripheral handles the interface between the device and the serial I 2 C (inter-integrated circuit) bus. It provides multimaster capability, and controls all I 2 C-bus-specific sequencing, protocol, arbitration and timing. It supports Standard-mode (Sm), Fast-mode (Fm) and Fast-mode Plus (Fm+).

The I2C peripheral is also SMBus (system management bus) and PMBus ® (power management bus) compatible.

It can use DMA to reduce the CPU load.

28.2 I2C main features

For information on I2C instantiation, refer to Section 28.3: I2C implementation .

28.3 I2C implementation

This section provides an implementation overview with respect to the I2C instantiation.

Table 142. I2C implementation

I2C features (1)I2C1I2C2 (2)I2C3 (3)
7-bit addressing modeXXX
10-bit addressing modeXXX
Standard-mode (up to 100 kbit/s)XXX
Fast-mode (up to 400 kbit/s)XXX
Fast-mode Plus with 20 mA output drive I/Os (up to 1 Mbit/s)XXX
Independent clockXXX
Wake-up from Stop modeXXX
SMBus/PMBusXXX

1. X = supported.

2. I2C2 is not available on STM32F303x6/x8 and STM32F328x8.

3. I2C3 is available on STM32F303xD/xE and STM32F398xE only.

28.4 I2C functional description

In addition to receiving and transmitting data, the peripheral converts them from serial to parallel format and vice versa. The interrupts are enabled or disabled by software. The peripheral is connected to the I 2 C-bus through a data pin (SDA) and a clock pin (SCL). It supports Standard-mode (up to 100 kHz), Fast-mode (up to 400 kHz), and Fast-mode Plus (up to 1 MHz) I 2 C-bus.

The peripheral can also be connected to an SMBus, through the data pin (SDA), the clock pin (SCL), and an optional SMBus alert pin (SMBA).

The independent clock function allows the I2C communication speed to be independent of the PCLK1 frequency.

For I2C I/Os supporting 20 mA output current drive for Fast-mode Plus operation, the driving capability is enabled through control bits in the system configuration controller (SYSCFG).

28.4.1 I2C block diagram

Figure 295. Block diagram

Block diagram of the I2C interface showing internal components like Data control, Clock control, and Registers connected to pins I2C_SDA, I2C_SCL, and I2C_SMBA via GPIO logic and noise filters. It also shows connections to i2c_ker_ck, PCLK, and the APB bus.

The block diagram illustrates the internal architecture of the I2C interface. On the left, external signals i2c_ker_ck and PCLK are inputs. i2c_ker_ck connects to the I2CCLK pin and feeds into the Data control and Clock control blocks. PCLK connects to the PCLK pin and feeds into the Registers block. The Registers block is connected to an APB bus . The Data control block contains a Shift register and SMBUS PEC generation/check . The Clock control block contains Master clock generation , Slave clock stretching , and SMBus timeout check . A Wake-up on address match block is also present. The SMBus alert control/status block is connected to the I2C_SMBA pin. The I2C_SDA and I2C_SCL pins are connected to GPIO logic blocks, which are preceded by Analog noise filter and Digital noise filter blocks. The Digital noise filter for SDA is connected to the Shift register , and for SCL to the Slave clock stretching block. The diagram is labeled MSV46198V3 in the bottom right corner.

Block diagram of the I2C interface showing internal components like Data control, Clock control, and Registers connected to pins I2C_SDA, I2C_SCL, and I2C_SMBA via GPIO logic and noise filters. It also shows connections to i2c_ker_ck, PCLK, and the APB bus.

28.4.2 I2C pins and internal signals

Table 143. I2C input/output pins

Pin nameSignal typeDescription
I2C_SDABidirectionalI 2 C-bus data
I2C_SCLBidirectionalI 2 C-bus clock
I2C_SMBABidirectionalSMBus alert

Table 144. I2C internal input/output signals

Internal signal nameSignal typeDescription
i2c_ker_ckInputI2C kernel clock, also named I2CCLK in this document
i2c_pclkInputI2C APB clock
i2c_itOutputI2C interrupts, refer to Table 158 for the list of interrupt sources
i2c_rx_dmaOutputI2C receive data DMA request (I2C_RX)
i2c_tx_dmaOutputI2C transmit data DMA request (I2C_TX)

28.4.3 I2C clock requirements

The I2C kernel is clocked by I2CCLK.

The I2CCLK period \( t_{I2CCLK} \) must respect the following conditions:

\[ t_{I2CCLK} < (t_{LOW} - t_{filters}) / 4 \]

\[ t_{I2CCLK} < t_{HIGH} \]

where \( t_{LOW} \) is the SCL low time, \( t_{HIGH} \) is the SCL high time, and \( t_{filters} \) is the sum of the analog and digital filter delays (when enabled).

The digital filter delay is \( DNF[3:0] \times t_{I2CCLK} \) .

The PCLK1 clock period \( t_{PCLK} \) must respect the condition \( t_{PCLK} < 4/3 t_{SCL} \) , where \( t_{SCL} \) is the SCL period.

Caution: When the I2C kernel is clocked by PCLK1, this clock must respect the conditions for \( t_{I2CCLK} \) .

28.4.4 Mode selection

The peripheral can operate as:

By default, the peripheral operates in slave mode. It automatically switches from slave to master mode upon generating START condition, and from master to slave mode upon arbitration loss or upon generating STOP condition. This allows the use of the I2C peripheral in a multimaster I 2 C-bus environment.

Communication flow

In master mode, the I2C peripheral initiates a data transfer and generates the clock signal. Serial data transfers always begin with a START condition and end with a STOP condition. Both START and STOP conditions are generated in master mode by software.

In slave mode, the peripheral recognizes its own 7-bit or 10-bit address, and the general call address. The general call address detection can be enabled or disabled by software. The reserved SMBus addresses can also be enabled by software.

Data and addresses are transferred as 8-bit bytes, MSB first. The first one (7-bit addressing) or two (10-bit addressing) bytes following the START condition contain the address. The address is always transmitted in master mode.

The following figure shows the transmission of a single byte. The master generates nine SCL pulses. The transmitter sends the eight data bits to the receiver with the SCL pulses 1 to 8. Then the receiver sends the acknowledge bit to the transmitter with the ninth SCL pulse.

Figure 296. I 2 C-bus protocol

Timing diagram of the I2C-bus protocol showing SDA and SCL signals. The SDA signal starts high and drops to low for the start condition. The SCL signal is a square wave. The first eight SCL pulses (labeled 1 to 8) correspond to the transmission of eight data bits (MSB to LSB). The ninth SCL pulse (labeled 9) corresponds to the acknowledge (ACK) bit, where the SDA signal is pulled low. The SDA signal then returns high for the stop condition. The diagram is labeled MS19854V1.
Timing diagram of the I2C-bus protocol showing SDA and SCL signals. The SDA signal starts high and drops to low for the start condition. The SCL signal is a square wave. The first eight SCL pulses (labeled 1 to 8) correspond to the transmission of eight data bits (MSB to LSB). The ninth SCL pulse (labeled 9) corresponds to the acknowledge (ACK) bit, where the SDA signal is pulled low. The SDA signal then returns high for the stop condition. The diagram is labeled MS19854V1.

The acknowledge can be enabled or disabled by software. The own addresses of the I2C peripheral can be selected by software.

28.4.5 I2C initialization

Enabling and disabling the peripheral

Before enabling the I2C peripheral, configure and enable its clock through the clock controller, and initialize its control registers.

The I2C peripheral can then be enabled by setting the PE bit of the I2C_CR1 register.

Disabling the I2C peripheral by clearing the PE bit resets the I2C peripheral. Refer to Section 28.4.6 for more details.

Noise filters

Before enabling the I2C peripheral by setting the PE bit of the I2C_CR1 register, the user must configure the analog and/or digital noise filters, as required.

The analog noise filter on the SDA and SCL inputs complies with the I 2 C-bus specification which requires, in Fast-mode and Fast-mode Plus, the suppression of spikes shorter than 50 ns. Enabled by default, it can be disabled by setting the ANFOFF bit.

The digital filter is controlled through the DNF[3:0] bitfield of the I2C_CR1 register. When it is enabled, the internal SCL and SDA signals only take the level of their corresponding I 2 C-bus line when remaining stable for more than DNF[3:0] periods of I2CCLK. This allows suppressing spikes shorter than the filtering capacity period programmable from one to fifteen I2CCLK periods.

The following table compares the two filters.

Table 145. Comparison of analog and digital filters
ItemAnalog filterDigital filter
Filtering capacity (1)≥ 50 nsOne to fifteen I2CCLK periods
BenefitsAvailable in Stop mode
  • – Programmable filtering capacity
  • – Extra filtering capability versus I 2 C-bus specification requirements
  • – Stable filtering capacity
DrawbacksFiltering capacity variation with temperature, voltage, and silicon processWake-up from Stop mode on address match not supported when the digital filter is enabled

1. Maximum duration of spikes that the filter can suppress

Caution: The filter configuration cannot be changed when the I2C peripheral is enabled.

I2C timings

To ensure correct data hold and setup times, the corresponding timings must be configured through the PRESC[3:0], SCLDEL[3:0], and SDADEL[3:0] bitfields of the I2C_TIMINGR register.

The STM32CubeMX tool calculates and provides the I2C_TIMINGR content in the I2C configuration window.

Figure 297. Setup and hold timings

Timing diagrams for I2C setup and hold times. The top diagram shows 'DATA HOLD TIME' where SCL falls and SDA is output. It labels t_SYNC1 (SCL falling edge internal detection to SDA output start), SDadel (SCL stretched low by the I2C), SDA output delay, and t_HD;DAT (SDA output start to SCL rising edge). A note states: 'Data hold time: in case of transmission, the data is sent on SDA output after the SDadel delay, if it is already available in I2C_TXDR.' The bottom diagram shows 'DATA SETUP TIME' where SDA is input and SCL rises. It labels SCLDEL (SCL stretched low by the I2C), t_SU;STA (SDA input start to SCL rising edge), and a note states: 'Data setup time: in case of transmission, the SCLDEL counter starts when the data is sent on SDA output.' MSV40108V1 is noted in the bottom right.
Timing diagrams for I2C setup and hold times. The top diagram shows 'DATA HOLD TIME' where SCL falls and SDA is output. It labels t_SYNC1 (SCL falling edge internal detection to SDA output start), SDadel (SCL stretched low by the I2C), SDA output delay, and t_HD;DAT (SDA output start to SCL rising edge). A note states: 'Data hold time: in case of transmission, the data is sent on SDA output after the SDadel delay, if it is already available in I2C_TXDR.' The bottom diagram shows 'DATA SETUP TIME' where SDA is input and SCL rises. It labels SCLDEL (SCL stretched low by the I2C), t_SU;STA (SDA input start to SCL rising edge), and a note states: 'Data setup time: in case of transmission, the SCLDEL counter starts when the data is sent on SDA output.' MSV40108V1 is noted in the bottom right.

When the SCL falling edge is internally detected, the delay \( t_{SDADEL} \) (impacting the hold time \( t_{HD;DAT} \) ) is inserted before sending SDA output:

\[ t_{SDADEL} = SDADEL \times t_{PRESC} + t_{I2CCLK}, \text{ where } t_{PRESC} = (PRESC + 1) \times t_{I2CCLK}. \]

The total SDA output delay is:

\[ t_{SYNC1} + \{[SDADEL \times (PRESC + 1) + 1] \times t_{I2CCLK}\} \]

The \( t_{SYNC1} \) duration depends upon:

To bridge the undefined region of the SCL falling edge, the user must set SDADEL[3:0] so as to fulfill the following condition:

\[ t_{f(max)} + t_{HD;DAT(min)} - t_{AF(min)} - [(DNF + 3) \times t_{I2CCLK}] / \{(PRESC + 1) \times t_{I2CCLK}\} \leq SDADEL \]

\[ SDADEL \leq t_{HD;DAT(max)} - t_{AF(max)} - [(DNF + 4) \times t_{I2CCLK}] / \{(PRESC + 1) \times t_{I2CCLK}\} \]

Note: \( t_{AF(min)} \) and \( t_{AF(max)} \) are only part of the condition when the analog filter is enabled. Refer to the device datasheet for \( t_{AF} \) values.

The \( t_{HD;DAT} \) time can at maximum be 3.45 µs for Standard-mode, 0.9 µs for Fast-mode, and 0.45 µs for Fast-mode Plus. It must be lower than the maximum of \( t_{VD;DAT} \) by a transition time. This maximum must only be met if the device does not stretch the LOW period ( \( t_{LOW} \) ) of the SCL signal. When it stretches SCL, the data must be valid by the set-up time before it releases the clock.

The SDA rising edge is usually the worst case. The previous condition then becomes:

\[ SDADEL \leq \{t_{VD;DAT(max)} - t_r(max) - t_{AF(max)} - [(DNF + 4) \times t_{I2CCLK}]\} / \{(PRESC + 1) \times t_{I2CCLK}\} \]

Note: This condition can be violated when \( NOSTRETCH = 0 \) , because the device stretches SCL low to guarantee the set-up time, according to the \( SCLDEL[3:0] \) value.

After \( t_{SDADEL} \) , or after sending SDA output when the slave had to stretch the clock because the data was not yet written in \( I2C\_TXDR \) register, the SCL line is kept at low level during the setup time. This setup time is \( t_{SCLDEL} = (SCLDEL + 1) \times t_{PRESC} \) , where \( t_{PRESC} = (PRESC + 1) \times t_{I2CCLK} \) . \( t_{SCLDEL} \) impacts the setup time \( t_{SU;DAT} \) .

To bridge the undefined region of the SDA transition (rising edge usually worst case), the user must program \( SCLDEL[3:0] \) so as to fulfill the following condition:

\[ \{[t_r(max) + t_{SU;DAT(min)}] / [(PRESC + 1) \times t_{I2CCLK}]\} - 1 \leq SCLDEL \]

Refer to the following table for \( t_f \) , \( t_r \) , \( t_{HD;DAT} \) , \( t_{VD;DAT} \) , and \( t_{SU;DAT} \) standard values.

Use the SDA and SCL real transition time values measured in the application to widen the scope of allowed \( SDADEL[3:0] \) and \( SCLDEL[3:0] \) values. Use the maximum SDA and SCL transition time values defined in the standard to make the device work reliably regardless of the application.

Note: At every clock pulse, after SCL falling edge detection, I2C operating as master or slave stretches SCL low during at least \( [(SDADEL + SCLDEL + 1) \times (PRESC + 1) + 1] \times t_{I2CCLK} \) , in both transmission and reception modes. In transmission mode, if the data is not yet written in \( I2C\_TXDR \) when SDA delay elapses, the I2C peripheral keeps stretching SCL low until the next data is written. Then new data MSB is sent on SDA output, and \( SCLDEL \) counter starts, continuing stretching SCL low to guarantee the data setup time.

When the \( NOSTRETCH \) bit is set in slave mode, the SCL is not stretched. The \( SDADEL[3:0] \) must then be programmed so that it ensures a sufficient setup time.

Table 146. I 2 C-bus and SMBus specification data setup and hold times

SymbolParameterStandard-mode (Sm)Fast-mode (Fm)Fast-mode Plus (Fm+)SMBusUnit
MinMaxMinMaxMinMaxMinMax
\( t_{HD;DAT} \)Data hold time0-0-0-0.3-µs
\( t_{VD;DAT} \)Data valid time-3.45-0.9-0.45--
\( t_{SU;DAT} \)Data setup time250-100-50-250-ns
\( t_r \)Rise time of both SDA and SCL signals-1000-300-120-1000
\( t_f \)Fall time of both SDA and SCL signals-300-300-120-300

Additionally, in master mode, the SCL clock high and low levels must be configured by programming the PRESC[3:0], SCLH[7:0], and SCLL[7:0] bitfields of the I2C_TIMINGR register.

When the SCL falling edge is internally detected, the I2C peripheral releasing the SCL output after the delay \( t_{SCLL} = (SCLL + 1) \times t_{PRESCL} \) , where \( t_{PRESCL} = (PRESC + 1) \times t_{I2CCLK} \) . The \( t_{SCLL} \) delay impacts the SCL low time \( t_{LOW} \) .

When the SCL rising edge is internally detected, the I2C peripheral forces the SCL output to low level after the delay \( t_{SCLH} = (SCLH + 1) \times t_{PRESCL} \) , where \( t_{PRESCL} = (PRESC + 1) \times t_{I2CCLK} \) . The \( t_{SCLH} \) impacts the SCL high time \( t_{HIGH} \) .

Refer to I2C master initialization for more details.

Caution: Changing the timing configuration and the NOSTRETCH configuration is not allowed when the I2C peripheral is enabled. Like the timing settings, the slave NOSTRETCH settings must also be done before enabling the peripheral. Refer to I2C slave initialization for more details.

Figure 298. I2C initialization flow

Flowchart of I2C initialization flow
graph TD; A([Initial settings]) --> B[Clear PE bit in I2C_CR1]; B --> C[Configure ANFOFF and DNF[3:0] in I2C_CR1]; C --> D["Configure PRESC[3:0], SDADEL[3:0], SCLDEL[3:0], SCLH[7:0], and SCLL[7:0] in I2C_TIMINGR"]; D --> E[Configure NOSTRETCH in I2C_CR1]; E --> F[Set PE bit in I2C_CR1]; F --> G([End]);

The flowchart illustrates the I2C initialization process. It begins with 'Initial settings' (oval), followed by 'Clear PE bit in I2C_CR1' (rectangle), 'Configure ANFOFF and DNF[3:0] in I2C_CR1' (rectangle), 'Configure PRESC[3:0], SDADEL[3:0], SCLDEL[3:0], SCLH[7:0], and SCLL[7:0] in I2C_TIMINGR' (rectangle), 'Configure NOSTRETCH in I2C_CR1' (rectangle), and 'Set PE bit in I2C_CR1' (rectangle), ending with 'End' (oval). The steps are connected by downward arrows. The identifier MS19847V3 is located in the bottom right corner of the diagram area.

Flowchart of I2C initialization flow

28.4.6 I2C reset

The reset of the I2C peripheral is performed by clearing the PE bit of the I2C_CR1 register. It has the effect of releasing the SCL and SDA lines. Internal state machines are reset and the communication control bits and the status bits revert to their reset values. This reset does not impact the configuration registers.

The impacted register bits are:

  1. 1. I2C_CR2 register: START, STOP, PECBYTE, and NACK
  2. 2. I2C_ISR register: BUSY, TXE, TXIS, RXNE, ADDR, NACKF, TCR, TC, STOPF, BERR, ARLO, PECERR, TIMEOUT, ALERT, and OVR

PE must be kept low during at least three APB clock cycles to perform the I2C reset. To ensure this, perform the following software sequence:

  1. 1. Write PE = 0
  2. 2. Check PE = 0
  3. 3. Write PE = 1

28.4.7 Data transfer

The data transfer is managed through transmit and receive data registers and a shift register.

Reception

The SDA input fills the shift register. After the eighth SCL pulse (when the complete data byte is received), the shift register is copied into the I2C_RXDR register if it is empty (RXNE = 0). If RXNE = 1, which means that the previous received data byte has not yet been read, the SCL line is stretched low until I2C_RXDR is read. The stretch occurs between the eighth and ninth SCL pulse (before the acknowledge pulse).

Figure 299. Data reception

Timing diagram for I2C data reception showing SCL, Shift register, RXNE, and I2C_RXDR signals over time.

The diagram illustrates the timing for data reception in an I2C interface. It shows four horizontal timelines: SCL (Serial Clock Line), Shift register, RXNE (Receive Not Empty flag), and I2C_RXDR (Receive Data Register).

Arrows indicate the flow of data: from the Shift register to the I2C_RXDR register, and from the I2C_RXDR register to the RXNE signal. A legend on the right shows a blue line segment labeled "SCL stretch". The diagram is identified by the code MS19848V1 in the bottom right corner.

Timing diagram for I2C data reception showing SCL, Shift register, RXNE, and I2C_RXDR signals over time.

Transmission

If the I2C_TXDR register is not empty (TXE = 0), its content is copied into the shift register after the ninth SCL pulse (the acknowledge pulse). Then the shift register content is shifted out on the SDA line. If TXE = 1, which means that no data is written yet in I2C_TXDR, the SCL line is stretched low until I2C_TXDR is written. The stretch starts after the ninth SCL pulse.

Figure 300. Data transmission

Figure 300: Data transmission timing diagram showing SCL, Shift register, TXE, and I2C_TXDR signals.

The diagram illustrates the I2C transmission sequence:

legend:
SCL stretch

MS19849V1

Figure 300: Data transmission timing diagram showing SCL, Shift register, TXE, and I2C_TXDR signals.

Hardware transfer management

The I2C features an embedded byte counter to manage byte transfer and to close the communication in various modes, such as:

In master mode, the byte counter is always used. By default, it is disabled in slave mode. It can be enabled by software, by setting the SBC (slave byte control) bit of the I2C_CR1 register.

The number of bytes to transfer is programmed in the NBYTES[7:0] bitfield of the I2C_CR2 register. If this number is greater than 255, or if a receiver wants to control the acknowledge value of a received data byte, the reload mode must be selected, by setting the RELOAD bit of the I2C_CR2 register. In this mode, the TCR flag is set when the number of bytes programmed in NBYTES[7:0] is transferred (when the associated counter reaches zero), and an interrupt is generated if TCIE is set. SCL is stretched as long as the TCR flag is set. TCR is cleared by software when NBYTES[7:0] is written to a non-zero value.

When NBYTES[7:0] is reloaded with the last number of bytes to transfer, the RELOAD bit must be cleared.

When RELOAD = 0 in master mode, the counter can be used in two modes:

Caution: The AUTOEND bit has no effect when the RELOAD bit is set.

Table 147. I2C configuration

FunctionSBC bitRELOAD bitAUTOEND bit
Master Tx/Rx NBBYTES + STOPX01
Master Tx/Rx + NBBYTES + RESTARTX00
Slave Tx/Rx, all received bytes ACKed0XX
Slave Rx with ACK control11X

28.4.8 I2C slave mode

I2C slave initialization

To work in slave mode, the user must enable at least one slave address. The I2C_OAR1 and I2C_OAR2 registers are available to program the slave own addresses OA1 and OA2, respectively.

OA1 can be configured either in 7-bit (default) or in 10-bit addressing mode, by setting the OA1MODE bit of the I2C_OAR1 register.

OA1 is enabled by setting the OA1EN bit of the I2C_OAR1 register.

If an additional slave addresses are required, the second slave address OA2 can be configured. Up to seven OA2 LSBs can be masked, by configuring the OA2MSK[2:0] bitfield of the I2C_OAR2 register. Therefore, for OA2MSK[2:0] configured from 1 to 6, only OA2[7:2], OA2[7:3], OA2[7:4], OA2[7:5], OA2[7:6], or OA2[7] are compared with the received address. When OA2MSK[2:0] is other than 0, the address comparator for OA2 excludes the I2C reserved addresses (0000 XXX and 1111 XXX) and they are not acknowledged. If OA2MSK[2:0] = 7, all received 7-bit addresses are acknowledged (except reserved addresses). OA2 is always a 7-bit address.

When enabled through the specific bit, the reserved addresses can be acknowledged if they are programmed in the I2C_OAR1 or I2C_OAR2 register with OA2MSK[2:0] = 0.

OA2 is enabled by setting the OA2EN bit of the I2C_OAR2 register.

The general call address is enabled by setting the GCEN bit of the I2C_CR1 register.

When the I2C peripheral is selected by one of its enabled addresses, the ADDR interrupt status flag is set, and an interrupt is generated if the ADDRIE bit is set.

By default, the slave uses its clock stretching capability, which means that it stretches the SCL signal at low level when required, to perform software actions. If the master does not

support clock stretching, I2C must be configured with NOSTRETCH = 1 in the I2C_CR1 register.

After receiving an ADDR interrupt, if several addresses are enabled, the user must read the ADDCODE[6:0] bitfield of the I2C_ISR register to check which address matched. The DIR flag must also be checked to know the transfer direction.

Slave with clock stretching

As long as the NOSTRETCH bit of the I2C_CR1 register is zero (default), the I2C peripheral operating as an I 2 C-bus slave stretches the SCL signal in the following situations:

Slave without clock stretching

As long as the NOSTRETCH bit of the I2C_CR1 register is set, the I2C peripheral operating as an I 2 C-bus slave does not stretch the SCL signal.

The SCL clock is not stretched while the ADDR flag is set.

In transmission, the data must be written in the I2C_TXDR register before the first SCL pulse corresponding to its transfer occurs. If not, an underrun occurs, the OVR flag is set in the I2C_ISR register and an interrupt is generated if the ERRIE bit of the I2C_CR1 register is set. The OVR flag is also set when the first data transmission starts and the STOPF bit is still set (has not been cleared). Therefore, if the user clears the STOPF flag of the previous transfer only after writing the first data to be transmitted in the next transfer, it ensures that the OVR status is provided, even for the first data to be transmitted.

In reception, the data must be read from the I2C_RXDR register before the ninth SCL pulse (ACK pulse) of the next data byte occurs. If not, an overrun occurs, the OVR flag is set in the I2C_ISR register, and an interrupt is generated if the ERRIE bit of the I2C_CR1 register is set.

Slave byte control mode

To allow byte ACK control in slave reception mode, the slave byte control mode must be enabled, by setting the SBC bit of the I2C_CR1 register. This is required to comply with SMBus standards.

The reload mode must be selected to allow byte ACK control in slave reception mode (RELOAD = 1). To get control of each byte, NBBYTES[7:0] must be initialized to 0x1 in the ADDR interrupt subroutine, and reloaded to 0x1 after each received byte. When the byte is received, the TCR bit is set, stretching the SCL signal low between the eighth and ninth SCL pulses. The user can read the data from the I2C_RXDR register, and then decide to acknowledge it or not by configuring the ACK bit of the I2C_CR2 register. The SCL stretch is released by programming NBBYTES to a non-zero value: the acknowledge or not-acknowledge is sent, and the next byte can be received.

NBYTES[7:0] can be loaded with a value greater than 0x1. Receiving then continues until the corresponding number of bytes are received.

Note: The SBC bit must be configured when the I2C peripheral is disabled, when the slave is not addressed, or when ADDR = 1.

The RELOAD bit value can be changed when ADDR = 1, or when TCR = 1.

Caution: The slave byte control mode is not compatible with NOSTRETCH mode. Setting SBC when NOSTRETCH = 1 is not allowed.

Figure 301. Slave initialization flow

Flowchart of slave initialization flow
graph TD; A([Slave initialization]) --> B[Initial settings]; B --> C[Clear OA1EN and OA2EN in I2C_OAR1/I2C_OAR2]; C --> D["Configure OA1[9:0], OA1MODE, OA1EN, OA2[6:0], OA2MSK[2:0], OA2EN, and GCEN"]; D --> E["Optional: Configure SBC in I2C_CR1<sup>1</sup>"]; E --> F[Enable interrupts and/or DMA in I2C_CR1]; F --> G([End]);

The flowchart illustrates the slave initialization process. It begins with an oval labeled 'Slave initialization', which points down to a rectangle 'Initial settings'. This is followed by a sequence of rectangles: 'Clear OA1EN and OA2EN in I2C_OAR1/I2C_OAR2', 'Configure OA1[9:0], OA1MODE, OA1EN, OA2[6:0], OA2MSK[2:0], OA2EN, and GCEN', 'Optional: Configure SBC in I2C_CR1 1 ', and 'Enable interrupts and/or DMA in I2C_CR1'. The process concludes with an oval labeled 'End'. A small note 'MS19850V3' is visible in the bottom right corner of the diagram area.

Flowchart of slave initialization flow
  1. 1. SBC must be set to support SMBus features.

Slave transmitter

A transmit interrupt status (TXIS) flag is generated when the I2C_TXDR register becomes empty. An interrupt is generated if the TXIE bit of the I2C_CR1 register is set.

The TXIS flag is cleared when the I2C_TXDR register is written with the next data byte to transmit.

When NACK is received, the NACKF flag is set in the I2C_ISR register and an interrupt is generated if the NACKIE bit of the I2C_CR1 register is set. The slave automatically releases the SCL and SDA lines to let the master perform a STOP or a RESTART condition. The TXIS bit is not set when a NACK is received.

When STOP is received and the STOPIE bit of the I2C_CR1 register is set, the STOPF flag of the I2C_ISR register is set and an interrupt is generated. In most applications, the SBC bit is usually programmed to 0. In this case, if TXE = 0 when the slave address is received (ADDR = 1), the user can choose either to send the content of the I2C_TXDR register as the first data byte, or to flush the I2C_TXDR register, by setting the TXE bit in order to program a new data byte.

In slave byte control mode (SBC = 1), the number of bytes to transmit must be programmed in NBBYTES[7:0] in the address match interrupt subroutine (ADDR = 1). In this case, the number of TXIS events during the transfer corresponds to the value programmed in NBBYTES[7:0].

Caution: When NOSTRETCH = 1, the SCL clock is not stretched while the ADDR flag is set, so the user cannot flush the I2C_TXDR register content in the ADDR subroutine to program the first data byte. The first data byte to send must be previously programmed in the I2C_TXDR register:

If STOPF is still set when the first data transmission starts, an underrun error is generated (the OVR flag is set).

If a TXIS event (transmit interrupt or transmit DMA request) is required, the user must set the TXIS bit in addition to the TXE bit, to generate the event.

Figure 302. Transfer sequence flow for I2C slave transmitter, NOSTRETCH = 0

Flowchart for I2C slave transmitter transfer sequence. It starts with 'Slave transmission' (oval), followed by 'Slave initialization' (rectangle). A decision diamond 'I2C_ISR.ADDR = 1?' follows. If 'No', it loops back to 'Slave initialization'. If 'Yes', it proceeds to a rectangle: 'Read ADDCODE and DIR in I2C_ISR. Optional: Set I2C_ISR.TXE = 1. Set I2C_ICR.ADDRCF'. To the right of this step is a vertical double-headed arrow labeled 'SCL stretched'. Next is a decision diamond 'I2C_ISR.TXIS = 1?'. If 'No', it loops back to the entry point of the 'I2C_ISR.ADDR' decision. If 'Yes', it proceeds to 'Write I2C_TXDR.TXDATA' (rectangle), which then loops back to the entry point of the 'I2C_ISR.TXIS' decision.
graph TD; Start([Slave transmission]) --> Init[Slave initialization]; Init --> ADDR{I2C_ISR.ADDR = 1?}; ADDR -- No --> Init; ADDR -- Yes --> Read[Read ADDCODE and DIR in I2C_ISR<br/>Optional: Set I2C_ISR.TXE = 1<br/>Set I2C_ICR.ADDRCF]; Read --> TXIS{I2C_ISR.TXIS = 1?}; TXIS -- No --> ADDR; TXIS -- Yes --> Write[Write I2C_TXDR.TXDATA]; Write --> TXIS; style ADDR fill:none,stroke:none; style TXIS fill:none,stroke:none;
Flowchart for I2C slave transmitter transfer sequence. It starts with 'Slave transmission' (oval), followed by 'Slave initialization' (rectangle). A decision diamond 'I2C_ISR.ADDR = 1?' follows. If 'No', it loops back to 'Slave initialization'. If 'Yes', it proceeds to a rectangle: 'Read ADDCODE and DIR in I2C_ISR. Optional: Set I2C_ISR.TXE = 1. Set I2C_ICR.ADDRCF'. To the right of this step is a vertical double-headed arrow labeled 'SCL stretched'. Next is a decision diamond 'I2C_ISR.TXIS = 1?'. If 'No', it loops back to the entry point of the 'I2C_ISR.ADDR' decision. If 'Yes', it proceeds to 'Write I2C_TXDR.TXDATA' (rectangle), which then loops back to the entry point of the 'I2C_ISR.TXIS' decision.

MS19851V2

Figure 303. Transfer sequence flow for I2C slave transmitter, NOSTRETCH = 1

Flowchart for I2C slave transmitter transfer sequence flow, NOSTRETCH = 1.
graph TD; Start([Slave transmission]) --> Init[Slave initialization]; Init --> LoopStart(( )); LoopStart --> TXIS{I2C_ISR.TXIS = 1?}; TXIS -- No --> LoopStart; TXIS -- Yes --> Write[Write I2C_TXDR.TXDATA]; Write --> LoopStart; LoopStart --> STOPF{I2C_ISR.STOPF = 1?}; STOPF -- No --> LoopStart; STOPF -- Yes --> Optional[Optional: Set I2C_ISR.TXE = 1 and I2C_ISR.TXIS=1]; Optional --> StopPCF[Set I2C_ICR.STOPCF]; StopPCF --> End(( ));

The flowchart illustrates the transfer sequence flow for an I2C slave transmitter with NOSTRETCH = 1. It begins with an oval labeled "Slave transmission", which points to a rectangle labeled "Slave initialization". From "Slave initialization", the flow proceeds to a decision diamond labeled "I2C_ISR.TXIS = 1?". If the answer is "No", the flow loops back to the entry point before the decision. If the answer is "Yes", the flow proceeds to a rectangle labeled "Write I2C_TXDR.TXDATA", which then loops back to the entry point. After the "I2C_ISR.TXIS = 1?" decision, the flow proceeds to another decision diamond labeled "I2C_ISR.STOPF = 1?". If the answer is "No", the flow loops back to the entry point. If the answer is "Yes", the flow proceeds to a rectangle labeled "Optional: Set I2C_ISR.TXE = 1 and I2C_ISR.TXIS=1", which then proceeds to a rectangle labeled "Set I2C_ICR.STOPCF". Finally, the flow proceeds to an oval labeled "End". The identifier "MS19852V2" is located in the bottom right corner of the diagram.

Flowchart for I2C slave transmitter transfer sequence flow, NOSTRETCH = 1.

Figure 304. Transfer bus diagrams for I2C slave transmitter (mandatory events only)

Timing diagram for I2C slave transmitter with 3 bytes and 1st data flushed. The diagram shows a sequence of blocks: S (Start), Address, A (Acknowledge), data1, A, data2, A, data3, NA (Not Acknowledge), P (Stop). Above the blocks, arrows indicate events: ADDR at the Address block, TXIS at the data1, data2, and data3 blocks. Below the blocks, arrows indicate mandatory events: EV1 at the Address block, EV2 at the data1 block, EV3 at the data2 block, EV4 at the data3 block, and EV5 at the NA block. A TXE signal line is shown below the blocks, with a high level at the start and low levels at the TXIS events. A legend on the right indicates: transmission (white box), reception (yellow box), and SCL stretch (blue line). Timing diagram for I2C slave transmitter with 3 bytes and no 1st data flush. The diagram shows a sequence of blocks: S (Start), Address, A (Acknowledge), data1, A, data2, A, data3, NA (Not Acknowledge), P (Stop). Above the blocks, arrows indicate events: ADDR at the Address block, TXIS at the data2 and data3 blocks. Below the blocks, arrows indicate mandatory events: EV1 at the Address block, EV2 at the data1 block, EV3 at the data2 block, and EV4 at the data3 block. A TXE signal line is shown below the blocks, with a high level at the start and low levels at the TXIS events. A legend on the right indicates: transmission (white box), reception (yellow box), and SCL stretch (blue line). Timing diagram for I2C slave transmitter with 3 bytes and NOSTRETCH=1. The diagram shows a sequence of blocks: S (Start), Address, A (Acknowledge), data1, A, data2, A, data3, NA (Not Acknowledge), P (Stop). Above the blocks, arrows indicate events: TXIS at the data1, data2, and data3 blocks, and STOPF at the P block. Below the blocks, arrows indicate mandatory events: EV1 at the Address block, EV2 at the data1 block, EV3 at the data2 block, EV4 at the data3 block, and EV5 at the STOPF block. A TXE signal line is shown below the blocks, with a high level at the start and low levels at the TXIS events. A legend on the right indicates: transmission (white box), reception (yellow box), and SCL stretch (blue line).

Example I2C slave transmitter 3 bytes with 1st data flushed, NOSTRETCH=0:

EV1: ADDR ISR: check ADDCODE and DIR, set TXE, set ADDRCF
EV2: TXIS ISR: wr data1
EV3: TXIS ISR: wr data2
EV4: TXIS ISR: wr data3
EV5: TXIS ISR: wr data4 (not sent)

Example I2C slave transmitter 3 bytes without 1st data flush, NOSTRETCH=0:

EV1: ADDR ISR: check ADDCODE and DIR, set ADDRCF
EV2: TXIS ISR: wr data2
EV3: TXIS ISR: wr data3
EV4: TXIS ISR: wr data4 (not sent)

Example I2C slave transmitter 3 bytes, NOSTRETCH=1:

EV1: wr data1
EV2: TXIS ISR: wr data2
EV3: TXIS ISR: wr data3
EV4: TXIS ISR: wr data4 (not sent)
EV5: STOPF ISR: (optional: set TXE and TXIS), set STOPCF

MS19853V2

Timing diagram for I2C slave transmitter with 3 bytes and 1st data flushed. The diagram shows a sequence of blocks: S (Start), Address, A (Acknowledge), data1, A, data2, A, data3, NA (Not Acknowledge), P (Stop). Above the blocks, arrows indicate events: ADDR at the Address block, TXIS at the data1, data2, and data3 blocks. Below the blocks, arrows indicate mandatory events: EV1 at the Address block, EV2 at the data1 block, EV3 at the data2 block, EV4 at the data3 block, and EV5 at the NA block. A TXE signal line is shown below the blocks, with a high level at the start and low levels at the TXIS events. A legend on the right indicates: transmission (white box), reception (yellow box), and SCL stretch (blue line). Timing diagram for I2C slave transmitter with 3 bytes and no 1st data flush. The diagram shows a sequence of blocks: S (Start), Address, A (Acknowledge), data1, A, data2, A, data3, NA (Not Acknowledge), P (Stop). Above the blocks, arrows indicate events: ADDR at the Address block, TXIS at the data2 and data3 blocks. Below the blocks, arrows indicate mandatory events: EV1 at the Address block, EV2 at the data1 block, EV3 at the data2 block, and EV4 at the data3 block. A TXE signal line is shown below the blocks, with a high level at the start and low levels at the TXIS events. A legend on the right indicates: transmission (white box), reception (yellow box), and SCL stretch (blue line). Timing diagram for I2C slave transmitter with 3 bytes and NOSTRETCH=1. The diagram shows a sequence of blocks: S (Start), Address, A (Acknowledge), data1, A, data2, A, data3, NA (Not Acknowledge), P (Stop). Above the blocks, arrows indicate events: TXIS at the data1, data2, and data3 blocks, and STOPF at the P block. Below the blocks, arrows indicate mandatory events: EV1 at the Address block, EV2 at the data1 block, EV3 at the data2 block, EV4 at the data3 block, and EV5 at the STOPF block. A TXE signal line is shown below the blocks, with a high level at the start and low levels at the TXIS events. A legend on the right indicates: transmission (white box), reception (yellow box), and SCL stretch (blue line).

Slave receiver

The RXNE bit of the I2C_ISR register is set when the I2C_RXDR is full, which generates an interrupt if the RXIE bit of the I2C_CR1 register is set. RXNE is cleared when I2C_RXDR is read.

When a STOP is received and STOPIE is set in I2C_CR1, STOPF is set in I2C_ISR and an interrupt is generated.

Figure 305. Transfer sequence flow for I2C slave receiver, NOSTRETCH = 0

Flowchart of I2C slave receiver transfer sequence. It starts with 'Slave reception', followed by 'Slave initialization'. A loop exists for 'I2C_ISR.ADDR = 1?' (No branch). A 'Yes' branch leads to 'Read ADDCODE and DIR in I2C_ISR, Set I2C_ICR.ADDRCF'. This is followed by a loop for 'I2C_ISR.RXNE = 1?' (No branch). A 'Yes' branch leads to 'Write I2C_RXDR.RXDATA', which then loops back to the 'I2C_ISR.RXNE = 1?' decision. A vertical double-headed arrow on the right is labeled 'SCL stretched'. The diagram is labeled 'MS19855V2' in the bottom right corner.
graph TD; Start([Slave reception]) --> Init[Slave initialization]; Init --> ADDR{I2C_ISR.ADDR = 1?}; ADDR -- No --> ADDR; ADDR -- Yes --> Read[Read ADDCODE and DIR in I2C_ISR<br/>Set I2C_ICR.ADDRCF]; Read --> RXNE{I2C_ISR.RXNE = 1?}; RXNE -- No --> RXNE; RXNE -- Yes --> Write[Write I2C_RXDR.RXDATA]; Write --> RXNE;
Flowchart of I2C slave receiver transfer sequence. It starts with 'Slave reception', followed by 'Slave initialization'. A loop exists for 'I2C_ISR.ADDR = 1?' (No branch). A 'Yes' branch leads to 'Read ADDCODE and DIR in I2C_ISR, Set I2C_ICR.ADDRCF'. This is followed by a loop for 'I2C_ISR.RXNE = 1?' (No branch). A 'Yes' branch leads to 'Write I2C_RXDR.RXDATA', which then loops back to the 'I2C_ISR.RXNE = 1?' decision. A vertical double-headed arrow on the right is labeled 'SCL stretched'. The diagram is labeled 'MS19855V2' in the bottom right corner.

Figure 306. Transfer sequence flow for I2C slave receiver, NOSTRETCH = 1

Flowchart for I2C slave receiver transfer sequence with NOSTRETCH = 1. It starts with 'Slave reception' leading to 'Slave initialization'. A loop then checks if I2C_ISR.RXNE is 1. If 'Yes', it reads I2C_RXDR.RXDATA and loops back. If 'No', it checks if I2C_ISR.STOPF is 1. If 'Yes', it sets I2C_ICR.STOPCF and loops back. If 'No', it loops back to the RXNE check.
graph TD
    Start([Slave reception]) --> Init[Slave initialization]
    Init --> RXNE{I2C_ISR.RXNE = 1?}
    RXNE -- Yes --> Read[Read I2C_RXDR.RXDATA]
    Read --> RXNE
    RXNE -- No --> STOPF{I2C_ISR.STOPF = 1?}
    STOPF -- Yes --> StopCF[Set I2C_ICR.STOPCF]
    StopCF --> RXNE
    STOPF -- No --> RXNE
  

MS19856V2

Flowchart for I2C slave receiver transfer sequence with NOSTRETCH = 1. It starts with 'Slave reception' leading to 'Slave initialization'. A loop then checks if I2C_ISR.RXNE is 1. If 'Yes', it reads I2C_RXDR.RXDATA and loops back. If 'No', it checks if I2C_ISR.STOPF is 1. If 'Yes', it sets I2C_ICR.STOPCF and loops back. If 'No', it loops back to the RXNE check.

Figure 307. Transfer bus diagrams for I2C slave receiver (mandatory events only)

Timing diagram for NOSTRETCH = 0. It shows a sequence of bytes: S (Start), Address, A (Acknowledge), data1, A, data2, A, data3, A. RXNE lines are shown for data1, data2, and data3. EV1 is at the first Acknowledge, EV2 at the second, EV3 at the third, and EV4 at the fourth Acknowledge. A legend indicates Transmission (white), Reception (yellow), and SCL stretch (blue line). Timing diagram for NOSTRETCH = 1. It shows a sequence of bytes: S (Start), Address, A, data1, A, data2, A, data3, A, P (Stop). RXNE lines are shown for data1, data2, and data3. EV1 is at the first Acknowledge, EV2 at the second, and EV3 at the third. A legend indicates Transmission (white), Reception (yellow), and SCL stretch (blue line).

Example I2C slave receiver 3 bytes, NOSTRETCH = 0:

RXNE

EV1: ADDR ISR: check ADDCODE and DIR, set ADDRCF
EV2: RXNE ISR: rd data1
EV3: RXNE ISR: rd data2
EV4: RXNE ISR: rd data3

Example I2C slave receiver 3 bytes, NOSTRETCH = 1:

RXNE

EV1: RXNE ISR: rd data1
EV2: RXNE ISR: rd data2
EV3: RXNE ISR: rd data3

MS19857V4

Timing diagram for NOSTRETCH = 0. It shows a sequence of bytes: S (Start), Address, A (Acknowledge), data1, A, data2, A, data3, A. RXNE lines are shown for data1, data2, and data3. EV1 is at the first Acknowledge, EV2 at the second, EV3 at the third, and EV4 at the fourth Acknowledge. A legend indicates Transmission (white), Reception (yellow), and SCL stretch (blue line). Timing diagram for NOSTRETCH = 1. It shows a sequence of bytes: S (Start), Address, A, data1, A, data2, A, data3, A, P (Stop). RXNE lines are shown for data1, data2, and data3. EV1 is at the first Acknowledge, EV2 at the second, and EV3 at the third. A legend indicates Transmission (white), Reception (yellow), and SCL stretch (blue line).

28.4.9 I2C master mode

I2C master initialization

Before enabling the peripheral, the I2C master clock must be configured, by setting the SCLH and SCLL bits in the I2C_TIMINGR register.

The STM32CubeMX tool calculates and provides the I2C_TIMINGR content in the I2C Configuration window.

A clock synchronization mechanism is implemented in order to support multi-master environment and slave clock stretching.

In order to allow clock synchronization:

I2C detects its own SCL low level after a \( t_{\text{SYNC1}} \) delay depending on the SCL falling edge, SCL input noise filters (analog and digital), and SCL synchronization to the I2CxCLK clock. I2C releases SCL to high level once the SCLL counter reaches the value programmed in the SCLL[7:0] bitfield of the I2C_TIMINGR register.

I2C detects its own SCL high level after a \( t_{\text{SYNC2}} \) delay depending on the SCL rising edge, SCL input noise filters (analog and digital), and SCL synchronization to the I2CxCLK clock. I2C ties SCL to low level once the SCLH counter reaches the value programmed in the SCLH[7:0] bitfield of the I2C_TIMINGR register.

Consequently the master clock period is:

\[ t_{\text{SCL}} = t_{\text{SYNC1}} + t_{\text{SYNC2}} + \{[(\text{SCLH} + 1) + (\text{SCLL} + 1)] \times (\text{PRESC} + 1) \times t_{\text{I2CCLK}}\} \]

The duration of \( t_{\text{SYNC1}} \) depends upon:

The duration of \( t_{\text{SYNC2}} \) depends upon:

Figure 308. Master clock generation

Timing diagram for SCL master clock generation showing SCL signal transitions and counter start points. Timing diagram for SCL master clock synchronization showing how multiple devices interact with the SCL line.

SCL master clock generation

The diagram illustrates the timing for SCL master clock generation. The SCL signal transitions from a released state to a high level, then is driven low. The time from SCL released to high level detection is \( t_{SYNC2} \) . The SCLH counter starts when the high level is detected. The time from SCL driven low to low level detection is \( t_{SYNC1} \) . The SCLL counter starts when the low level is detected.

SCL master clock synchronization

The diagram illustrates SCL master clock synchronization. It shows how the SCLH and SCLL counters are triggered by level detection. It specifically highlights cases where the SCL line is driven low by another device, extending the low period, and how the master waits for the SCL line to be released before starting its high level counter.

MS19858V1

Timing diagram for SCL master clock generation showing SCL signal transitions and counter start points. Timing diagram for SCL master clock synchronization showing how multiple devices interact with the SCL line.

Caution: For compliance with the I 2 C-bus or SMBus specification, the master clock must respect the timings in the following table.

Table 148. I 2 C-bus and SMBus specification clock timings

SymbolParameterStandard-mode (Sm)Fast-mode (Fm)Fast-mode Plus (Fm+)SMBusUnit
MinMaxMinMaxMinMaxMinMax
f SCLSCL clock frequency-100-400-1000-100kHz
t HD:STAHold time (repeated) START condition4.0-0.6-0.26-4.0-µs
t SU:STASet-up time for a repeated START condition4.7-0.6-0.26-4.7-
t SU:STOSet-up time for STOP condition4.0-0.6-0.26-4.0-
t BUFBus free time between a STOP and START condition4.7-1.3-0.5-4.7-
t LOWLow period of the SCL clock4.7-1.3-0.5-4.7-
t HIGHHigh period of the SCL clock4.0-0.6-0.26-4.050
t rRise time of both SDA and SCL signals-1000-300-120-1000ns
t fFall time of both SDA and SCL signals-300-300-120-300

Note: The SCLL[7:0] bitfield also determines the t BUF and t SU:STA timings and SCLH[7:0] the t HD:STA and t SU:STO timings.

Refer to Section 28.4.10 for examples of I2C_TIMINGR settings versus the I2CCLK frequency.

Master communication initialization (address phase)

To initiate the communication with a slave to address, set the following bitfields of the I2C_CR2 register:

Note: Changing these bitfields is not allowed as long as the START bit is set.

Before launching the communication, make sure that the I 2 C-bus is idle. This can be checked using the bus idle detection function or by verifying that the IDR bits of the GPIOs selected as SDA and SCL are set. Any low-level incident on the I 2 C-bus lines that coincides with the START condition asserted by the I2C peripheral may cause its deadlock if not filtered out by the input filters. If such incidents cannot be prevented, design the software so that it restores the normal operation of the I2C peripheral in case of a deadlock, by toggling the PE bit of the I2C_CR1 register.

To launch the communication, set the START bit of the I2C_CR2 register. The master then automatically sends a START condition followed by the slave address as soon as it detects that the bus is free (BUSY = 0) and after the \( t_{\text{BUF}} \) delay from a previous STOP condition expires.

In case of an arbitration loss, the master automatically switches back to slave mode and can acknowledge its own address if it is addressed as a slave.

Note: The START bit is reset by hardware when the slave address is sent on the bus, whatever the received acknowledge value. The START bit is also reset by hardware upon arbitration loss.

In 10-bit addressing mode, the master automatically keeps resending the slave address in a loop until the first address byte (first seven address bits) is acknowledged by the slave.

Setting the ADDRCF bit makes I2C quit that loop.

If the I2C peripheral is addressed as a slave (ADDR = 1) while the START bit is set, the I2C peripheral switches to slave mode and the START bit is cleared when the ADDRCF bit is set.

Note: The same procedure is applied for a repeated start condition. In this case, BUSY = 1.

Figure 309. Master initialization flow

Flowchart for Master initialization flow
graph TD
    A([Master initialization]) --> B[Initial settings]
    B --> C[Enable interrupts and/or DMA in I2C_CR1]
    C --> D([End])

MS19859V2

Flowchart for Master initialization flow

Initialization of a master receiver addressing a 10-bit address slave

If the slave address is in 10-bit format, the user can choose to send the complete read sequence, by clearing the HEAD10R bit of the I2C_CR2 register. In this case, the master automatically sends the following complete sequence after the START bit is set:

(RE)START + Slave address 10-bit header Write + Slave address second byte + (RE)START + Slave address 10-bit header Read.

Figure 310. 10-bit address read access with HEAD10R = 0

Timing diagram for 10-bit address read access with HEAD10R = 0
1 1 1 1 0 X X    01 1 1 1 0 X X    1
SSlave address 1st 7 bitsR/WA1Slave address 2nd byteA2SrSlave address 1st 7 bitsR/WA3DATAADATAĀP
WriteRead

MSV41066V1

Timing diagram for 10-bit address read access with HEAD10R = 0

If the master addresses a 10-bit address slave, transmits data to this slave and then reads data from the same slave, a master transmission flow must be done first. Then a repeated START is set with the 10-bit slave address configured with HEAD10R = 1. In this case, the master sends this sequence:

RESTART + Slave address 10-bit header Read.

Figure 311. 10-bit address read access with HEAD10R = 1

Timing diagram for 10-bit address read access with HEAD10R = 1. The diagram shows two transmission sequences. The first sequence is a 'Write' operation: S (Start), 11110XX (Slave address 1st 7 bits), R/W (Read/Write, 0 for write), A (Ack), Slave address 2nd byte, A (Ack), DATA, A (Ack), DATA, A/A (Ack/Not Ack). A Repeated Start (Sr) is then sent. The second sequence is a 'Read' operation: Sr (Repeated Start), 11110XX (Slave address 1st 7 bits), R/W (Read/Write, 1 for read), A (Ack), DATA, A (Ack), DATA, A (Ack), DATA, A (Ack), P (Stop). The diagram is labeled MS19823V1.
Timing diagram for 10-bit address read access with HEAD10R = 1. The diagram shows two transmission sequences. The first sequence is a 'Write' operation: S (Start), 11110XX (Slave address 1st 7 bits), R/W (Read/Write, 0 for write), A (Ack), Slave address 2nd byte, A (Ack), DATA, A (Ack), DATA, A/A (Ack/Not Ack). A Repeated Start (Sr) is then sent. The second sequence is a 'Read' operation: Sr (Repeated Start), 11110XX (Slave address 1st 7 bits), R/W (Read/Write, 1 for read), A (Ack), DATA, A (Ack), DATA, A (Ack), DATA, A (Ack), P (Stop). The diagram is labeled MS19823V1.

Master transmitter

In the case of a write transfer, the TXIS flag is set after each byte transmission, after the ninth SCL pulse when an ACK is received.

A TXIS event generates an interrupt if the TXIE bit of the I2C_CR1 register is set. The flag is cleared when the I2C_TXDR register is written with the next data byte to transmit.

The number of TXIS events during the transfer corresponds to the value programmed in NBBYTES[7:0]. If the total number of data bytes to transmit is greater than 255, the reload mode must be selected by setting the RELOAD bit in the I2C_CR2 register. In this case, when the NBBYTES[7:0] number of data bytes is transferred, the TCR flag is set and the SCL line is stretched low until NBBYTES[7:0] is written with a non-zero value.

When RELOAD = 0 and the number of data bytes defined in NBBYTES[7:0] is transferred:

When a NACK is received, the TXIS flag is not set and a STOP condition is automatically sent. the NACKF flag of the I2C_ISR register is set. An interrupt is generated if the NACKIE bit is set.

Figure 312. Transfer sequence flow for I2C master transmitter, N ≤ 255 bytes

Flowchart for I2C master transmitter transfer sequence. It starts with 'Master transmission' (oval), followed by 'Master initialization' (rectangle), and a configuration block (rectangle) with 'NBYTES = N', 'AUTOEND = 0 for RESTART; 1 for STOP', 'Configure slave address', and 'Set I2C_CR2.START'. A loop begins with a decision 'I2C_ISR.NACKF = 1?' (diamond). If 'Yes', it ends at 'End' (oval). If 'No', it goes to 'I2C_ISR.TXIS = 1?' (diamond). If 'Yes', it goes to 'Write I2C_TXDR' (rectangle), then to 'NBYTES transmitted?' (diamond). If 'Yes', it goes to 'I2C_ISR.TC = 1?' (diamond). If 'Yes', it goes to 'Set I2C_CR2.START with slave address NBYTES ...' (rectangle), then to 'End' (oval). If 'No' at any point, it loops back to the start of the loop.
graph TD; A([Master transmission]) --> B[Master initialization]; B --> C["NBYTES = N<br/>AUTOEND = 0 for RESTART; 1 for STOP<br/>Configure slave address<br/>Set I2C_CR2.START"]; C --> D{"I2C_ISR.NACKF = 1?"}; D -- Yes --> E([End]); D -- No --> F{"I2C_ISR.TXIS = 1?"}; F -- Yes --> G[Write I2C_TXDR]; F -- No --> D; G --> H{"NBYTES transmitted?"}; H -- Yes --> I{"I2C_ISR.TC = 1?"}; H -- No --> D; I -- Yes --> J["Set I2C_CR2.START with<br/>slave address NBYTES ..."]; I -- No --> K([End]); J --> K;
Flowchart for I2C master transmitter transfer sequence. It starts with 'Master transmission' (oval), followed by 'Master initialization' (rectangle), and a configuration block (rectangle) with 'NBYTES = N', 'AUTOEND = 0 for RESTART; 1 for STOP', 'Configure slave address', and 'Set I2C_CR2.START'. A loop begins with a decision 'I2C_ISR.NACKF = 1?' (diamond). If 'Yes', it ends at 'End' (oval). If 'No', it goes to 'I2C_ISR.TXIS = 1?' (diamond). If 'Yes', it goes to 'Write I2C_TXDR' (rectangle), then to 'NBYTES transmitted?' (diamond). If 'Yes', it goes to 'I2C_ISR.TC = 1?' (diamond). If 'Yes', it goes to 'Set I2C_CR2.START with slave address NBYTES ...' (rectangle), then to 'End' (oval). If 'No' at any point, it loops back to the start of the loop.

MS19860V2

Figure 313. Transfer sequence flow for I2C master transmitter, N > 255 bytes

Flowchart for I2C master transmitter transfer sequence for N > 255 bytes.
graph TD; Start([Master transmission]) --> Init[Master initialization]; Init --> Config["NBYTES = 0xFF; N=N-255<br/>RELOAD = 1<br/>Configure slave address<br/>Set I2C_CR2.START"]; Config --> LoopStart(( )); LoopStart --> NACKF{I2C_ISR.NACKF = 1?}; NACKF -- Yes --> End1([End]); NACKF -- No --> TXIS{I2C_ISR.TXIS = 1?}; TXIS -- No --> LoopStart; TXIS -- Yes --> Write[Write I2C_TXDR]; Write --> Transmitted{NBYTES transmitted ?}; Transmitted -- No --> LoopStart; Transmitted -- Yes --> TC{I2C_ISR.TC = 1?}; TC -- Yes --> SetStart["Set I2C_CR2.START<br/>with slave address<br/>NBYTES ..."]; SetStart -.-> Dots[...]; Dots --> TCR{I2C_ISR.TCR = 1?}; TC -- No --> TCR; TCR -- Yes --> End2([End]); TCR -- No --> Reconfig["IF N < 256<br/>NBYTES = N; N = 0; RELOAD = 0<br/>AUTOEND = 0 for RESTART; 1 for STOP<br/>ELSE<br/>NBYTES = 0xFF; N = N-255<br/>RELOAD = 1"]; Reconfig --> LoopStart;

The flowchart illustrates the transfer sequence for an I2C master transmitter when the number of bytes to transmit (N) is greater than 255. It begins with 'Master transmission' leading to 'Master initialization'. The initialization block sets NBYTES to 0xFF, N to N-255, RELOAD to 1, configures the slave address, and sets the I2C_CR2.START bit. The main loop starts with a decision 'I2C_ISR.NACKF = 1?'. If 'Yes', the process ends. If 'No', it proceeds to 'I2C_ISR.TXIS = 1?'. If 'No', it loops back to the start of the loop. If 'Yes', it proceeds to 'Write I2C_TXDR'. After writing, it checks 'NBYTES transmitted ?'. If 'No', it loops back. If 'Yes', it checks 'I2C_ISR.TC = 1?'. If 'Yes', it proceeds to 'Set I2C_CR2.START with slave address NBYTES ...', followed by a vertical ellipsis. If 'No', it checks 'I2C_ISR.TCR = 1?'. If 'Yes', it ends. If 'No', it proceeds to a configuration block: 'IF N < 256, NBYTES = N; N = 0; RELOAD = 0; AUTOEND = 0 for RESTART; 1 for STOP ELSE NBYTES = 0xFF; N = N-255; RELOAD = 1', which then loops back to the start of the loop.

Flowchart for I2C master transmitter transfer sequence for N > 255 bytes.

MS19861V3

Figure 314. Transfer bus diagrams for I2C master transmitter (mandatory events only)

Timing diagram for I2C master transmitter in automatic stop mode. The sequence starts with a START (S) and Address (reception) block, followed by Acknowledge (A, reception). Then, data1 (transmission) is sent, followed by A (reception). Then, data2 (transmission) is sent, followed by A (reception). Finally, a STOP (P) is generated. Events are marked: INIT at the start, EV1 (TXIS) after the first A, EV2 (TXIS) after data1, and TXIS after data2. The TXE line is high during transmission. The NBYTES register is set to 2. Timing diagram for I2C master transmitter in software end mode. The sequence starts with a START (S) and Address (reception) block, followed by Acknowledge (A, reception). Then, data1 (transmission) is sent, followed by A (reception). Then, data2 (transmission) is sent, followed by A (reception). A TC (Transfer Complete) event occurs after the second A. Then, a ReSTART (ReS) and Address (reception) block is sent, marked by EV3. The TXE line is high during transmission. The NBYTES register is set to 2.

Example I2C master transmitter 2 bytes, automatic end mode (STOP)

legend:
transmission
reception
SCL stretch

INIT: program Slave address, program NBYTES = 2, AUTOEND=1, set START
EV1: TXIS ISR: wr data1
EV2: TXIS ISR: wr data2

Example I2C master transmitter 2 bytes, software end mode (RESTART)

legend:
transmission
reception
SCL stretch

INIT: program Slave address, program NBYTES = 2, AUTOEND=0, set START
EV1: TXIS ISR: wr data1
EV2: TXIS ISR: wr data2
EV3: TC ISR: program Slave address, program NBYTES = N, set START

MS19862V2

Timing diagram for I2C master transmitter in automatic stop mode. The sequence starts with a START (S) and Address (reception) block, followed by Acknowledge (A, reception). Then, data1 (transmission) is sent, followed by A (reception). Then, data2 (transmission) is sent, followed by A (reception). Finally, a STOP (P) is generated. Events are marked: INIT at the start, EV1 (TXIS) after the first A, EV2 (TXIS) after data1, and TXIS after data2. The TXE line is high during transmission. The NBYTES register is set to 2. Timing diagram for I2C master transmitter in software end mode. The sequence starts with a START (S) and Address (reception) block, followed by Acknowledge (A, reception). Then, data1 (transmission) is sent, followed by A (reception). Then, data2 (transmission) is sent, followed by A (reception). A TC (Transfer Complete) event occurs after the second A. Then, a ReSTART (ReS) and Address (reception) block is sent, marked by EV3. The TXE line is high during transmission. The NBYTES register is set to 2.

Master receiver

In the case of a read transfer, the RXNE flag is set after each byte reception, after the eighth SCL pulse. An RXNE event generates an interrupt if the RXIE bit of the I2C_CR1 register is set. The flag is cleared when I2C_RXDR is read.

If the total number of data bytes to receive is greater than 255, select the reload mode, by setting the RELOAD bit of the I2C_CR2 register. In this case, when the NBBYTES[7:0] number of data bytes is transferred, the TCR flag is set and the SCL line is stretched low until NBBYTES[7:0] is written with a non-zero value.

When RELOAD = 0 and the number of data bytes defined in NBBYTES[7:0] is transferred:

Figure 315. Transfer sequence flow for I2C master receiver, N ≤ 255 bytes

Flowchart for I2C master receiver transfer sequence. It starts with 'Master reception', followed by 'Master initialization', then a block with 'NBYTES = N', 'AUTOEND' settings, 'Configure slave address', and 'Set I2C_CR2.START'. A loop begins with a decision 'I2C_ISR.RXNE = 1?'. If 'No', it loops back to the start of the loop. If 'Yes', it goes to 'Read I2C_RXDR'. Next is a decision 'NBYTES received?'. If 'No', it loops back to the start of the loop. If 'Yes', it goes to a decision 'I2C_ISR.TC = 1?'. If 'Yes', it goes to 'Set I2C_CR2.START with slave address NBYTES ...'. If 'No', it goes to 'End'. A dashed line indicates continuation from the 'Set I2C_CR2.START' block.
graph TD; Start([Master reception]) --> Init[Master initialization]; Init --> Config["NBYTES = N<br/>AUTOEND = 0 for RESTART; 1 for STOP<br/>Configure slave address<br/>Set I2C_CR2.START"]; Config --> RXNE{"I2C_ISR.RXNE<br/>= 1?"}; RXNE -- No --> RXNE; RXNE -- Yes --> Read[Read I2C_RXDR]; Read --> NBYTES{"NBYTES<br/>received?"}; NBYTES -- No --> RXNE; NBYTES -- Yes --> TC{"I2C_ISR.TC<br/>= 1?"}; TC -- Yes --> SetStart["Set I2C_CR2.START with<br/>slave address NBYTES ..."]; TC -- No --> End([End]); SetStart -.-> Dots[...];
Flowchart for I2C master receiver transfer sequence. It starts with 'Master reception', followed by 'Master initialization', then a block with 'NBYTES = N', 'AUTOEND' settings, 'Configure slave address', and 'Set I2C_CR2.START'. A loop begins with a decision 'I2C_ISR.RXNE = 1?'. If 'No', it loops back to the start of the loop. If 'Yes', it goes to 'Read I2C_RXDR'. Next is a decision 'NBYTES received?'. If 'No', it loops back to the start of the loop. If 'Yes', it goes to a decision 'I2C_ISR.TC = 1?'. If 'Yes', it goes to 'Set I2C_CR2.START with slave address NBYTES ...'. If 'No', it goes to 'End'. A dashed line indicates continuation from the 'Set I2C_CR2.START' block.

MS19863V2

Figure 316. Transfer sequence flow for I2C master receiver, N > 255 bytes

Flowchart for I2C master receiver transfer sequence for N > 255 bytes.
graph TD; Start([Master reception]) --> Init[Master initialization]; Init --> Config["NBYTES = 0xFF; N=N-255<br>RELOAD =1<br>Configure slave address<br>Set I2C_CR2.START"]; Config --> RXNE{I2C_ISR.RXNE =1?}; RXNE -- No --> End([End]); RXNE -- Yes --> Read[Read I2C_RXDR]; Read --> Received{NBYTES received?}; Received -- No --> End; Received -- Yes --> TC{I2C_ISR.TC = 1?}; TC -- Yes --> SetStart["Set I2C_CR2.START with<br>slave address NBYTES ..."]; SetStart --> Dots[...]; Dots --> TCR{I2C_ISR.TCR = 1?}; TC -- No --> TCR; TCR -- Yes --> IFN["IF N< 256<br>NBYTES =N; N=0;RELOAD=0<br>AUTOEND=0 for RESTART; 1 for STOP<br>ELSE<br>NBYTES =0xFF;N=N-255<br>RELOAD=1"]; TCR -- No --> End; IFN --> End; IFN --> Config;

The flowchart illustrates the transfer sequence for an I2C master receiver when the number of bytes to receive (N) is greater than 255. It begins with 'Master reception', followed by 'Master initialization'. The initialization block sets NBYTES to 0xFF, N to N-255, RELOAD to 1, configures the slave address, and sets the I2C_CR2.START bit. A loop begins with a decision 'I2C_ISR.RXNE =1?'. If 'No', the process ends. If 'Yes', it proceeds to 'Read I2C_RXDR'. Next is a decision 'NBYTES received?'. If 'No', the process ends. If 'Yes', it proceeds to 'I2C_ISR.TC = 1?'. If 'Yes', it goes to 'Set I2C_CR2.START with slave address NBYTES ...', followed by a vertical ellipsis. If 'No', it proceeds to 'I2C_ISR.TCR = 1?'. If 'Yes', it enters a block: 'IF N < 256, NBYTES =N; N=0;RELOAD=0, AUTOEND=0 for RESTART; 1 for STOP, ELSE, NBYTES =0xFF;N=N-255, RELOAD=1'. Both the ellipsis and this block lead to the 'End' state. The 'IF N < 256' block also loops back to the initialization configuration block.

Flowchart for I2C master receiver transfer sequence for N > 255 bytes.

MS19864V2

Figure 317. Transfer bus diagrams for I2C master receiver (mandatory events only)

Diagram of I2C master receiver in automatic end mode (STOP). The sequence starts with INIT, followed by S (Start), Address, A (Acknowledge), data1, A, data2, NA (Not Acknowledge), and P (Stop). RXNE flags are shown above the Acknowledge and Not Acknowledge points. EV1 and EV2 are marked below the Acknowledge and Not Acknowledge points. NBBYTES is set to 2. Legend: transmission (white), reception (yellow), SCL stretch (blue line). Diagram of I2C master receiver in software end mode (RESTART). The sequence starts with INIT, followed by S (Start), Address, A (Acknowledge), data1, A, data2, NA (Not Acknowledge), ReS (Restart), and Address. RXNE flags are shown above the Acknowledge and Not Acknowledge points. EV1 and EV2 are marked below the Acknowledge and Not Acknowledge points. TC is marked above the Not Acknowledge point. NBBYTES is shown as xx, 2, and N. Legend: transmission (white), reception (yellow), SCL stretch (blue line).

Example I2C master receiver 2 bytes, automatic end mode (STOP)

INIT: program Slave address, program NBBYTES = 2, AUTOEND=1, set START
EV1: RXNE ISR: rd data1
EV2: RXNE ISR: rd data2

Example I2C master receiver 2 bytes, software end mode (RESTART)

INIT: program Slave address, program NBBYTES = 2, AUTOEND=0, set START
EV1: RXNE ISR: rd data1
EV2: RXNE ISR: read data2
EV3: TC ISR: program Slave address, program NBBYTES = N, set START

MS19865V1

Diagram of I2C master receiver in automatic end mode (STOP). The sequence starts with INIT, followed by S (Start), Address, A (Acknowledge), data1, A, data2, NA (Not Acknowledge), and P (Stop). RXNE flags are shown above the Acknowledge and Not Acknowledge points. EV1 and EV2 are marked below the Acknowledge and Not Acknowledge points. NBBYTES is set to 2. Legend: transmission (white), reception (yellow), SCL stretch (blue line). Diagram of I2C master receiver in software end mode (RESTART). The sequence starts with INIT, followed by S (Start), Address, A (Acknowledge), data1, A, data2, NA (Not Acknowledge), ReS (Restart), and Address. RXNE flags are shown above the Acknowledge and Not Acknowledge points. EV1 and EV2 are marked below the Acknowledge and Not Acknowledge points. TC is marked above the Not Acknowledge point. NBBYTES is shown as xx, 2, and N. Legend: transmission (white), reception (yellow), SCL stretch (blue line).

28.4.10 I2C_TIMINGR register configuration examples

The following tables provide examples of how to program the I2C_TIMINGR to obtain timings compliant with the I 2 C-bus specification. To get more accurate configuration values, use the STM32CubeMX tool ( I2C Configuration window).

Table 149. Timing settings for\( f_{I2CCLK} \) of 8 MHz
ParameterStandard-mode (Sm)Fast-mode (Fm)Fast-mode Plus (Fm+)
10 kHz100 kHz400 kHz500 kHz
PRESC[3:0]0x10x10x00x0
SCLL[7:0]0xC70x130x90x6
\( t_{SCLL} \)200 x 250 ns = 50 µs20 x 250 ns = 5.0 µs10 x 125 ns = 1250 ns7 x 125 ns = 875 ns
SCLH[7:0]0xC30xF0x30x3
\( t_{SCLH} \)196 x 250 ns = 49 µs16 x 250 ns = 4.0 µs4 x 125 ns = 500 ns4 x 125 ns = 500 ns
\( t_{SCL}^{(1)} \)~100 µs (2)~10 µs (2)~2.5 µs (3)~2.0 µs (4)
SDADEL[3:0]0x20x20x10x0
\( t_{SDADEL} \)2 x 250 ns = 500 ns2 x 250 ns = 500 ns1 x 125 ns = 125 ns0 ns
SCLDEL[3:0]0x40x40x30x1
\( t_{SCLDEL} \)5 x 250 ns = 1250 ns5 x 250 ns = 1250 ns4 x 125 ns = 500 ns2 x 125 ns = 250 ns
  1. 1. \( t_{SCL} \) is greater than \( t_{SCLL} + t_{SCLH} \) due to SCL internal detection delay. Values provided for \( t_{SCL} \) are examples only.
  2. 2. \( t_{SYNC1} + t_{SYNC2} \) minimum value is \( 4 \times f_{I2CCLK} = 500 \) ns. Example with \( t_{SYNC1} + t_{SYNC2} = 1000 \) ns.
  3. 3. \( t_{SYNC1} + t_{SYNC2} \) minimum value is \( 4 \times f_{I2CCLK} = 500 \) ns. Example with \( t_{SYNC1} + t_{SYNC2} = 750 \) ns.
  4. 4. \( t_{SYNC1} + t_{SYNC2} \) minimum value is \( 4 \times f_{I2CCLK} = 500 \) ns. Example with \( t_{SYNC1} + t_{SYNC2} = 655 \) ns.
Table 150. Timing settings for\( f_{I2CCLK} \) of 16 MHz
ParameterStandard-mode (Sm)Fast-mode (Fm)Fast-mode Plus (Fm+)
10 kHz100 kHz400 kHz1000 kHz
PRESC[3:0]0x30x30x10x0
SCLL[7:0]0xC70x130x90x4
\( t_{SCLL} \)200 x 250 ns = 50 µs20 x 250 ns = 5.0 µs10 x 125 ns = 1250 ns5 x 62.5 ns = 312.5 ns
SCLH[7:0]0xC30xF0x30x2
\( t_{SCLH} \)196 x 250 ns = 49 µs16 x 250 ns = 4.0 µs4 x 125 ns = 500 ns3 x 62.5 ns = 187.5 ns
\( t_{SCL}^{(1)} \)~100 µs (2)~10 µs (2)~2.5 µs (3)~1.0 µs (4)
SDADEL[3:0]0x20x20x20x0
\( t_{SDADEL} \)2 x 250 ns = 500 ns2 x 250 ns = 500 ns2 x 125 ns = 250 ns0 ns
SCLDEL[3:0]0x40x40x30x2
\( t_{SCLDEL} \)5 x 250 ns = 1250 ns5 x 250 ns = 1250 ns4 x 125 ns = 500 ns3 x 62.5 ns = 187.5 ns
  1. 1. \( t_{SCL} \) is greater than \( t_{SCLL} + t_{SCLH} \) due to SCL internal detection delay. Values provided for \( t_{SCL} \) are examples only.
  2. 2. \( t_{SYNC1} + t_{SYNC2} \) minimum value is \( 4 \times f_{I2CCLK} = 250 \) ns. Example with \( t_{SYNC1} + t_{SYNC2} = 1000 \) ns.
  3. 3. \( t_{SYNC1} + t_{SYNC2} \) minimum value is \( 4 \times f_{I2CCLK} = 250 \) ns. Example with \( t_{SYNC1} + t_{SYNC2} = 750 \) ns.
  4. 4. \( t_{SYNC1} + t_{SYNC2} \) minimum value is \( 4 \times f_{I2CCLK} = 250 \) ns. Example with \( t_{SYNC1} + t_{SYNC2} = 500 \) ns.
Table 151. Timing settings for\( f_{I2CCLK} \) of 48 MHz
ParameterStandard-mode (Sm)Fast-mode (Fm)Fast-mode Plus (Fm+)
10 kHz100 kHz400 kHz1000 kHz
PRESC[3:0]0xB0xB0x50x5
SCLL[7:0]0xC70x130x90x3
\( t_{SCLL} \)200 x 250 ns = 50 µs20 x 250 ns = 5.0 µs10 x 125 ns = 1250 ns4 x 125 ns = 500 ns
SCLH[7:0]0xC30xF0x30x1
\( t_{SCLH} \)196 x 250 ns = 49 µs16 x 250 ns = 4.0 µs4 x 125 ns = 500 ns2 x 125 ns = 250 ns
\( t_{SCL}^{(1)} \)~100 µs (2)~10 µs (2)~2.5 µs (3)~875 ns (4)
SDADEL[3:0]0x20x20x30x0
\( t_{SDADEL} \)2 x 250 ns = 500 ns2 x 250 ns = 500 ns3 x 125 ns = 375 ns0 ns
SCLDEL[3:0]0x40x40x30x1
\( t_{SCLDEL} \)5 x 250 ns = 1250 ns5 x 250 ns = 1250 ns4 x 125 ns = 500 ns2 x 125 ns = 250 ns

1. \( t_{SCL} \) is greater than \( t_{SCLL} + t_{SCLH} \) due to the SCL internal detection delay. Values provided for \( t_{SCL} \) are only examples.

2. \( t_{SYNC1} + t_{SYNC2} \) minimum value is \( 4 \times t_{I2CCLK} = 83.3 \) ns. Example with \( t_{SYNC1} + t_{SYNC2} = 1000 \) ns

3. \( t_{SYNC1} + t_{SYNC2} \) minimum value is \( 4 \times t_{I2CCLK} = 83.3 \) ns. Example with \( t_{SYNC1} + t_{SYNC2} = 750 \) ns

4. \( t_{SYNC1} + t_{SYNC2} \) minimum value is \( 4 \times t_{I2CCLK} = 83.3 \) ns. Example with \( t_{SYNC1} + t_{SYNC2} = 250 \) ns

28.4.11 SMBus specific features

Introduction

The system management bus (SMBus) is a two-wire interface through which various devices can communicate with each other and with the rest of the system. It is based on operation principles of the I 2 C-bus. The SMBus provides a control bus for system and power management related tasks.

The I2C peripheral is compatible with the SMBus specification ( http://smbus.org ).

The system management bus specification refers to three types of devices:

The I2C peripheral can be configured as a master or a slave device, and also as a host.

Bus protocols

There are eleven possible command protocols for any given device. A device can use any or all of them to communicate. The protocols are: Quick Command , Send Byte , Receive Byte , Write Byte , Write Word , Read Byte , Read Word , Process Call , Block Read , Block Write , and Block Write-Block Read Process Call . The protocols must be implemented by the user software.

For more details on these protocols, refer to the SMBus specification ( http://smbus.org ). STM32CubeMX implements an SMBus stack thanks to X-CUBE-SMBUS, a downloadable software pack that allows basic SMBus configuration per I2C instance.

Address resolution protocol (ARP)

SMBus slave address conflicts can be resolved by dynamically assigning a new unique address to each slave device. To provide a mechanism to isolate each device for the purpose of address assignment, each device must implement a unique 128-bit device identifier (UDID). In the I2C peripheral, is implemented by software.

The I2C peripheral supports the Address resolution protocol (ARP). The SMBus device default address (0b1100 001) is enabled by setting the SMBDEN bit of the I2C_CR1 register. The ARP commands must be implemented by the user software.

Arbitration is also performed in slave mode for ARP support.

For more details on the SMBus address resolution protocol, refer to the SMBus specification ( http://smbus.org ).

Received command and data acknowledge control

A SMBus receiver must be able to NACK each received command or data. In order to allow the ACK control in slave mode, the slave byte control mode must be enabled, by setting the SBC bit of the I2C_CR1 register. Refer to Slave byte control mode for more details.

Host notify protocol

To enable the host notify protocol, set the SMBHEN bit of the I2C_CR1 register. The I2C peripheral then acknowledges the SMBus host address (0b0001 000).

When this protocol is used, the device acts as a master and the host as a slave.

SMBus alert

The I2C peripheral supports the SMBALERT# optional signal through the SMBA pin. With the SMBALERT# signal, an SMBus slave device can signal to the SMBus host that it wants to talk. The host processes the interrupt and simultaneously accesses all SMBALERT# devices through the alert response address (0b0001 100). Only the device/devices which pulled SMBALERT# low acknowledges/acknowledge the alert response address.

When the I2C peripheral is configured as an SMBus slave device (SMBHEN = 0), the SMBA pin is pulled low by setting the ALERTEN bit of the I2C_CR1 register. The alert response address is enabled at the same time.

When the I2C peripheral is configured as an SMBus host (SMBHEN = 1), the ALERT flag of the I2C_ISR register is set when a falling edge is detected on the SMBA pin and ALERTEN = 1. An interrupt is generated if the ERRIE bit of the I2C_CR1 register is set. When ALERTEN = 0, the alert line is considered high even if the external SMBA pin is low.

Note: If the SMBus alert pin is not required, keep the ALERTEN bit cleared. The SMBA pin can then be used as a standard GPIO.

Packet error checking

A packet error checking mechanism introduced in the SMBus specification improves reliability and communication robustness. The packet error checking is implemented by appending a packet error code (PEC) at the end of each message transfer. The PEC is

calculated by using the \( C(x) = x^8 + x^2 + x + 1 \) CRC-8 polynomial on all the message bytes (including addresses and read/write bits).

The I2C peripheral embeds a hardware PEC calculator and allows a not acknowledge to be sent automatically when the received byte does not match the hardware calculated PEC.

Timeouts

To comply with the SMBus timeout specifications, the I2C peripheral embeds hardware timers.

Table 152. SMBus timeout specifications

SymbolParameterLimitsUnit
MinMax
\( t_{\text{TIMEOUT}} \)Detect clock low timeout2535ms
\( t_{\text{LOW:SEXT}}^{(1)} \)Cumulative clock low extend time (slave device)-25
\( t_{\text{LOW:MEXT}}^{(2)} \)Cumulative clock low extend time (master device)-10
  1. \( t_{\text{LOW:SEXT}} \) is the cumulative time a given slave device is allowed to extend the clock cycles in one message from the initial START to the STOP. It is possible that another slave device or the master also extends the clock causing the combined clock low extend time to be greater than \( t_{\text{LOW:SEXT}} \) . Therefore, this parameter is measured with the slave device as the sole target of a full-speed master.
  2. \( t_{\text{LOW:MEXT}} \) is the cumulative time a master device is allowed to extend its clock cycles within each byte of a message as defined from START-to-ACK, ACK-to-ACK, or ACK-to-STOP. It is possible that a slave device or another master also extends the clock, causing the combined clock low time to be greater than \( t_{\text{LOW:MEXT}} \) on a given byte. Therefore, this parameter is measured with a full speed slave device as the sole target of the master.

Figure 318. Timeout intervals for \( t_{\text{LOW:SEXT}} \) , \( t_{\text{LOW:MEXT}} \)

Timing diagram showing SMBCLK and SMBDAT signals. The diagram illustrates the timeout intervals for t_LOW:SEXT and t_LOW:MEXT. t_LOW:SEXT is the cumulative time from the initial START to the STOP. t_LOW:MEXT is the cumulative time within each byte of a message, measured from START-to-ACK, ACK-to-ACK, or ACK-to-STOP. The diagram shows the clock signal (SMBCLK) and data signal (SMBDAT) with various transitions and ACK signals (ClkAck).

The diagram shows two signal lines: SMBCLK (top) and SMBDAT (bottom). The sequence starts with a 'Start' condition and ends with a 'Stop' condition. The SMBCLK signal is shown as a square wave. The SMBDAT signal is shown as a series of pulses. The diagram includes several vertical dashed lines representing key events: 'Start', 'ClkAck' (acknowledge), and 'Stop'. The interval between the 'Start' and the first 'ClkAck' is labeled \( t_{\text{LOW:MEXT}} \) . The interval between the first 'ClkAck' and the second 'ClkAck' is also labeled \( t_{\text{LOW:MEXT}} \) . The interval between the second 'ClkAck' and the 'Stop' condition is labeled \( t_{\text{LOW:MEXT}} \) . The total interval from 'Start' to 'Stop' is labeled \( t_{\text{LOW:SEXT}} \) .

Timing diagram showing SMBCLK and SMBDAT signals. The diagram illustrates the timeout intervals for t_LOW:SEXT and t_LOW:MEXT. t_LOW:SEXT is the cumulative time from the initial START to the STOP. t_LOW:MEXT is the cumulative time within each byte of a message, measured from START-to-ACK, ACK-to-ACK, or ACK-to-STOP. The diagram shows the clock signal (SMBCLK) and data signal (SMBDAT) with various transitions and ACK signals (ClkAck).

MS19866V1

Bus idle detection

A master can assume that the bus is free if it detects that the clock and data signals have been high for \( t_{\text{IDLE}} > t_{\text{HIGH,MAX}} \) (refer to I2C timings ).

This timing parameter covers the condition where a master is dynamically added to the bus, and may not have detected a state transition on the SMBCLK or SMBDAT lines. In this case, the master must wait long enough to ensure that a transfer is not currently in progress. The I2C peripheral supports a hardware bus idle detection.

28.4.12 SMBus initialization

In addition to the I2C initialization for the I 2 C-bus, the use of the peripheral for the SMBus communication requires some extra initialization steps.

Received command and data acknowledge control (slave mode)

An SMBus receiver must be able to NACK each received command or data. To allow ACK control in slave mode, the slave byte control mode must be enabled, by setting the SBC bit of the I2C_CR1 register. Refer to Slave byte control mode for more details.

Specific addresses (slave mode)

The specific SMBus addresses must be enabled if required. Refer to Bus idle detection for more details.

The SMBus device default address (0b1100 001) is enabled by setting the SMBDEN bit of the I2C_CR1 register.

The SMBus host address (0b0001 000) is enabled by setting the SMBHEN bit of the I2C_CR1 register.

The alert response address (0b0001100) is enabled by setting the ALERTEN bit of the I2C_CR1 register.

Packet error checking

PEC calculation is enabled by setting the PECEN bit of the I2C_CR1 register. Then the PEC transfer is managed with the help of the hardware byte counter associated with the NBBYTES[7:0] bitfield of the I2C_CR2 register. The PECEN bit must be configured before enabling the I2C.

The PEC transfer is managed with the hardware byte counter, so the SBC bit must be set when interfacing the SMBus in slave mode. The PEC is transferred after transferring NBBYTES[7:0] - 1 data bytes, if the PECBYTE bit is set and the RELOAD bit is cleared. If RELOAD is set, PECBYTE has no effect.

Caution: Changing the PECEN configuration is not allowed when the I2C peripheral is enabled.

Table 153. SMBus with PEC configuration

ModeSBC bitRELOAD bitAUTOEND bitPECBYTE bit
Master Tx/Rx NBBYTES + PEC+ STOPX011
Master Tx/Rx NBBYTES + PEC + ReSTARTX001
Slave Tx/Rx with PEC10X1

Timeout detection

The timeout detection is enabled by setting the TIMOUTEN and TEXTEN bits of the I2C_TIMEOUTR register. The timers must be programmed in such a way that they detect a timeout before the maximum time given in the SMBus specification.

\( t_{\text{TIMEOUT}} \) check

To check the \( t_{\text{TIMEOUT}} \) parameter, load the 12-bit TIMEOUTA[11:0] bitfield with the timer reload value. Keep the TIDLE bit at 0 to detect the SCL low level timeout.

Then set the TIMOUTEN bit of the I2C_TIMEOUTR register, to enable the timer.

If SCL is tied low for longer than the \( (\text{TIMEOUTA} + 1) \times 2048 \times t_{\text{I2CCLK}} \) period, the TIMEOUT flag of the I2C_ISR register is set.

Refer to Table 154 .

Caution: Changing the TIMEOUTA[11:0] bitfield and the TIDLE bit values is not allowed when the TIMOUTEN bit is set.

\( t_{\text{LOW:SEXT}} \) and \( t_{\text{LOW:MEXT}} \) check

A 12-bit timer associated with the TIMEOUTB[11:0] bitfield allows checking \( t_{\text{LOW:SEXT}} \) for the I2C peripheral operating as a slave, or \( t_{\text{LOW:MEXT}} \) when it operates as a master. As the standard only specifies a maximum, the user can choose the same value for both. The timer is then enabled by setting the TEXTEN bit in the I2C_TIMEOUTR register.

If the SMBus peripheral performs a cumulative SCL stretch for longer than the \( (\text{TIMEOUTB} + 1) \times 2048 \times t_{\text{I2CCLK}} \) period, and within the timeout interval described in Bus idle detection section, the TIMEOUT flag of the I2C_ISR register is set.

Refer to Table 155 .

Caution: Changing the TIMEOUTB[11:0] bitfield value is not allowed when the TEXTEN bit is set.

Bus idle detection

To check the \( t_{\text{IDLE}} \) period, the TIMEOUTA[11:0] bitfield associated with 12-bit timer must be loaded with the timer reload value. Keep the TIDLE bit at 1 to detect both SCL and SDA high level timeout. Then set the TIMOUTEN bit of the I2C_TIMEOUTR register to enable the timer.

If both the SCL and SDA lines remain high for longer than the \( (\text{TIMEOUTA} + 1) \times 4 \times t_{\text{I2CCLK}} \) period, the TIMEOUT flag of the I2C_ISR register is set.

Refer to Table 156 .

Caution: Changing the TIMEOUTA[11:0] bitfield and the TIDLE bit values is not allowed when the TIMOUTEN bit is set.

28.4.13 SMBus I2C_TIMEOUTR register configuration examples

The following tables provide examples of settings to reach target \( t_{\text{TIMEOUT}} \) , \( t_{\text{LOW:SEXT}} \) , \( t_{\text{LOW:MEXT}} \) , and \( t_{\text{TIDLE}} \) timings at different \( f_{\text{I2CCLK}} \) frequencies.

Table 154. TIMEOUTA[11:0] for maximum \( t_{\text{TIMEOUT}} \) of 25 ms

\( f_{\text{I2CCLK}} \)TIMEOUTA[11:0]TIDLETIMEOUTEN\( t_{\text{TIMEOUT}} \)
8 MHz0x6101\( 98 \times 2048 \times 125 \text{ ns} = 25 \text{ ms} \)
16 MHz0xC301\( 196 \times 2048 \times 62.5 \text{ ns} = 25 \text{ ms} \)
48 MHz0x24901\( 586 \times 2048 \times 20.08 \text{ ns} = 25 \text{ ms} \)

Table 155. TIMEOUTB[11:0] for maximum \( t_{\text{LOW:SEXT}} \) and \( t_{\text{LOW:MEXT}} \) of 8 ms

\( f_{\text{I2CCLK}} \)TIMEOUTB[11:0]TEXTEN\( t_{\text{LOW:SEXT}} \)
\( t_{\text{LOW:MEXT}} \)
8 MHz0x1F1\( 32 \times 2048 \times 125 \text{ ns} = 8 \text{ ms} \)
16 MHz0x3F1\( 64 \times 2048 \times 62.5 \text{ ns} = 8 \text{ ms} \)
48 MHz0xBB1\( 188 \times 2048 \times 20.08 \text{ ns} = 8 \text{ ms} \)

Table 156. TIMEOUTA[11:0] for maximum \( t_{\text{TIDLE}} \) of 50 \( \mu\text{s} \)

\( f_{\text{I2CCLK}} \)TIMEOUTA[11:0]TIDLETIMEOUTEN\( t_{\text{TIDLE}} \)
8 MHz0x6311\( 100 \times 4 \times 125 \text{ ns} = 50 \mu\text{s} \)
16 MHz0xC711\( 200 \times 4 \times 62.5 \text{ ns} = 50 \mu\text{s} \)
48 MHz0x25711\( 600 \times 4 \times 20.08 \text{ ns} = 50 \mu\text{s} \)

28.4.14 SMBus slave mode

In addition to I2C slave transfer management (refer to Section 28.4.8: I2C slave mode ), this section provides extra software flowcharts to support SMBus.

SMBus slave transmitter

When using the I2C peripheral in SMBus mode, set the SBC bit to enable the PEC transmission at the end of the programmed number of data bytes. When the PECBYTE bit is set, the number of bytes programmed in NBBYTES[7:0] includes the PEC transmission. In that case, the total number of TXIS interrupts is NBBYTES[7:0] - 1, and the content of the I2C_PECR register is automatically transmitted if the master requests an extra byte after the transfer of the NBBYTES[7:0] - 1 data bytes.

Caution: The PECBYTE bit has no effect when the RELOAD bit is set.

Figure 319. Transfer sequence flow for SMBus slave transmitter N bytes + PEC

Flowchart for SMBus slave transmitter N bytes + PEC. The process starts with 'SMBus slave transmission', followed by 'Slave initialization'. A loop exists for 'SCL stretched' if I2C_ISR.ADDR is not 1. Once ADDR=1, it reads ADDCODE and DIR, sets I2C_CR2.NBYTES = N + 1, PECBYTE=1, and sets I2C_ICR.ADDRCF. Another loop exists for TXIS if I2C_ISR.TXIS is not 1. Once TXIS=1, it writes I2C_TXDR.TXDATA and loops back to the TXIS check.
graph TD
    Start([SMBus slave transmission]) --> Init[Slave initialization]
    Init --> ADDR{I2C_ISR.ADDR = 1?}
    ADDR -- No --> Stretched[SCL stretched]
    Stretched --> ADDR
    ADDR -- Yes --> Config[Read ADDCODE and DIR in I2C_ISR
I2C_CR2.NBYTES = N + 1
PECBYTE=1
Set I2C_ICR.ADDRCF] Config --> TXIS{I2C_ISR.TXIS = 1?} TXIS -- No --> TXIS TXIS -- Yes --> Write[Write I2C_TXDR.TXDATA] Write --> TXIS
Flowchart for SMBus slave transmitter N bytes + PEC. The process starts with 'SMBus slave transmission', followed by 'Slave initialization'. A loop exists for 'SCL stretched' if I2C_ISR.ADDR is not 1. Once ADDR=1, it reads ADDCODE and DIR, sets I2C_CR2.NBYTES = N + 1, PECBYTE=1, and sets I2C_ICR.ADDRCF. Another loop exists for TXIS if I2C_ISR.TXIS is not 1. Once TXIS=1, it writes I2C_TXDR.TXDATA and loops back to the TXIS check.

Figure 320. Transfer bus diagram for SMBus slave transmitter (SBC = 1)

Transfer bus diagram for SMBus slave transmitter (SBC = 1). It shows a sequence of events: S (Start), Address (reception), A (ACK), data1 (transmission), A (ACK), data2 (transmission), A (ACK), PEC (reception), NA (NACK), P (Stop). Interrupts are triggered at ADDR (EV1), TXIS (EV2), and TXIS (EV3). NBYTES is set to 3.

Example SMBus slave transmitter 2 bytes + PEC,

legend:
transmission (white box)
reception (yellow box)
SCL stretch (blue line)

Sequence: S Address A data1 A data2 A PEC NA P

Events: EV1 (ADDR ISR), EV2 (TXIS ISR), EV3 (TXIS ISR)

NBYTES: 3

EV1: ADDR ISR: check ADDCODE, program NBYTES=3, set PECBYTE, set ADDRCF
EV2: TXIS ISR: wr data1
EV3: TXIS ISR: wr data2

Transfer bus diagram for SMBus slave transmitter (SBC = 1). It shows a sequence of events: S (Start), Address (reception), A (ACK), data1 (transmission), A (ACK), data2 (transmission), A (ACK), PEC (reception), NA (NACK), P (Stop). Interrupts are triggered at ADDR (EV1), TXIS (EV2), and TXIS (EV3). NBYTES is set to 3.

SMBus slave receiver

When using the I2C peripheral in SMBus mode, set the SBC bit to enable the PEC checking at the end of the programmed number of data bytes. To allow the ACK control of each byte, the reload mode must be selected (RELOAD = 1). Refer to Slave byte control mode for more details.

To check the PEC byte, the RELOAD bit must be cleared and the PECBYTE bit must be set. In this case, after the receipt of NBBYTES[7:0] - 1 data bytes, the next received byte is compared with the internal I2C_PECR register content. A NACK is automatically generated if the comparison does not match, and an ACK is automatically generated if the comparison matches, whatever the ACK bit value. Once the PEC byte is received, it is copied into the I2C_RXDR register like any other data, and the RXNE flag is set.

Upon a PEC mismatch, the PECERR flag is set and an interrupt is generated if the ERRIE bit of the I2C_CR1 register is set.

If no ACK software control is required, the user can set the PECBYTE bit and, in the same write operation, load NBBYTES[7:0] with the number of bytes to receive in a continuous flow. After the receipt of NBBYTES[7:0] - 1 bytes, the next received byte is checked as being the PEC.

Caution: The PECBYTE bit has no effect when the RELOAD bit is set.

Figure 321. Transfer sequence flow for SMBus slave receiver N bytes + PEC

Flowchart showing the transfer sequence flow for SMBus slave receiver N bytes + PEC. The process starts with SMBus slave reception, followed by slave initialization. It then enters a loop checking for an address match (I2C_ISR.ADDR = 1). If no match, it loops back to initialization. If a match, it reads ADDCODE and DIR, sets I2C_CR2.NBYTES to 1, RELOAD to 1, PECBYTE to 1, and sets I2C_ICR.ADDRCF. A note indicates SCL is stretched here. It then checks if I2C_ISR.RXNE = 1 or I2C_ISR.TCR = 1. If no, it loops back to the address match check. If yes, it reads I2C_RXDR.RXDATA, programs I2C_CR2.NACK to 0, I2C_CR2.NBYTES to 1, and decrements N. It then checks if N = 1. If no, it loops back to the RXNE/TCR check. If yes, it reads I2C_RXDR.RXDATA, programs RELOAD to 0, NACK to 0, and NBYTES to 1. It then checks if I2C_ISR.RXNE = 1. If no, it loops back to the RXNE/TCR check. If yes, it reads I2C_RXDR.RXDATA and ends.
graph TD
    Start([SMBus slave reception]) --> Init[Slave initialization]
    Init --> AddrMatch{I2C_ISR.ADDR = 1?}
    AddrMatch -- No --> Init
    AddrMatch -- Yes --> InitParams["Read ADDCODE and DIR in I2C_ISR
I2C_CR2.NBYTES = 1, RELOAD = 1
PECBYTE = 1
Set I2C_ICR.ADDRCF"] InitParams --> RXNE_TCR{I2C_ISR.RXNE = 1?
I2C_ISR.TCR = 1?} RXNE_TCR -- No --> AddrMatch RXNE_TCR -- Yes --> ReadData1["Read I2C_RXDR.RXDATA
Program I2C_CR2.NACK = 0
I2C_CR2.NBYTES = 1
N = N - 1"] ReadData1 --> NEquals1{N = 1?} NEquals1 -- No --> RXNE_TCR NEquals1 -- Yes --> ReadData2["Read I2C_RXDR.RXDATA
Program RELOAD = 0
NACK = 0 and NBYTES = 1"] ReadData2 --> RXNE{I2C_ISR.RXNE = 1?} RXNE -- No --> RXNE_TCR RXNE -- Yes --> ReadData3[Read I2C_RXDR.RXDATA] ReadData3 --> End([End])

SCL stretched

MS19868V2

Flowchart showing the transfer sequence flow for SMBus slave receiver N bytes + PEC. The process starts with SMBus slave reception, followed by slave initialization. It then enters a loop checking for an address match (I2C_ISR.ADDR = 1). If no match, it loops back to initialization. If a match, it reads ADDCODE and DIR, sets I2C_CR2.NBYTES to 1, RELOAD to 1, PECBYTE to 1, and sets I2C_ICR.ADDRCF. A note indicates SCL is stretched here. It then checks if I2C_ISR.RXNE = 1 or I2C_ISR.TCR = 1. If no, it loops back to the address match check. If yes, it reads I2C_RXDR.RXDATA, programs I2C_CR2.NACK to 0, I2C_CR2.NBYTES to 1, and decrements N. It then checks if N = 1. If no, it loops back to the RXNE/TCR check. If yes, it reads I2C_RXDR.RXDATA, programs RELOAD to 0, NACK to 0, and NBYTES to 1. It then checks if I2C_ISR.RXNE = 1. If no, it loops back to the RXNE/TCR check. If yes, it reads I2C_RXDR.RXDATA and ends.

Figure 322. Bus transfer diagrams for SMBus slave receiver (SBC = 1)

Diagram of SMBus slave receiver transfer with 2 bytes + PEC. The sequence starts with a Start (S) and Address (yellow, reception) block, followed by an Acknowledge (A) block. Then, data1 (yellow), A, data2 (yellow), A, PEC (yellow), A, and a Stop (P) block follow. Arrows labeled ADDR, RXNE, RXNE, and RXNE point to the transitions between blocks. Event markers EV1, EV2, EV3, and EV4 point to the transitions after the first, second, and third Acknowledge blocks, and the Stop block respectively. A blue line indicates an SCL stretch after the first Acknowledge. Below the sequence, NBYTES is shown as 3. Diagram of SMBus slave receiver transfer with 2 bytes + PEC and ACK control. The sequence is similar to the first one but with different interrupt events. ADDR points to the start. RXNE,TCR points to the transitions after data1 and data2. RXNE points to the transition after the final Acknowledge. Event markers EV1, EV2, EV3, and EV4 point to the same transitions as the first diagram. A blue line indicates an SCL stretch after the first Acknowledge. Below the sequence, NBYTES is shown as 1.

Example SMBus slave receiver 2 bytes + PEC

legend:

NBYTES 3

EV1: ADDR ISR: check ADDCODE and DIR, program NBYTES = 3, PECBYTE=1, RELOAD=0, set ADDRCF
EV2: RXNE ISR: rd data1
EV3: RXNE ISR: rd data2
EV4: RXNE ISR: rd PEC

Example SMBus slave receiver 2 bytes + PEC, with ACK control (RELOAD=1/0)

legend :

NBYTES 1

EV1: ADDR ISR: check ADDCODE and DIR, program NBYTES = 1, PECBYTE=1, RELOAD=1, set ADDRCF
EV2: RXNE-TCR ISR: rd data1, program NACK=0 and NBYTES = 1
EV3: RXNE-TCR ISR: rd data2, program NACK=0, NBYTES = 1 and RELOAD=0
EV4: RXNE-TCR ISR: rd PEC

MS19870V2

Diagram of SMBus slave receiver transfer with 2 bytes + PEC. The sequence starts with a Start (S) and Address (yellow, reception) block, followed by an Acknowledge (A) block. Then, data1 (yellow), A, data2 (yellow), A, PEC (yellow), A, and a Stop (P) block follow. Arrows labeled ADDR, RXNE, RXNE, and RXNE point to the transitions between blocks. Event markers EV1, EV2, EV3, and EV4 point to the transitions after the first, second, and third Acknowledge blocks, and the Stop block respectively. A blue line indicates an SCL stretch after the first Acknowledge. Below the sequence, NBYTES is shown as 3. Diagram of SMBus slave receiver transfer with 2 bytes + PEC and ACK control. The sequence is similar to the first one but with different interrupt events. ADDR points to the start. RXNE,TCR points to the transitions after data1 and data2. RXNE points to the transition after the final Acknowledge. Event markers EV1, EV2, EV3, and EV4 point to the same transitions as the first diagram. A blue line indicates an SCL stretch after the first Acknowledge. Below the sequence, NBYTES is shown as 1.

28.4.15 SMBus master mode

In addition to I2C master transfer management (refer to Section 28.4.9: I2C master mode ), this section provides extra software flowcharts to support SMBus.

SMBus master transmitter

When the SMBus master wants to transmit the PEC, the PECBYTE bit must be set and the number of bytes must be loaded in the NBYTES[7:0] bitfield, before setting the START bit. In this case, the total number of TXIS interrupts is NBYTES[7:0] - 1. So if the PECBYTE bit is set when NBYTES[7:0] = 0x1, the content of the I2C_PECR register is automatically transmitted.

If the SMBus master wants to send a STOP condition after the PEC, the automatic end mode must be selected (AUTOEND = 1). In this case, the STOP condition automatically follows the PEC transmission.

When the SMBus master wants to send a RESTART condition after the PEC, the software mode must be selected (AUTOEND = 0). In this case, once NBBYTES[7:0] - 1 are transmitted, the I2C_PECR register content is transmitted. The TC flag is set after the PEC transmission, stretching the SCL line low. The RESTART condition must be programmed in the TC interrupt subroutine.

Caution: The PECBYTE bit has no effect when the RELOAD bit is set.

Figure 323. Bus transfer diagrams for SMBus master transmitter

Timing diagram for SMBus master transmitter in automatic end mode (STOP). The diagram shows a sequence of bytes: S (Start), Address, A (Acknowledge), data1, A, data2, A, PEC, A, P (Stop). The TXIS flag is set at the Address and data1 bytes. The TXE flag is set after data2 is written. The NBBYTES register is set to 3. The legend indicates transmission (white), reception (yellow), and SCL stretch (blue line). Timing diagram for SMBus master transmitter in software end mode (RESTART). The diagram shows a sequence of bytes: S (Start), Address, A (Acknowledge), data1, A, data2, A, PEC, A, Rstart (Restart), Address, ... The TXIS flag is set at the Address and data1 bytes. The TXE flag is set after data2 is written. The TC flag is set after the PEC transmission. The NBBYTES register is set to 3, and then to N for the next transmission. The legend indicates transmission (white), reception (yellow), and SCL stretch (blue line).

Example SMBus master transmitter 2 bytes + PEC, automatic end mode (STOP)

INIT: program Slave address, program NBBYTES = 3, AUTOEND=1, set PECBYTE, set START
EV1: TXIS ISR: wr data1
EV2: TXIS ISR: wr data2

Example SMBus master transmitter 2 bytes + PEC, software end mode (RESTART)

INIT: program Slave address, program NBBYTES = 3, AUTOEND=0, set PECBYTE, set START
EV1: TXIS ISR: wr data1
EV2: TXIS ISR: wr data2
EV3: TC ISR: program Slave address, program NBBYTES = N, set START

MS19871V2

Timing diagram for SMBus master transmitter in automatic end mode (STOP). The diagram shows a sequence of bytes: S (Start), Address, A (Acknowledge), data1, A, data2, A, PEC, A, P (Stop). The TXIS flag is set at the Address and data1 bytes. The TXE flag is set after data2 is written. The NBBYTES register is set to 3. The legend indicates transmission (white), reception (yellow), and SCL stretch (blue line). Timing diagram for SMBus master transmitter in software end mode (RESTART). The diagram shows a sequence of bytes: S (Start), Address, A (Acknowledge), data1, A, data2, A, PEC, A, Rstart (Restart), Address, ... The TXIS flag is set at the Address and data1 bytes. The TXE flag is set after data2 is written. The TC flag is set after the PEC transmission. The NBBYTES register is set to 3, and then to N for the next transmission. The legend indicates transmission (white), reception (yellow), and SCL stretch (blue line).

SMBus master receiver

When the SMBus master wants to receive, at the end of the transfer, the PEC followed by a STOP condition, the automatic end mode can be selected (AUTOEND = 1). The PECBYTE bit must be set and the slave address programmed before setting the START bit. In this case, after the receipt of NBYTES[7:0] - 1 data bytes, the next received byte is automatically checked versus the I2C_PECR register content. A NACK response is given to the PEC byte, followed by a STOP condition.

When the SMBus master receiver wants to receive, at the end of the transfer, the PEC byte followed by a RESTART condition, the software mode must be selected (AUTOEND = 0). The PECBYTE bit must be set and the slave address programmed before setting the START bit. In this case, after NBYTES - 1 data have been received, the next received byte is automatically checked versus the I2C_PECR register content. The TC flag is set after the PEC byte reception, stretching the SCL line low. The RESTART condition can be programmed in the TC interrupt subroutine.

Caution: The PECBYTE bit has no effect when the RELOAD bit is set.

Figure 324. Bus transfer diagrams for SMBus master receiver

Timing diagram for SMBus master receiver in automatic stop mode. The sequence starts with INIT (S), followed by Address (transmission), A (reception), data1 (reception), A (reception), data2 (reception), A (reception), PEC (reception), NA (reception), and P (transmission). RXNE flags are shown above the A, A, and NA fields. Event markers INIT, EV1, EV2, and EV3 are shown below the sequence. The NBYTES register is set to 3. The legend indicates transmission in white, reception in yellow, and SCL stretch in blue. Timing diagram for SMBus master receiver in software end mode. The sequence starts with INIT (S), followed by Address (transmission), A (reception), data1 (reception), A (reception), data2 (reception), A (reception), PEC (reception), NA (reception), and then a Restart condition followed by a new Address (transmission). RXNE flags are shown above the A, A, and NA fields, and a TC flag is shown above the NA field. Event markers INIT, EV1, EV2, EV3, and EV4 are shown below the sequence. The NBYTES register is shown with an initial value of 3, then changing to N. The legend indicates transmission in white, reception in yellow, and SCL stretch in blue.

Example SMBus master receiver 2 bytes + PEC, automatic end mode (STOP)

INIT: program Slave address, program NBYTES = 3, AUTOEND=1, set PECBYTE, set START
EV1: RXNE ISR: rd data1
EV2: RXNE ISR: rd data2
EV3: RXNE ISR: rd PEC

Example SMBus master receiver 2 bytes + PEC, software end mode (RESTART)

INIT: program Slave address, program NBYTES = 3, AUTOEND=0, set PECBYTE, set START
EV1: RXNE ISR: rd data1
EV2: RXNE ISR: rd data2
EV3: RXNE ISR: read PEC
EV4: TC ISR: program Slave address, program NBYTES = N, set START

MS19872V2

Timing diagram for SMBus master receiver in automatic stop mode. The sequence starts with INIT (S), followed by Address (transmission), A (reception), data1 (reception), A (reception), data2 (reception), A (reception), PEC (reception), NA (reception), and P (transmission). RXNE flags are shown above the A, A, and NA fields. Event markers INIT, EV1, EV2, and EV3 are shown below the sequence. The NBYTES register is set to 3. The legend indicates transmission in white, reception in yellow, and SCL stretch in blue. Timing diagram for SMBus master receiver in software end mode. The sequence starts with INIT (S), followed by Address (transmission), A (reception), data1 (reception), A (reception), data2 (reception), A (reception), PEC (reception), NA (reception), and then a Restart condition followed by a new Address (transmission). RXNE flags are shown above the A, A, and NA fields, and a TC flag is shown above the NA field. Event markers INIT, EV1, EV2, EV3, and EV4 are shown below the sequence. The NBYTES register is shown with an initial value of 3, then changing to N. The legend indicates transmission in white, reception in yellow, and SCL stretch in blue.

28.4.16 Wake-up from Stop mode on address match

The I2C peripheral is able to wake up the device from Stop mode (APB clock is off), when the device is addressed. All addressing modes are supported.

The wake-up from Stop mode is enabled by setting the WUPEN bit of the I2C_CR1 register. The HSI oscillator must be selected as the clock source for I2CCLK to allow the wake-up from Stop mode.

In Stop mode, the HSI oscillator is stopped. Upon detecting START condition, the I2C interface starts the HSI oscillator and stretches SCL low until the oscillator wakes up.

HSI is then used for the address reception.

If the received address matches the device own address, I2C stretches SCL low until the device wakes up. The stretch is released when the ADDR flag is cleared by software. Then the transfer goes on normally.

If the address does not match, the HSI oscillator is stopped again and the device does not wake up.

Note: When the system clock is used as I2C clock, or when WUPEN = 0, the HSI oscillator does not start upon receiving START condition.

Only an ADDR interrupt can wake the device up. Therefore, do not enter Stop mode when I2C is performing a transfer, either as a master or as an addressed slave after the ADDR flag is set. This can be managed by clearing the SLEEPDEEP bit in the ADDR interrupt routine and setting it again only after the STOPF flag is set.

Caution: The digital filter is not compatible with the wake-up from Stop mode feature. Before entering Stop mode with the WUPEN bit set, deactivate the digital filter, by writing zero to the DNF[3:0] bitfield.

Caution: The feature is only available when the HSI oscillator is selected as the I2C clock.

Caution: Clock stretching must be enabled (NOSTRETCH = 0) to ensure proper operation of the wake-up from Stop mode feature.

Caution: If the wake-up from Stop mode is disabled (WUPEN = 0), the I2C peripheral must be disabled before entering Stop mode (PE = 0).

28.4.17 Error conditions

The following errors are the conditions that can cause the communication to fail.

Bus error (BERR)

A bus error is detected when a START or a STOP condition is detected and is not located after a multiple of nine SCL clock pulses. START or STOP condition is detected when an SDA edge occurs while SCL is high.

The bus error flag is set only if the I2C peripheral is involved in the transfer as master or addressed slave (that is, not during the address phase in slave mode).

In case of a misplaced START or RESTART detection in slave mode, the I2C peripheral enters address recognition state like for a correct START condition.

When a bus error is detected, the BERR flag of the I2C_ISR register is set, and an interrupt is generated if the ERRIE bit of the I2C_CR1 register is set.

Arbitration loss (ARLO)

An arbitration loss is detected when a high level is sent on the SDA line, but a low level is sampled on the SCL rising edge.

In master mode, arbitration loss is detected during the address phase, data phase and data acknowledge phase. In this case, the SDA and SCL lines are released, the START control bit is cleared by hardware and the master switches automatically to slave mode.

In slave mode, arbitration loss is detected during data phase and data acknowledge phase. In this case, the transfer is stopped and the SCL and SDA lines are released.

When an arbitration loss is detected, the ARLO flag of the I2C_ISR register is set and an interrupt is generated if the ERRIE bit of the I2C_CR1 register is set.

Overrun/underrun error (OVR)

An overrun or underrun error is detected in slave mode when NOSTRETCH = 1 and:

When an overrun or underrun error is detected, the OVR flag of the I2C_ISR register is set and an interrupt is generated if the ERRIE bit of the I2C_CR1 register is set.

Packet error checking error (PECERR)

A PEC error is detected when the received PEC byte does not match the I2C_PECR register content. A NACK is automatically sent after the wrong PEC reception.

When a PEC error is detected, the PECERR flag of the I2C_ISR register is set and an interrupt is generated if the ERRIE bit of the I2C_CR1 register is set.

Timeout error (TIMEOUT)

A timeout error occurs for any of these conditions:

When a timeout violation is detected in master mode, a STOP condition is automatically sent.

When a timeout violation is detected in slave mode, SDA and SCL lines are automatically released.

When a timeout error is detected, the TIMEOUT flag is set in the I2C_ISR register and an interrupt is generated if the ERRIE bit of the I2C_CR1 register is set.

Alert (ALERT)

The ALERT flag is set when the I2C peripheral is configured as a host (SMBHEN = 1), the SMBALERT# signal detection is enabled (ALERTEN = 1), and a falling edge is detected on the SMBA pin. An interrupt is generated if the ERRIE bit of the I2C_CR1 register is set.

28.5 I2C in low-power modes

Table 157. Effect of low-power modes to I2C

ModeDescription
SleepNo effect. I2C interrupts cause the device to exit the Sleep mode.
Stop (1)The contents of I2C registers are kept.
– WUPEN = 1 and I2C is clocked by an internal oscillator (HSI). The address recognition is functional. The I2C address match condition causes the device to exit the Stop mode.
– WUPEN = 0: the I2C must be disabled before entering Stop mode.
StandbyThe I2C peripheral is powered down. It must be reinitialized after exiting Standby mode.

1. Refer to Section 28.3: I2C implementation for information about the Stop modes supported by each instance. If the wake-up from a specific stop mode is not supported, the instance must be disabled before entering that specific Stop mode.

28.6 I2C interrupts

The following table gives the list of I2C interrupt requests.

Table 158. I2C interrupt requests

Interrupt acronymInterrupt eventEvent flagEnable control bitInterrupt clear methodExit Sleep modeExit Stop modesExit Standby modes
I2C_EVReceive buffer not emptyRXNERXIERead I2C_RXDR registerYesNoNo
Transmit buffer interrupt statusTXISTXIEWrite I2C_TXDR register
STOP detection interrupt flagSTOPFSTOPIEWrite STOPCF = 1
Transfer complete reloadTCRTCIEWrite I2C_CR2 with NBBYTES[7:0] ≠ 0
Transfer completeTCWrite START = 1 or STOP = 1
Address matchedADDRADDRIEWrite ADDRCF = 1Yes (1)
NACK receptionNACKFNACKIEWrite NACKCF = 1No
I2C_ERBus errorBERRERRIEWrite BERRCF = 1YesNoNo
Arbitration lossARLOWrite ARLOCF = 1
Overrun/underrunOVRWrite OVRCF = 1
I2C_ERPEC errorPECERRERRIEWrite PECERRCF = 1YesNoNo
Timeout/
t LOW error
TIMEOUTWrite TIMEOUTCF = 1
SMBus alertALERTWrite ALERTCF = 1

1. The ADDR match event can wake up the device from Stop mode only if the I2C instance supports the wake-up from Stop mode feature. Refer to Section 28.3: I2C implementation .

28.7 I2C DMA requests

Transmission using DMA

DMA (direct memory access) can be enabled for transmission by setting the TXDMAEN bit of the I2C_CR1 register. Data is loaded from an SRAM area configured through the DMA peripheral (see Section 13: Direct memory access controller (DMA) ) to the I2C_TXDR register whenever the TXIS bit is set.

Only the data are transferred with DMA.

In master mode, the initialization, the slave address, direction, number of bytes and START bit are programmed by software (the transmitted slave address cannot be transferred with DMA). When all data are transferred using DMA, DMA must be initialized before setting the START bit. The end of transfer is managed with the NBYPES counter. Refer to Master transmitter .

In slave mode:

The PEC transfer is managed with the counter associated to the NBYPES[7:0] bitfield. Refer to SMBus slave transmitter and SMBus master mode .

Note: If DMA is used for transmission, it is not required to set the TXIE bit.

Reception using DMA

DMA (direct memory access) can be enabled for reception by setting the RXDMAEN bit of the I2C_CR1 register. Data is loaded from the I2C_RXDR register to an SRAM area configured through the DMA peripheral (refer to Section 13: Direct memory access controller (DMA) ) whenever the RXNE bit is set. Only the data (including PEC) are transferred with DMA.

In master mode, the initialization, the slave address, direction, number of bytes and START bit are programmed by software. When all data are transferred using DMA, DMA must be initialized before setting the START bit. The end of transfer is managed with the NBYPES counter.

In slave mode with NOSTRETCH = 0, when all data are transferred using DMA, the DMA must be initialized before the address match event, or in the ADDR interrupt subroutine, before clearing the ADDR flag.

The PEC transfer is managed with the counter associated to the NBYPES[7:0] bitfield. Refer to SMBus slave receiver and SMBus master receiver .

Note: If DMA is used for reception, it is not required to set the RXIE bit.

28.8 I2C debug modes

When the device enters debug mode (core halted), the SMBus timeout either continues working normally or stops, depending on the DBG_I2Cx_SMBUS_TIMEOUT bits in the DBG block.

28.9 I2C registers

Refer to Section 2.2 on page 47 for the list of abbreviations used in register descriptions.

The registers are accessed by words (32-bit).

28.9.1 I2C control register 1 (I2C_CR1)

Address offset: 0x00

Reset value: 0x0000 0000

Access: no wait states, except if a write access occurs while a write access is ongoing. In this case, wait states are inserted in the second write access, until the previous one is completed. The latency of the second write access can be up to \( 2 \times PCLK1 + 6 \times I2CCLK \) .

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.PEC ENALERT ENSMBD ENSMBH ENGC ENWUP ENNO STRETCHSBC
rwrwrwrwrwrwrwrw

1514131211109876543210
RXDMA ENTXDMA ENRes.ANF OFFDNF[3:0]ERRIETCIESTOP IENACK IEADDR IERXIETXIEPE
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

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

Bit 23 PECEN : PEC enable

0: PEC calculation disabled

1: PEC calculation enabled

Bit 22 ALERTEN : SMBus alert enable

0: The SMBALERT# signal on SMBA pin is not supported in host mode (SMBHEN = 1). In device mode (SMBHEN = 0), the SMBA pin is released and the alert response address header is disabled (0001100x followed by NACK).

1: The SMBALERT# signal on SMBA pin is supported in host mode (SMBHEN = 1). In device mode (SMBHEN = 0), the SMBA pin is driven low and the alert response address header is enabled (0001100x followed by ACK).

Note: When ALERTEN = 0, the SMBA pin can be used as a standard GPIO.

Bit 21 SMBDEN : SMBus device default address enable

0: Device default address disabled. Address 0b1100001x is NACKed.

1: Device default address enabled. Address 0b1100001x is ACKed.

Bit 20 SMBHEN : SMBus host address enable

0: Host address disabled. Address 0b0001000x is NACKed.

1: Host address enabled. Address 0b0001000x is ACKed.

Bit 19 GCEN : General call enable

0: General call disabled. Address 0b00000000 is NACKed.

1: General call enabled. Address 0b00000000 is ACKed.

Bit 18 WUPEN : Wake-up from Stop mode enable

0: Wake-up from Stop mode disabled.

1: Wake-up from Stop mode enabled.

Note: WUPEN can be set only when DNF[3:0] = 0000.

Bit 17 NOSTRETCH : Clock stretching disable

This bit is used to disable clock stretching in slave mode. It must be kept cleared in master mode.

0: Clock stretching enabled

1: Clock stretching disabled

Note: This bit can be programmed only when the I2C peripheral is disabled (PE = 0).

Bit 16 SBC : Slave byte control

This bit is used to enable hardware byte control in slave mode.

0: Slave byte control disabled

1: Slave byte control enabled

Bit 15 RXDMAEN : DMA reception requests enable

0: DMA mode disabled for reception

1: DMA mode enabled for reception

Bit 14 TXDMAEN : DMA transmission requests enable

0: DMA mode disabled for transmission

1: DMA mode enabled for transmission

Bit 13 Reserved, must be kept at reset value.

Bit 12 ANFOFF : Analog noise filter OFF

0: Analog noise filter enabled

1: Analog noise filter disabled

Note: This bit can be programmed only when the I2C peripheral is disabled (PE = 0).

Bits 11:8 DNF[3:0] : Digital noise filter

These bits are used to configure the digital noise filter on SDA and SCL input. The digital filter, filters spikes with a length of up to DNF[3:0] * \( t_{I2CCLK} \)

0000: Digital filter disabled

0001: Digital filter enabled and filtering capability up to one \( t_{I2CCLK} \)

...

1111: digital filter enabled and filtering capability up to fifteen \( t_{I2CCLK} \)

Note: If the analog filter is enabled, the digital filter is added to it. This filter can be programmed only when the I2C peripheral is disabled (PE = 0).

Bit 7 ERRIE : Error interrupts enable

0: Error detection interrupts disabled

1: Error detection interrupts enabled

Note: Any of these errors generates an interrupt:

Bit 6 TCIE : Transfer complete interrupt enable

0: Transfer complete interrupt disabled

1: Transfer complete interrupt enabled

Note: Any of these events generates an interrupt:

Note: When PE = 0, the I2C SCL and SDA lines are released. Internal state machines and status bits are put back to their reset value. When cleared, PE must be kept low for at least three APB clock cycles.

28.9.2 I2C control register 2 (I2C_CR2)

Address offset: 0x04

Reset value: 0x0000 0000

Access: no wait states, except if a write access occurs while a write access is ongoing. In this case, wait states are inserted in the second write access until the previous one is completed. The latency of the second write access can be up to 2 x PCLK1 + 6 x I2CCLK.

31302928272625242322212019181716
Res.Res.Res.Res.Res.PEC BYTEAUTO ENDRE LOADNBBYTES[7:0]
rsrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
NACKSTOPSTARTHEAD 10RADD10RD WRNSADD[9:0]
rsrsrsrwrwrwrwrwrwrwrwrwrwrwrwrw

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

Bit 26 PECBYTE : Packet error checking byte

This bit is set by software, and cleared by hardware when the PEC is transferred, or when a STOP condition or an Address matched is received, also when PE = 0.

Note: Writing 0 to this bit has no effect.

This bit has no effect when RELOAD is set, and in slave mode when SBC = 0.

Bit 25 AUTOEND: Automatic end mode (master mode)

This bit is set and cleared by software.

0: software end mode: TC flag is set when NBYTES data are transferred, stretching SCL low.

1: Automatic end mode: a STOP condition is automatically sent when NBYTES data are transferred.

Note: This bit has no effect in slave mode or when the RELOAD bit is set.

Bit 24 RELOAD: NBYTES reload mode

This bit is set and cleared by software.

0: The transfer is completed after the NBYTES data transfer (STOP or RESTART follows).

1: The transfer is not completed after the NBYTES data transfer (NBYTES is reloaded). TCR flag is set when NBYTES data are transferred, stretching SCL low.

Bits 23:16 NBYTES[7:0]: Number of bytes

The number of bytes to be transmitted/received is programmed there. This field is don't care in slave mode with SBC = 0.

Note: Changing these bits when the START bit is set is not allowed.

Bit 15 NACK: NACK generation (slave mode)

The bit is set by software, cleared by hardware when the NACK is sent, or when a STOP condition or an Address matched is received, or when PE = 0.

0: an ACK is sent after current received byte.

1: a NACK is sent after current received byte.

Note: Writing 0 to this bit has no effect.

This bit is used only in slave mode: in master receiver mode, NACK is automatically generated after last byte preceding STOP or RESTART condition, whatever the NACK bit value.

When an overrun occurs in slave receiver NOSTRETCH mode, a NACK is automatically generated, whatever the NACK bit value.

When hardware PEC checking is enabled (PECBYTE = 1), the PEC acknowledge value does not depend on the NACK value.

Bit 14 STOP: STOP condition generation

This bit only pertains to master mode. It is set by software and cleared by hardware when a STOP condition is detected or when PE = 0.

0: No STOP generation

1: STOP generation after current byte transfer

Note: Writing 0 to this bit has no effect.

Bit 13 START: START condition generation

This bit is set by software. It is cleared by hardware after the START condition followed by the address sequence is sent, by an arbitration loss, by a timeout error detection, or when PE = 0. It can also be cleared by software, by setting the ADDRCF bit of the I2C_ICR register.

0: No START generation

1: RESTART/START generation:

If the I2C is already in master mode with AUTOEND = 0, setting this bit generates a repeated START condition when RELOAD = 0, after the end of the NBYTES transfer.

Otherwise, setting this bit generates a START condition once the bus is free.

Note: Writing 0 to this bit has no effect.

The START bit can be set even if the bus is BUSY or I2C is in slave mode.

This bit has no effect when RELOAD is set.

Bit 12 HEAD10R : 10-bit address header only read direction (master receiver mode)

0: The master sends the complete 10-bit slave address read sequence: START + 2 bytes 10-bit address in write direction + RESTART + first seven bits of the 10-bit address in read direction.

1: The master sends only the first seven bits of the 10-bit address, followed by read direction.

Note: Changing this bit when the START bit is set is not allowed.

Bit 11 ADD10 : 10-bit addressing mode (master mode)

0: The master operates in 7-bit addressing mode

1: The master operates in 10-bit addressing mode

Note: Changing this bit when the START bit is set is not allowed.

Bit 10 RD_WRN : Transfer direction (master mode)

0: Master requests a write transfer

1: Master requests a read transfer

Note: Changing this bit when the START bit is set is not allowed.

Bits 9:0 SADD[9:0] : Slave address (master mode)

Condition: In 7-bit addressing mode (ADD10 = 0):

SADD[7:1] must be written with the 7-bit slave address to be sent. Bits SADD[9], SADD[8] and SADD[0] are don't care.

Condition: In 10-bit addressing mode (ADD10 = 1):

SADD[9:0] must be written with the 10-bit slave address to be sent.

Note: Changing these bits when the START bit is set is not allowed.

28.9.3 I2C own address 1 register (I2C_OAR1)

Address offset: 0x08

Reset value: 0x0000 0000

Access: no wait states, except if a write access occurs while a write access is ongoing. In this case, wait states are inserted in the second write access until the previous one is completed. The latency of the second write access can be up to \( 2 \times PCLK1 + 6 \times I2CCLK \) .

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
OA1ENRes.Res.Res.Res.OA1 MODEOA1[9:0]
rwrwrwrwrwrwrwrwrwrwrwrw

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

Bit 15 OA1EN : Own address 1 enable

0: Own address 1 disabled. The received slave address OA1 is NACKed.

1: Own address 1 enabled. The received slave address OA1 is ACKed.

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

Bit 10 OA1MODE : Own address 1 10-bit mode

0: Own address 1 is a 7-bit address.

1: Own address 1 is a 10-bit address.

Note: This bit can be written only when OA1EN = 0.

Bits 9:0 OA1[9:0] : Interface own slave address

7-bit addressing mode: OA1[7:1] contains the 7-bit own slave address. Bits OA1[9], OA1[8] and OA1[0] are don't care.

10-bit addressing mode: OA1[9:0] contains the 10-bit own slave address.

Note: These bits can be written only when OA1EN = 0.

28.9.4 I2C own address 2 register (I2C_OAR2)

Address offset: 0x0C

Reset value: 0x0000 0000

Access: no wait states, except if a write access occurs while a write access is ongoing. In this case, wait states are inserted in the second write access, until the previous one is completed. The latency of the second write access can be up to \( 2 \times PCLK1 + 6 \times I2CCLK \) .

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
OA2ENRes.Res.Res.Res.OA2MSK[2:0]OA2[7:1]Res.
rwrwrwrwrwrwrwrwrwrwrw

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

Bit 15 OA2EN : Own address 2 enable

0: Own address 2 disabled. The received slave address OA2 is NACKed.

1: Own address 2 enabled. The received slave address OA2 is ACKed.

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

Bits 10:8 OA2MSK[2:0] : Own address 2 masks

000: No mask

001: OA2[1] is masked and don't care. Only OA2[7:2] are compared.

010: OA2[2:1] are masked and don't care. Only OA2[7:3] are compared.

011: OA2[3:1] are masked and don't care. Only OA2[7:4] are compared.

100: OA2[4:1] are masked and don't care. Only OA2[7:5] are compared.

101: OA2[5:1] are masked and don't care. Only OA2[7:6] are compared.

110: OA2[6:1] are masked and don't care. Only OA2[7] is compared.

111: OA2[7:1] are masked and don't care. No comparison is done, and all (except reserved) 7-bit received addresses are acknowledged.

Note: These bits can be written only when OA2EN = 0.

As soon as OA2MSK ≠ 0, the reserved I2C addresses (0b0000xxx and 0b1111xxx) are not acknowledged, even if the comparison matches.

Bits 7:1 OA2[7:1] : Interface address

7-bit addressing mode: 7-bit address

Note: These bits can be written only when OA2EN = 0.

Bit 0 Reserved, must be kept at reset value.

28.9.5 I2C timing register (I2C_TIMINGR)

Address offset: 0x10

Reset value: 0x0000 0000

Access: no wait states

31302928272625242322212019181716
PRESC[3:0]Res.Res.Res.Res.SCLDEL[3:0]SDADEL[3:0]
rwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
SCLH[7:0]SCLL[7:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:28 PRESC[3:0] : Timing prescaler

This field is used to prescale I2CCLK to generate the clock period \( t_{\text{PRESC}} \) used for data setup and hold counters (refer to section I2C timings ), and for SCL high and low level counters (refer to section I2C master initialization ).

\[ t_{\text{PRESC}} = (\text{PRESC} + 1) \times t_{\text{I2CCLK}} \]

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

Bits 23:20 SCLDEL[3:0] : Data setup time

This field is used to generate a delay \( t_{\text{SCLDEL}} = (\text{SCLDEL} + 1) \times t_{\text{PRESC}} \) between SDA edge and SCL rising edge. In master and in slave modes with NOSTRETCH = 0, the SCL line is stretched low during \( t_{\text{SCLDEL}} \) .

Note: \( t_{\text{SCLDEL}} \) is used to generate \( t_{\text{SU:DAT}} \) timing.

Bits 19:16 SDADEL[3:0] : Data hold time

This field is used to generate the delay \( t_{\text{SDADEL}} \) between SCL falling edge and SDA edge. In master and in slave modes with NOSTRETCH = 0, the SCL line is stretched low during \( t_{\text{SDADEL}} \) .

\[ t_{\text{SDADEL}} = \text{SDADEL} \times t_{\text{PRESC}} \]

Note: \( t_{\text{SDADEL}} \) is used to generate \( t_{\text{HD:DAT}} \) timing.

Bits 15:8 SCLH[7:0] : SCL high period (master mode)

This field is used to generate the SCL high period in master mode.

\[ t_{\text{SCLH}} = (\text{SCLH} + 1) \times t_{\text{PRESC}} \]

Note: SCLH is also used to generate \( t_{\text{SU:STO}} \) and \( t_{\text{HD:STA}} \) timing.

Bits 7:0 SCLL[7:0] : SCL low period (master mode)

This field is used to generate the SCL low period in master mode.

\[ t_{\text{SCLL}} = (\text{SCLL} + 1) \times t_{\text{PRESC}} \]

Note: SCLL is also used to generate \( t_{\text{BUF}} \) and \( t_{\text{SU:STA}} \) timings.

Note: This register must be configured when the I2C peripheral is disabled (PE = 0).

Note: The STM32CubeMX tool calculates and provides the I2C_TIMINGR content in the I2C Configuration window.

28.9.6 I2C timeout register (I2C_TIMEOUTR)

Address offset: 0x14

Reset value: 0x0000 0000

Access: no wait states, except if a write access occurs while a write access is ongoing. In this case, wait states are inserted in the second write access until the previous one is completed. The latency of the second write access can be up to \( 2 \times PCLK1 + 6 \times I2CCLK \) .

31302928272625242322212019181716
TEXTENRes.Res.Res.TIMEOUTB[11:0]
rwrwrwrwrwrwrwrwrwrwrwrwrw

1514131211109876543210
TIMOUTENRes.Res.TIDLETIMEOUTA[11:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bit 31 TEXTEN : Extended clock timeout enable

0: Extended clock timeout detection is disabled

1: Extended clock timeout detection is enabled. When a cumulative SCL stretch for more than \( t_{LOW:EXT} \) is done by the I2C interface, a timeout error is detected (TIMEOUT = 1).

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

Bits 27:16 TIMEOUTB[11:0] : Bus timeout B

This field is used to configure the cumulative clock extension timeout:

\[ t_{LOW:EXT} = (TIMEOUTB + 1) \times 2048 \times t_{I2CCLK} \]

Note: These bits can be written only when TEXTEN = 0.

Bit 15 TIMOUTEN : Clock timeout enable

0: SCL timeout detection is disabled

1: SCL timeout detection is enabled. When SCL is low for more than \( t_{TIMEOUT} \) (TIDLE = 0) or high for more than \( t_{IDLE} \) (TIDLE = 1), a timeout error is detected (TIMEOUT = 1).

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

Bit 12 TIDLE : Idle clock timeout detection

0: TIMEOUTA is used to detect SCL low timeout

1: TIMEOUTA is used to detect both SCL and SDA high timeout (bus idle condition)

Note: This bit can be written only when TIMOUTEN = 0.

Bits 11:0 TIMEOUTA[11:0] : Bus timeout A

This field is used to configure:

The SCL low timeout condition \( t_{TIMEOUT} \) when TIDLE = 0

\[ t_{TIMEOUT} = (TIMEOUTA + 1) \times 2048 \times t_{I2CCLK} \]

The bus idle condition (both SCL and SDA high) when TIDLE = 1

\[ t_{IDLE} = (TIMEOUTA + 1) \times 4 \times t_{I2CCLK} \]

Note: These bits can be written only when TIMOUTEN = 0.

28.9.7 I2C interrupt and status register (I2C_ISR)

Address offset: 0x18

Reset value: 0x0000 0001

Access: no wait states

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.ADDCODE[6:0]DIR
rrrrrrrr
1514131211109876543210
BUSYRes.ALERTTIMEOUTPECERROVRARLOBERRTCRTCSTOPFNACKFADDRRXNETXISTXE
rrrrrrrrrrrrrrsrs

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

Bits 23:17 ADDCODE[6:0] : Address match code (slave mode)

These bits are updated with the received address when an address match event occurs (ADDR = 1). In the case of a 10-bit address, ADDCODE provides the 10-bit header followed by the two MSBs of the address.

Bit 16 DIR : Transfer direction (slave mode)

This flag is updated when an address match event occurs (ADDR = 1).

0: Write transfer, slave enters receiver mode.

1: Read transfer, slave enters transmitter mode.

Bit 15 BUSY : Bus busy

This flag indicates that a communication is in progress on the bus. It is set by hardware when a START condition is detected, and cleared by hardware when a STOP condition is detected, or when PE = 0.

Bit 14 Reserved, must be kept at reset value.

Bit 13 ALERT : SMBus alert

This flag is set by hardware when SMBHEN = 1 (SMBus host configuration), ALERTEN = 1 and an SMBALERT# event (falling edge) is detected on SMBA pin. It is cleared by software by setting the ALERTCF bit.

Note: This bit is cleared by hardware when PE = 0.

Bit 12 TIMEOUT : Timeout or \( t_{LOW} \) detection flag

This flag is set by hardware when a timeout or extended clock timeout occurred. It is cleared by software by setting the TIMEOUTCF bit.

Note: This bit is cleared by hardware when PE = 0.

Bit 11 PECERR : PEC error in reception

This flag is set by hardware when the received PEC does not match with the PEC register content. A NACK is automatically sent after the wrong PEC reception. It is cleared by software by setting the PECCF bit.

Note: This bit is cleared by hardware when PE = 0.

Bit 10 OVR : Overrun/underrun (slave mode)

This flag is set by hardware in slave mode with NOSTRETCH = 1, when an overrun/underrun error occurs. It is cleared by software by setting the OVRCF bit.

Note: This bit is cleared by hardware when PE = 0.

Bit 9 ARLO : Arbitration lost

This flag is set by hardware in case of arbitration loss. It is cleared by software by setting the ARLOCF bit.

Note: This bit is cleared by hardware when PE = 0.

Bit 8 BERR : Bus error

This flag is set by hardware when a misplaced START or STOP condition is detected whereas the peripheral is involved in the transfer. The flag is not set during the address phase in slave mode. It is cleared by software by setting the BERRCF bit.

Note: This bit is cleared by hardware when PE = 0.

Bit 7 TCR : Transfer complete reload

This flag is set by hardware when RELOAD = 1 and NBBYTES data have been transferred. It is cleared by software when NBBYTES is written to a non-zero value.

Note: This bit is cleared by hardware when PE = 0.

This flag is only for master mode, or for slave mode when the SBC bit is set.

Bit 6 TC : Transfer complete (master mode)

This flag is set by hardware when RELOAD = 0, AUTOEND = 0 and NBBYTES data have been transferred. It is cleared by software when START bit or STOP bit is set.

Note: This bit is cleared by hardware when PE = 0.

Bit 5 STOPF : STOP detection flag

This flag is set by hardware when a STOP condition is detected on the bus and the peripheral is involved in this transfer:

It is cleared by software by setting the STOPCF bit.

Note: This bit is cleared by hardware when PE = 0.

Bit 4 NACKF : Not acknowledge received flag

This flag is set by hardware when a NACK is received after a byte transmission. It is cleared by software by setting the NACKCF bit.

Note: This bit is cleared by hardware when PE = 0.

Bit 3 ADDR : Address matched (slave mode)

This bit is set by hardware as soon as the received slave address matched with one of the enabled slave addresses. It is cleared by software by setting ADDRCF bit.

Note: This bit is cleared by hardware when PE = 0.

Bit 2 RXNE : Receive data register not empty (receivers)

This bit is set by hardware when the received data is copied into the I2C_RXDR register, and is ready to be read. It is cleared when I2C_RXDR is read.

Note: This bit is cleared by hardware when PE = 0.

Bit 1 TXIS : Transmit interrupt status (transmitters)

This bit is set by hardware when the I2C_TXDR register is empty and the data to be transmitted must be written in the I2C_TXDR register. It is cleared when the next data to be sent is written in the I2C_TXDR register.

This bit can be written to 1 by software only when NOSTRETCH = 1, to generate a TXIS event (interrupt if TXIE = 1 or DMA request if TXDMAEN = 1).

Note: This bit is cleared by hardware when PE = 0.

Bit 0 TXE : Transmit data register empty (transmitters)

This bit is set by hardware when the I2C_TXDR register is empty. It is cleared when the next data to be sent is written in the I2C_TXDR register.

This bit can be written to 1 by software in order to flush the transmit data register I2C_TXDR.

Note: This bit is set by hardware when PE = 0.

28.9.8 I2C interrupt clear register (I2C_ICR)

Address offset: 0x1C

Reset value: 0x0000 0000

Access: no wait states

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.ALERT
CF
TIMOUT
CF
PEC
CF
OVR
CF
ARLO
CF
BERR
CF
Res.Res.STOP
CF
NACK
CF
ADDR
CF
Res.Res.Res.
wwwwwwwww

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

Bit 13 ALERTCF : Alert flag clear

Writing 1 to this bit clears the ALERT flag in the I2C_ISR register.

Bit 12 TIMOUTCF : Timeout detection flag clear

Writing 1 to this bit clears the TIMEOUT flag in the I2C_ISR register.

Bit 11 PEC CF : PEC error flag clear

Writing 1 to this bit clears the PECERR flag in the I2C_ISR register.

Bit 10 OVR CF : Overrun/underrun flag clear

Writing 1 to this bit clears the OVR flag in the I2C_ISR register.

Bit 9 ARLOCF : Arbitration lost flag clear

Writing 1 to this bit clears the ARLO flag in the I2C_ISR register.

Bit 8 BERRCF : Bus error flag clear

Writing 1 to this bit clears the BERRF flag in the I2C_ISR register.

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

Bit 5 STOPCF : STOP detection flag clear

Writing 1 to this bit clears the STOPF flag in the I2C_ISR register.

Bit 4 NACKCF : Not acknowledge flag clear

Writing 1 to this bit clears the NACKF flag in I2C_ISR register.

Bit 3 ADDRCF : Address matched flag clear

Writing 1 to this bit clears the ADDR flag in the I2C_ISR register. Writing 1 to this bit also clears the START bit in the I2C_CR2 register.

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

28.9.9 I2C PEC register (I2C_PECR)

Address offset: 0x20

Reset value: 0x0000 0000

Access: no wait states

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.PEC[7:0]
rrrrrrrr

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

Bits 7:0 PEC[7:0] : Packet error checking register

This field contains the internal PEC when PECEN=1.

The PEC is cleared by hardware when PE = 0.

28.9.10 I2C receive data register (I2C_RXDR)

Address offset: 0x24

Reset value: 0x0000 0000

Access: no wait states

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.RXDATA[7:0]
rrrrrrrr

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

Bits 7:0 RXDATA[7:0] : 8-bit receive data

Data byte received from the I 2 C-bus.

28.9.11 I2C transmit data register (I2C_TXDR)

Address offset: 0x28

Reset value: 0x0000 0000

Access: no wait states

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.TXDATA[7:0]
rwrwrwrwrwrwrwrw

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

Bits 7:0 TXDATA[7:0] : 8-bit transmit data

Data byte to be transmitted to the I 2 C-bus

Note: These bits can be written only when TXE = 1.

28.9.12 I2C register map

The table below provides the I2C register map and the reset values.

Table 159. I2C register map and reset values

OffsetRegister name313029282726252423222120191817161514131211109876543210
0x00I2C_CR1Res.Res.Res.Res.Res.Res.Res.Res.PECENALERTENSMBDENSMBHENGCENWUPENNOSTRETCHSBCRXDMAENTXDMAENRes.ANOFFDNF[3:0]ERRIETCIESTOPIENACKIEADDRIERXIETXIEPE
Reset value00000000000000000000000
0x04I2C_CR2Res.Res.Res.Res.Res.PECBYTEAUTOENDRELOADNBYTES[7:0]NACKSTOPSTARTHEAD10RADD10RD_WRNSADD[9:0]
Reset value00000000000000000000000000
0x08I2C_OAR1Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.OA1ENRes.Res.Res.Res.OA1MODEOA1[9:0]
Reset value00000000000
0x0CI2C_OAR2Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.OA2ENRes.Res.Res.Res.OA2MSK[2:0]OA2[7:1]Res.
Reset value00000000000
0x10I2C_TIMINGRPRESC[3:0]Res.Res.Res.Res.SCLDEL[3:0]SDADEL[3:0]SCLH[7:0]SCLL[7:0]
Reset value000000000000000000000000000
0x14I2C_TIMEOUTRTEXTENRes.Res.Res.TIMEOUTB[11:0]TIMOUTENRes.Res.TIDLETIMEOUTA[11:0]
Reset value00000000000000000000000000
0x18I2C_ISRRes.Res.Res.Res.Res.Res.Res.Res.ADDCODE[6:0]DIRBUSYRes.ALERTTIMEOUTPECERROVRARLOBERRTCRTCSTOPFNACKFADDRRXNETXISTXE
Reset value000000000000001
0x1CI2C_ICRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.ALERTCFTIMOUTCFPECFCFOVRFCFARLOCFBERRCFRes.Res.STOPCFNACKCFADDRCFRes.Res.Res.
Reset value000000000
0x20I2C_PECRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PEC[7:0]
Reset value000000000
0x24I2C_RXDRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.RXDATA[7:0]
Reset value000000000
0x28I2C_TXDRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.TXDATA[7:0]
Reset value000000000

Refer to Section 3.2 on page 53 for the register boundary addresses.