Показаны сообщения с ярлыком stm32 i2c example. Показать все сообщения
Показаны сообщения с ярлыком stm32 i2c example. Показать все сообщения

среда, 23 января 2013 г.

Простой способ работы с I2C в STM32. Часть 2.

В предыдущем посте я кратко описал простой способ работы с протоколом I2C в STM32.
В этом сообщении я добавил несколько ссылок на необходимые файлы и документацию, а также код-примере работы с 
платой Pololu MinIMU-9.

1. Итак, для начала качаем AN2824 "STM32F101xx and STM32F103xx medium- and high-density devices: advanced I²C examples", он же "STM32F10xxx I2C optimized examples" вот отсюда.
Скаченный файл представляет собой архив с примерами работы по протоколу I2C. Распаковываем архив. Если у вас Keil, то вам необходим файл "папка_куда_вы_распаковали_архив\STM32F10x_AN2824_FW_V4.0.0\Project\OptimizedI2Cexamples\MDK-ARM\Optimized I2C examples.uvproj".

Документация здесь.

В файле main.c  находим следующий код.

2. Важные для нас функции:
I2C_LowLevel_Init(I2C1); - инициализируем I2C1 или I2C2
I2C_Master_BufferWrite(I2C1, Buffer_Tx1,1,Interrupt, _ADDRESS); - записываем данные из буфера. 
I2C_Master_BufferRead(I2C1,Buffer_Rx1,1,Polling, _ADDRESS); - читаем данные в буфер.


Читать или писать мы можем тремя способами - Interrupt, Polling или DMA. Все эти функции описываются и реализуются в файлах I2CRoutines.h и I2CRoutines.с (можно посмотреть код реализации).

3. А вот, собственно, и функции для работы с гироскопом, акселерометром и магнитометром. Вначале устройства инициализируются, затем происходит чтение данных в переменные x,y,z. 
Вот и сам код: http://pastebin.com/70rhVxNF



вторник, 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.

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