Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I2C slave - clock stretching

Tags:

i2c

stm32

Do you guys know how to enable the clock stretching for I2C slave?

Is it enough to just put this function I2C_StretchClockCmd(I2C2, ENABLE) in the initialization of I2C?

How does clock stretching work exactly?

like image 645
kai Avatar asked Dec 08 '22 07:12

kai


1 Answers

Seems for me yes, that's enough. Here is a background:

Clock Generation

The SCL clock is always generated by the I2C master. The specification requires minimum periods for the low and high phases of the clock signal. Hence, the actual clock rate may be lower than the nominal clock rate e.g. in I2C buses with large rise times due to high capacitances.

Clock Stretching

I2C devices can slow down communication by stretching SCL: During an SCL low phase, any I2C device on the bus may additionally hold down SCL to prevent it to rise high again, enabling them to slow down the SCL clock rate or to stop I2C communication for a while. This is also referred to as clock synchronization.

Note: The I2C specification does not specify any timeout conditions for clock stretching, i.e. any device can hold down SCL as long as it likes.

In an I2C communication the master device determines the clock speed. Unlike RS232 the I2C bus provides an explicit clock signal which relieves master and slave from synchronizing exactly to a predefined baud rate.

However, there are situations where an I2C slave is not able to co-operate with the clock speed given by the master and needs to slow down a little. This is done by a mechanism referred to as clock stretching.

An I2C slave is allowed to hold down the clock if it needs to reduce the bus speed. The master on the other hand is required to read back the clock signal after releasing it to high state and wait until the line has actually gone high.

How does the I2C clock speed affect the duration of clock stretching introduced by the I2C slave?

Clock stretching is a phenomenon where the I2C slave pulls the SCL line low on the 9th clock of every I2C data transfer (before the ACK stage). The clock is pulled low when the CPU is processing the I2C interrupt to evaluate either the address or process a data received from Master or to prepare the next data when Master is reading from the slave.

The time the clock is pull low depends on the time the CPU takes to process the interrupt and hence is dependent on the CPU speed and not the I2C clock speed.

like image 76
Ruslan Gerasimov Avatar answered Dec 28 '22 11:12

Ruslan Gerasimov