01 ноября 2012

Пример реализации софтового I2C на STM32

Содержание статьи обновлено. Перейти к актуальной версии.

15 комментариев:

  1. Кто-нибудь проверял? Код рабочий?

    ОтветитьУдалить
  2. А этот код в нескольких проектах работает.
    Если что, вот исходники https://dl.dropboxusercontent.com/u/26859604/utils.zip

    ОтветитьУдалить
  3. А чем не устроила аппаратная реализация i2c?

    ОтветитьУдалить
    Ответы
    1. Этот код мигрировал с контроллера на контроллер, поэтому я сделал его максимально универсальным. Причем требований к быстродействию у меня не было.
      Но изначально я хотел сделать I2C на прерываниях, но аппаратная реализация этого модуля на stm32 меня огорчила. В нем есть баги, из-за которых он может сбоить, если прерывания I2C не имеют высшего приоритета. Или как другой вариант инженеры из ST предлагают отключать другие прерывания, что тоже не очень красиво. В итоге я сделал софтварно и использую этот код на операционке реального времени. Модуль работы с I2C крутится в своем процессе и никому не мешает.

      Удалить
    2. Согласен с вами абсолютно ! Reference-manual по вопросу I2C читается быстро , но оставляет большое число вопросов . Из всех встроенных модулей I2C на моём контроллере в итоге не заработал ни один , хотя делал всё в строгом соответствии с с документацией . В итоге плюнул на этот модуль и сейчас хочу реализовать софтверно-аппаратный с выдержками и прерываниями от таймера . Криво , но хоть как-то . Надеюсь ситуация с этим модулем будет исправлена в будущем .

      Удалить
  4. В чем работает код? В STVD ? В CooCox?

    ОтветитьУдалить
  5. И что в этих файлах "stdbool.h" , "config.h" , "hardwareMap.h" ?

    ОтветитьУдалить
  6. А еще лучше их включить в архив. Потому что при компиляции выдает кучу ошибок по поводу того что порты не правильно сконфигурированны и нет определния типов некоторых переменных введенных в программе. Где эти опредления? И что за странная конфигурация структур портов ввода/вывода что стандартные бибилиотеки не понимают?

    ОтветитьУдалить
    Ответы
    1. Каюсь, выложенные исходники я выдрал из рабочего проекта и зависимые файлы не приложил в архив. В ближайшее время переоформлю статью и добавлю то, ради чего это затевалось - интерфейс для более менее удобного хранения параметров в энергонезависимой памяти с проверками целостности. Ну и готовые проекты для эклипса/кококса.
      А пока что для справки:
      "stdbool.h" - стандартная имплементация bool для си.
      "hardwareMap.h" - аппаратно зависимые для печатной платы определения. В данном случае переопределения GPIO_Pin_SCL и GPIO_Pin_SDA и I2C_RCC_APB2Periph_GPIO и I2C_GPIO на стандартные дефайны.

      Удалить
  7. Я понял что это стандартная библиотекаа от ST. Понял. Постарюсь поправить сам. А что за странная инициализация GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; ?

    ОтветитьУдалить
    Ответы
    1. А это стандартная настройка порта ввода вывода как "выход с открытым коллектором".

      Удалить
  8. В стандартной библиотеке это не так делается

    ОтветитьУдалить
    Ответы
    1. Для stm32f4 это не так делается. А для stm32f10x так.
      Там перечисление есть:
      typedef enum
      { GPIO_Mode_AIN = 0x0,
      GPIO_Mode_IN_FLOATING = 0x04,
      GPIO_Mode_IPD = 0x28,
      GPIO_Mode_IPU = 0x48,
      GPIO_Mode_Out_OD = 0x14,
      GPIO_Mode_Out_PP = 0x10,
      GPIO_Mode_AF_OD = 0x1C,
      GPIO_Mode_AF_PP = 0x18
      }GPIOMode_TypeDef;

      Удалить
  9. Скинь лучше исходники вместе с библиотекой. Что то не получается даже скомпилировать проект.

    ОтветитьУдалить