Софтварный I2C для MPL115A2 и AVR.

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 мс).

На выходе имеем три функции и два буфера:

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 можно использовать и в других разработках.
  • +3
  • 03 сентября 2012, 18:50
  • Dikoy
  • 1