Передача данных по протоколу i2c

Ведомый в режиме передатчика

После приема адреса и очистки ADDR, ведомый отправляет байты из регистра DR в линию SDA через внутренний регистр сдвига.

Ведомый держит линию SCL до тех пор, пока ADDR не будет очищен, а регистр DR не будет заполнен данными, которые необходимо отправить (см. Рис. 270).

Когда принимается импульс подтверждения (acknowledge):
• бит TxE устанавливается аппаратным обеспечением и вызывается прерывание, если биты ITEVFEN и ITBUFEN установлены.

Если бит TxE установлен, и часть данных не была записана в регистре I2C_DR до окончания следующей передачи данных, то устанавливается бит BTF, и интерфейс ожидает, пока бит BTF не будет очищен чтением регистра I2C_SR1, за которым следует запись в регистр I2C_DR, SCL держится в низком уровне.



Ведомый в режиме приемника

После приема адреса и сброса ADDR ведомое устройство принимает байты из линии SDA в регистр DR через внутренний сдвиговый регистр. После каждого байта интерфейс последовательно генерирует:
• Импульс подтверждения (acknowledge), если бит ACK установлен
• Устанавливается бит RxNE аппаратным обеспечением и генерируется прерывание, если биты ITEVFEN и ITBUFEN установлены.

Если бит RxNE установлен, и данные в регистре DR не считываются до конца следующего приема данных, устанавливается бит BTF и интерфейс ожидает, пока BTF не будет очищен чтением регистра I2C_SR1, за которым следует чтение из регистра I2C_DR, SCL держится в низком уровне. (см. Рисунок 271).



1. Событие EV1 удерживает SCL до обработки программным обеспечением.
2. Последовательность программного обеспечения EV2 должна быть завершена до окончания текущей передачи байта
3. После проверки содержимого регистра SR1 пользователь должен выполнить полную последовательность очистки для каждого установленного флага.
Таким образом, для флагов ADDR и STOPF в процедуре прерывания I2C требуется следующая последовательность:
READ SR1
If (ADDR == 1) {READ SR1; READ SR2}
If (STOPF == 1) {READ SR1; WRITE CR1}
Цель состоит в том, чтобы обе флаги ADDR и STOPF были очищены, если оба установлены.