Проект с использованием MCC часть 12-2

Visits: 984


Настало время для изучения шины I2C. Изучать будем на примере работы с индикатором RET012864E. Что изменили со старой схемы:

В прошлой теме я затупил и не добавил подтягивающие резисторы которые необходимы для работы I2C интерфейса. Номинал резисторов может быть в пределах от 1,8к до 10к, в зависимости от скорости которую мы хотим использовать. Принцип простой скорость меньше сопротивление по больше, лично я на 400 кГц ставлю 1,8 к. В нашем контроллере подключение к шине строго к определенным ногам RB6 – SLK, RB4 – SDA.

Для начала самые элементарные понятия про интерфейс I2C.

I²C (IIC, англ. Inter-Integrated Circuit) — последовательная асимметричная шина для связи между интегральными схемами внутри электронных приборов. Использует две двунаправленные линии связи (SDA и SCL), применяется для соединения низкоскоростных периферийных компонентов с процессорами и микроконтроллерами. Разработана фирмой Philips Semiconductors в начале 1980-х как простая 8-битная шина внутренней связи для создания управляющей электроники. Была рассчитана на частоту 100 кГц. Из истории можно почитать в википедии.

Для нас самое главное понять как с этой шиной работать в самом простом варианте, т.е. имеется главное ведущее устройство и несколько подчиненных ведомых. Главное устройство обращается к подчиненным вызывая их по адресу. На шине существует два состояния старт и стоп, которые предназначены для начала и окончания коммуникаций.

Когда главное формирует на шине состояние старт, все периферийные устройства сразу напрягаются и слушают шину. после этого главное устройство начинает формировать адрес. Адрес обычно 7 бит (может и быть 10, это в расширенном варианте и меньше в зависимости от подчиненного устройства). Восьмой бит всегда говорит, чё хочет главное устройство, т.е. если этот бит “1” – значит главное хочет читать периферийное, если ноль, то наоборот, чего-то в него записать намерено.

При отправке каждого байта существует коммуникация в которой передающее устройство понимает, что данные достигли адресата, это 9 бит подтверждения. При помощи чтения этого бита передающее устройство может определить если на шине подчиненное с указанным адресом, выполнен прием данные и т.п.

После окончания передачи данных или при выявлении нестандартной ситуации главное устройство может сформировать на шине состояние СТОП, чем переведет все приемники подчиненных устройств в исходное состояние. вообще если чего-то главному не нравиться, то сразу СТОП и давай все сначала.

Эта глава будет не совсем благодарная, тут мы создадим программный код при помощи MCC, а также научимся его удалять.

Мы начнем с запуск нашего проекта, как после его загрузки, нажимаем на

Заглянем в окошко ресурсы устройства, нас интересует модуль MSSP, именно он в этом микроконтроллере может использоваться для работы как драйвер шины I2C.

Делаем на нем двойной клик и добавляем его в ресурсы нашего проекта

Справа в основном окне MCC откроются свойства

 Проект в MPLABX должен быть выглядеть приблизительно так:

Первое если мы кликнем сюда, то увидим, что модуль может работать в двух режимах, I2C и SPI, при этом может быть как ведущим (мастер) таки ведомым (слэв).

Мы используем индикатор с I2C интерфейсом, поэтому выбираем I2C Master. Птичку Enable MSSP оставляем (а иначе зачем вся эта затея, модуль включен), Siew Rate Control  в режиме высокая скорость (High Speed). Время удержания шины данных 100ns.  Для скорости 400 кГц, необходимо выставить значение 0x9.

Результат сразу видно в строке I2C Clock Fequency. Жаль конечно, что нет обратной функции, поставить частоту и получить значение делителя. Но стандартные значения можно взять из описания:

У нас тактовая 16 МГц – значение делителя 0x9.

Перейдем к закладке регистры, в нем ничего изменять не будем

С генерируем изменения для это нажимает на

Ждем окончания, получим сообщение

В нашем проекте добавятся два новых файла I2C.c и I2C.h. Перейдём в окно проекта:

Просмотрим наши файлы:

I2C.h

МСС предоставила нам функции для работы с I2C шиной. Эти функции универсальные и предназначены для решения многих задач.

В файле i2c.h приведены примеры использования функций, что тоже интересно.

void I2C_Initialize(void) – инициализация модуля.

Эта процедура инициализирует модуль i2c для работы. Она должна быть вызвана перед любой другой функцией I2C. Эта процедура должна вызываться только один раз во время инициализации системы.

Основные рабочие функции это запись и чтение из подчиненного устройства расположенного на шине.

void I2C_MasterWriteuint8_t *pdata, uint8_t length, uint16_t address, I2C_MESSAGE_STATUS *pstatus);

Эта функция подготавливает блок запроса транзакции, а затем вставляет его в очередь i2c, ожидает завершения операции и возвращает результат.

void I2C_MasterRead( uint8_t *pdata, uint8_t length, uint16_t address, I2C_MESSAGE_STATUS *pstatus);

Дополнительные функции которые предназначены для поддержки и являющихся составной частью основных функций. 

void I2C_MasterTRBInsertuint8_t count, I2C_TRANSACTION_REQUEST_BLOCK *ptrb_list, I2C_MESSAGE_STATUS *pflag);

void I2C_MasterReadTRBBuildI2C_TRANSACTION_REQUEST_BLOCK *ptrb, uint8_t *pdata, uint8_t length, uint16_t address);

bool I2C_MasterQueueIsEmpty(void); //

bool I2C_MasterQueueIsFull(void); //

void I2C_BusCollisionISR( void ); //

void I2C_ISR ( void ); // основной функциональный модуль обработки данных


В файле interrupt_manager.c будет встроен механизм обработки прерываний от функций I2C

void interrupt INTERRUPT_InterruptManager (void)
{
    // interrupt handler
    if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1)
    {
        TMR0_ISR();
    }
    else if(INTCONbits.PEIE == 1 && PIE2bits.BCL1IE == 1 && PIR2bits.BCL1IF == 1)
    {
        I2C_BusCollisionISR();
    }
    else if(INTCONbits.PEIE == 1 && PIE1bits.SSP1IE == 1 && PIR1bits.SSP1IF == 1)
    {
        I2C_ISR();
    }
    else if(INTCONbits.IOCIE == 1 && INTCONbits.IOCIF == 1)
    {
        PIN_MANAGER_IOC();
    }
    else
    {
        //Unhandled Interrupt
    }
}
/**
 End of File
*/

Из описания библиотеки её удобно использовать, для обмена данными со внешней памятью.

Но мне кажется, что использование такой библиотеки для управления индикатором немного накладно, поэтому попробуем создать свою библиотеку и использовать её совместно с проектом.


Для начала выполним операцию “удаления” модуля MCC, для этого вызовем MCC (если мы только загрузили проект)

В окне ресурсы проекта выберем модуль MSSP и нажмем на крестик (удаление модуля)

Откроется модальное окно, предупреждения удаления из проета модуля, нажимаем Да. В окне ресурсы проекта модуль MSSP исчезнет

И не забудем нажать кнопочку 

MCC выполнить удаление записей относящихся к модулю MCC из файлов проекта, но файлы библиотеки будут присутствовать в проекте из придется удалить в ручную:

Аналогичную операцию, надо будет выполнить и с файлом I2C.c.


Так мы настроили I2C при помощи MCC и удалили, а теперь придется разобраться как все это сделать самостоятельно.

Для начала зайдем в папку проекта и удалим файлы I2C созданные MCC, пока они нам не понадобятся.

Создадим папку I2C_XC8 в ней мы будем хранить файлы нашей библиотеки:

В нашем проекте откроем папку Heades Files и выполним следующие операции по добавлению нашего каталога, правой кнопкой мыши, вызываем контекстное меню , нем выбираем добавить папки:

Откроется диалоговое окно, нажимает кнопку добавить папку:

В открывшемся окне проводника выберем нашу новую папку:

Папка будет добавлена в список, на этом этапе при необходимости можно добавить несколько папок, но у нас такая задача пока не стоит ,нажимаем добавить:

И у нас должно выполниться изменение в проекте:

Теперь выберем каталог Sourse Files и выполним аналогичные действия по добавлению нашего каталога и суда, проект должен быть выглядеть так:

Теперь создаем заголовочный и рабочий файл, в которых мы создадим библиотеку для работы с шиной I2C, для этого выберем нашу новую папку и вызовем контекстное меню, в нем выберем НОВЫЙ и далее ЗАГОЛОВОЧНЫЙ файл для XC8:

 

Откроется диалоговое окно:

Изменим имя файла на I2C и нажмем финиш

MPLAB X сразу откроет наш файл. Проведем аналогичную операцию для создания рабочего файла:

Аналогично откроется окно

Изменим имя файла и нажмем финиш

После чего рабочий проект примет вид:


В следующей части писать самостоятельно саму библиотеку для работы с шиной I2C…


Это может быть интересно


  • 12-BIT A/D CONVERTER WITH THRESHOLD DETECT на примере PIC24FJ128GA20412-BIT A/D CONVERTER WITH THRESHOLD DETECT на примере PIC24FJ128GA204
    Visits: 792 Введение. 12-битный модуль A/D Converter является усовершенствованной версией 10-битного модуля, предлагаемого на некоторых устройствах PIC24. Оба модуля являются преобразователями, в своих ядрах, с последовательным приближением (SAR), в окружении …
  • Гаджеты для домашней автоматики – Емкостной сенсорГаджеты для домашней автоматики – Емкостной сенсор
    Visits: 1556 Управление светодиодным освещением – Сенсор емкостной. Данный гаджет предназначен для управления освещением где необходимо включением освещение сенсорным прикосновением. Датчик позволяет управлять светодиодной нагрузкой в виде модулей или светодиодных лент …
  • Простой сенсорный регулятор светаПростой сенсорный регулятор света
    Visits: 2289 Простой сенсорный регулятор. Проект – 2007 года. Регулятор выполнена на микроконтроллере PIC12F683 и имеет минимальное количество элементов. Выполняет стандартные функции, включение выключение света, изменение яркости, запоминание последнего установленного уровня …
  • Проект с использованием MCC часть 13Проект с использованием MCC часть 13
    Visits: 1001 Так как используя MCC мы можем его использовать со своими библиотеками, поэтому настало время и свое создать. Для начала откроем наш заголовочный файл в нем очень много букв: По …
  • Altium Designer my Libraries, Project templates, System settings by Catcatcat V23.09Altium Designer my Libraries, Project templates, System settings by Catcatcat V23.09
    Visits: 228   September 2023 component base update.  Release updates V.  – 23_09 added new components. Changed the structure of the database. Configuration file name – DXPPreferences1.DXPPrf. Added project CLUBBEST_50_Light. …
  • Audio-bluetooth modules F-6188 (BK8000L)Audio-bluetooth modules F-6188 (BK8000L)
    Visits: 2240Следующий модуль на чипе BK8000L. Заводское обозначение F-6188 также основным производителем не выпускается и отдан на тиражирование. с нижней стороны имеет маркировку В этом варианте мне попалась вроде полноценная …
  • Мультимедийная сеть – AVC-LAN TOYOTAМультимедийная сеть – AVC-LAN TOYOTA
    Visits: 5661 AVC LAN – протокол обмена данными мультимедийных систем автомобиля. Кодирование данных. При кодировании различаться три типа данных : преамбула – её назначение, это сообщение устройствам на шине, что начинается передача данных. …
  • Проект с использованием MCC часть 12-2Проект с использованием MCC часть 12-2
    Visits: 984 Настало время для изучения шины I2C. Изучать будем на примере работы с индикатором RET012864E. Что изменили со старой схемы: В прошлой теме я затупил и не добавил подтягивающие резисторы …
  • Оптосимистор и его применениеОптосимистор и его применение
    Visits: 19385 Эрве Кадино “Цветомузыкальные установки” Ответ на вопрос – управление мощным тиристором или симистором, от терморегулятора. Статья в pdf[wpdm_file id=129 template=”link-template-calltoaction3.php”] Оптосимистор принадлежат к классу оптронов и обеспечивают очень хорошую …
  • AD9833 – Programmable Waveform GeneratorAD9833 – Programmable Waveform Generator
    Visits: 2729 Простой генератор звуковых частот на AD9833. Для тестирования БПФ в светомузыке мне нужен был генератор звуковых частот. Я  использовал советский Г3-112, но он себя давно изжил.  Все думал купить …



Поделись этим!

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

Продолжайте читать

НазадДалее

Комментарии

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.