Оказывается многие сложные вещи можно сделать значительно проще.
Недавно пришлось работать вот с чем - необходимо реализовать обработку данных с платы 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);
- соответственно функции записи и чтения.
Параметры:
- Выбираем I2C1 или I2C2 - в зависимости от того, куда подключили устройство
- Буфер - массив unsigned char (откуда читаем или куда записываем).
- Число байт для чтения или записи
- Тип работы - Interrupt, Polling или DMA.
- Адрес устройства
В случае успешного обмена данными эти функции возвращают Success, в противном - Error.
Ну вот, собственно, и всё =)
Vitkt, большущее спасибо за статью. Я начинающий любитель и хотел бы попросить вас от лица любителей выложить код на обозрение. А то некоторые плохо въезжаю в то что происходит...
ОтветитьУдалитьЯрослав, вот я тут добавил ссылки, где всё это можно скачать. И ссылки с кодом, правда лучше проверьте всё ли работает :)
Удалитьhttp://myprognote.blogspot.ru/2012/09/i2c-stm32.html