Софтварный I2C для MPL115A2 и AVR.
Почитав статью «Цифровой измеритель абсолютного давления (барометр) MPL115A2» решил запустить оный на AVR. С аппаратным I2C связываться не стал, т.к. барометр поддерживает очень высокие скорости обмена и получается выгоднее читать его софтварно, не мешая остальным прерываниям, чем долго и мучительно разгребать регистр TWR ради четырёх паршивых байт. Ну и отсутствие привязки к выводам радует.
Итак, в архиве Си файл со всеми необходимыми функциями, который надо просто прицепить к своему проекту. Написан под IAR, но из специфичного там только функция __delay_cycles(); Как следует из названия, она выполняет задержку в тактах контроллера. Просто заменяем её принятой в своём компиляторе для обеспечения необходимых выдержек между сменой состояния лапок. Задержки (скорость) подобрать по вкусу.
Настойка софтварного I2C сводится к изменению всего 5 дефайнов.
DS_I2C_PIN, DS_I2C_DDR, DS_I2C_PORT — регистры порта, к которому подключён барометр.
DS_SDA_LN, DS_SCL_LN — биты порта для соответствующих линий.
И всё, больше ничего трогать не надо.
Ну, ещё DS_I2C_T отвечает за задержку вкупе с параметром F_CLK, который обычно задаётся в основном коде. DS_I2C_T == 1000 достаточно для работы барометра при кварце 16 МГц (задержка получается 16000 тактов или 1 мс).
На выходе имеем три функции и два буфера:
Выполнив функции можно пользовать результаты в соответстующих буферах.
Разумеется, функции I2C можно использовать и в других разработках.
Итак, в архиве Си файл со всеми необходимыми функциями, который надо просто прицепить к своему проекту. Написан под IAR, но из специфичного там только функция __delay_cycles(); Как следует из названия, она выполняет задержку в тактах контроллера. Просто заменяем её принятой в своём компиляторе для обеспечения необходимых выдержек между сменой состояния лапок. Задержки (скорость) подобрать по вкусу.
Настойка софтварного I2C сводится к изменению всего 5 дефайнов.
DS_I2C_PIN, DS_I2C_DDR, DS_I2C_PORT — регистры порта, к которому подключён барометр.
DS_SDA_LN, DS_SCL_LN — биты порта для соответствующих линий.
И всё, больше ничего трогать не надо.
Ну, ещё DS_I2C_T отвечает за задержку вкупе с параметром F_CLK, который обычно задаётся в основном коде. DS_I2C_T == 1000 достаточно для работы барометра при кварце 16 МГц (задержка получается 16000 тактов или 1 мс).
На выходе имеем три функции и два буфера:
void read_coef_soft(void); // считать коэффициенты и положить их в буфер MPL115A2_coef.
void start_conv_soft(void); // запустить преобразование температуры и давления.
void read_result_soft(void); // считать температуру и давление и сунуть в MPL115A2_result.
unsigned char MPL115A2_coef[8]; // буфер коэффициентов
unsigned char MPL115A2_result[4]; // буфер результата
Выполнив функции можно пользовать результаты в соответстующих буферах.
Разумеется, функции I2C можно использовать и в других разработках.