вторник, 25 сентября 2012 г.

Простой способ работы с I2C в STM32

Оказывается многие сложные вещи можно сделать значительно проще.
Недавно пришлось работать вот с чем - необходимо реализовать обработку данных с платы Pololu MinIMU-9, включающей в себя акселерометр-магнитометр LSM303DLM и гироскоп L3G4200DКак оказалось, для обмена данными есть только один путь - протокол I2C. 

Как и полагается, к плате есть документация. Однако, в данном устройстве разделены его составные части -  отдельно гироскоп и отдельно акселерометр-магнитометр. Поэтому, в документации были представлены ссылки на мануалы к каждой из частей. И самое главное - в комплекте были ссылки на исходные коды и даже скриншот работающей десктопной программы, которая принимала значения с платы и прорисовывала текущие углы наклона, азимут и проч.
Однако после скачивания директорий с github меня ждало разочарование. Рабочая программа из двух частей - одна на десктопе, получает данные по com-порту, всё визуализирует. Другая часть - работа с собственно платой, все математические расчеты, но... для Arduino.
И самая главная загвоздка - все операции с протоколом I2C в этих сырцах сводились к красочным и высокоуровневым:
Wired.Begin()
Wired.Read()
и так далее...

В первоначальную задачу ставилось хотя бы что-то прочитать с платы. Однако все запросы в гугле ("stm32 i2c" и проч.) сводились либо к описаниям работы протокола, либо к огромному  объёма кода. 
В конце концов, было найдено вот что:
AN2824
Application note
STM32F10xxx I2C optimized examples
ну и соответствующий этому архив с проектом для Keil`а.

Открываем проект, настраиваем как нам необходимо. Вот нужные функции - 
NVIC_Configuration();
I2C_LowLevel_Init(I2C1);
 - вызываем для инициализации (в данном случае I2C 1).
I2C_Master_BufferWrite(I2C1, Buffer_Tx1,1,Interrupt, _ADDRESS); 
I2C_Master_BufferRead(I2C1,Buffer_Rx1,1,Polling, _ADDRESS);
- соответственно функции записи и чтения. 
Параметры:
  1. Выбираем I2C1 или I2C2 - в зависимости от того, куда подключили устройство
  2. Буфер - массив unsigned char  (откуда читаем или куда записываем).
  3. Число байт для чтения или записи
  4. Тип работы - Interrupt, Polling или DMA.
  5. Адрес устройства
Естественно, функции чтения\записи используются, если STM32 работает в режиме Master.
В случае успешного обмена данными эти функции возвращают Success, в противном - Error.

Ну вот, собственно, и всё =)


2 комментария:

  1. Vitkt, большущее спасибо за статью. Я начинающий любитель и хотел бы попросить вас от лица любителей выложить код на обозрение. А то некоторые плохо въезжаю в то что происходит...

    ОтветитьУдалить
    Ответы
    1. Ярослав, вот я тут добавил ссылки, где всё это можно скачать. И ссылки с кодом, правда лучше проверьте всё ли работает :)
      http://myprognote.blogspot.ru/2012/09/i2c-stm32.html

      Удалить