Для работы с I2C (подробнее о шине можно посмотреть в stm32) используются пины 9 и 14 (GPIO14 и GPIO2)
На GPIO2 обычно установлен светодиод.
Максимальная скорость I2C 100кГц
Небольшая напоминалка:
В I2C используется 7 бит адреса и 8 бит чтения/записи
Проверяется 9 бит ACK/NACK позволяющий определить наличие (физическое или «доступность» программы у микросхемы)
ACK — низкий лог. уровень в 9 такте (устройство д.б. Open Drain)
NACK — высокий лог. уровень в 9 такте (т.к. никто не смог притянуть вывод к земле)
Добавляем #include "driver/i2c_master.h"
Макрос для «зануления SDA и CLK»:
I2C_MASTER_SDA_LOW_SCL_LOW()
Функция старта работы с I2C:
i2c_master_start();
Функция окончания работы с I2C:
i2c_master_stop();
Функция записи байта:
void i2c_master_writeByte(uint8 wrdata);
Функция чтения байта:
uint8 i2c_master_readByte(void);
Функция для получения бита подтверждения о принятии устройством данных:
по сути показывает, что шина не пустая
bool i2c_master_checkAck(void);
Функция формирования бита ACK:
void i2c_master_send_ack(void);
Функция формирования бита NACK:
void i2c_master_send_nack(void);
Как правило алгоритм записи выглядит как:
- Старт
- Проверка наличия приемника (передаем его адрес) и смотрим ACK
- Передача адреса записи
- Часто добавляется ACK
- Передача данных + м.б. ACK
- Передача NACK (смотреть даташит на приемник)
- Стоп
Как правило алгоритм чтения выглядит как:
- Старт
- Проверка наличия приемника (передаем его адрес) и смотрим ACK
- Передача адреса начала чтения (обычно с битом записи — т.к. записываем стартовый адрес для чтения)
- Часто добавляется ACK
- Старт — повторно запускаем I2C (не останавливая его до этого) т.е. рестарт
- Передача адреса приемника (обычно с битом чтения) и смотрим ACK
ВАЖНО!!! - Принимаем байты (до предпоследнего) и отвечаем на них ACK
- Принимаем последний байт и отвечаем NACK
- Стоп