Inter-integrated circuit (I2C) interface RM0440
1870/2126 RM0440 Rev 4
Transmission 
If the I2C_TXDR register is not empty (TXE=0), its content is copied into the shift register 
after the 9th SCL pulse (the Acknowledge pulse). Then the shift register content is shifted 
out on SDA line. If TXE=1, meaning that no data is written yet in I2C_TXDR, SCL line is 
stretched low until I2C_TXDR is written. The stretch is done after the 9th SCL pulse.
Figure 634. Data transmission 
Hardware transfer management 
The I2C has a byte counter embedded in hardware in order to manage byte transfer and to 
close the communication in various modes such as:
– NACK, STOP and ReSTART generation in master mode
– ACK control in slave receiver mode 
– PEC generation/checking when SMBus feature is supported
The byte counter is always used in master mode. By default it is disabled in slave mode, but 
it can be enabled by software by setting the SBC (Slave Byte Control) bit in the I2C_CR2 
register. 
The number of bytes to be transferred is programmed in the NBYTES[7:0] bit field in the 
I2C_CR2 register. If the number of bytes to be transferred (NBYTES) 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 in the I2C_CR2 register. In this mode, 
TCR flag is set when the number of bytes programmed in NBYTES has been transferred, 
and an interrupt is generated if TCIE is set. SCL is stretched as long as TCR flag is set. TCR 
is cleared by software when NBYTES is written to a non-zero value.
When the NBYTES counter is reloaded with the last number of bytes, RELOAD bit must be 
cleared.
MS19849V1
xx
Shift register
data1
data1
xx
data2
TXE
ACK pulse
data0 data2
ACK pulse
xx
I2C_TXDR
wr data1 wr data2
SCL
legend:
SCL 
stretch