Для проекта мне бы хотелось, чтобы три PIC (два ведомых PIC18F4620, один главный PIC18F46K22) обменивались данными по шине I2C. Позже может быть добавлено больше рабов (например, EEPROM, SRAM, ...). Я пишу код для этих PIC в C, используя компилятор C18. Я много смотрел в интернете, но не смог найти библиотек для обработки периферийных устройств (M) SSP. Я прочитал таблицу данных обоих PIC на периферийном устройстве (M) SSP в режиме I2C, но не смог выяснить, как взаимодействовать с шиной.
Поэтому мне нужны основные и подчиненные библиотеки.
Что вы порекомендуете? У вас где-нибудь есть такая библиотека? Он встроен в компилятор и если да, то где? Где-нибудь в сети есть хороший учебник?
Ответы:
Микрочип написал примечания к приложению по этому поводу:
Замечания по применению работают с ASM, но их легко перенести на C.
Бесплатные компиляторы Microchip C18 и XC8 имеют функции I2C. Подробнее о них вы можете прочитать в документации к библиотекам компилятора , раздел 2.4. Вот небольшая информация о начале:
Настройка
У вас уже есть компилятор Microchip C18 или XC8. Они оба имеют встроенные функции I2C. Чтобы использовать их, вам необходимо включить
i2c.h
:Если вы хотите взглянуть на исходный код, вы можете найти его здесь:
installation_path
/v
x.xx
/h/i2c.h
installation_path
/v
x.xx
/src/pmc_common/i2c/
installation_path
/v
x.xx
/include/plib/i2c.h
installation_path
/v
x.xx
/sources/pic18/plib/i2c/
В документации вы можете найти, в каком файле в
/i2c/
папке находится функция.Открытие соединения
Если вы знакомы с MSSP-модулями Microchip, вы будете знать, что их сначала нужно инициализировать. Вы можете открыть соединение I2C через порт MSSP, используя
OpenI2C
функцию. Вот как это определяется:С помощью
sync_mode
вы можете выбрать, является ли устройство ведущим или ведомым, и, если это ведомое устройство, должно ли оно использовать 10-битный или 7-битный адрес. Большую часть времени используется 7-бит, особенно в небольших приложениях. Варианты дляsync_mode
:SLAVE_7
- ведомый режим, 7-битный адресSLAVE_10
- ведомый режим, 10-битный адресMASTER
- Мастер режимС помощью
slew
вы можете выбрать, будет ли устройство использовать скорость нарастания. Подробнее о том, что здесь: Какова скорость нарастания для I2C?Два модуля MSSP
В устройствах с двумя модулями MSSP есть что-то особенное, например, PIC18F46K22 . У них есть два набора функций, один для модуля 1 и один для модуля 2. Например, вместо того
OpenI2C()
, они имеютOpenI2C1()
иopenI2C2()
.Итак, вы все настроили и открыли соединение. Теперь давайте сделаем несколько примеров:
Примеры
Мастер написать пример
Если вы знакомы с протоколом I2C, вы будете знать, что типичная основная последовательность записи выглядит следующим образом:
Сначала мы отправляем условие START. Подумайте об этом, поднимая трубку. Затем адрес с битом записи - набор номера. На этом этапе раб с отправленным адресом знает, что его вызывают. Он отправляет подтверждение («Привет»). Теперь ведущее устройство может отправлять данные - он начинает говорить. Он отправляет любое количество байтов. После каждого байта ведомый должен подтверждать полученные данные («да, я вас слышу»). Когда ведущее устройство завершило разговор, он вешает трубку в состоянии STOP.
В C последовательность записи мастера будет выглядеть следующим образом:
Мастер прочитал пример
Последовательность основного чтения немного отличается от последовательности записи:
Опять же, мастер инициирует вызов и набирает номер. Однако сейчас он хочет получить информацию. Сначала подчиненный отвечает на вызов, затем начинает говорить (отправляя данные). Мастер подтверждает каждый байт, пока у него не будет достаточно информации. Затем он отправляет Not-ACK и кладет трубку с условием STOP.
В Си это будет выглядеть так для основной части:
Ведомый код
Для ведомого лучше всего использовать программу обработки прерываний или ISR. Вы можете настроить свой микроконтроллер на получение прерывания при вызове вашего адреса. Таким образом, вам не нужно постоянно проверять автобус.
Во-первых, давайте настроим основы для прерываний. Вам нужно будет включить прерывания и добавить ISR. Важно, чтобы PIC18 имели два уровня прерываний: высокий и низкий. Мы собираемся установить I2C как прерывание с высоким приоритетом, потому что очень важно отвечать на вызов I2C. Что мы собираемся сделать, это следующее:
GOTO
инструкцию к общему ISR для вектора прерывания с высоким приоритетом. Мы не можем поместить общий ISR непосредственно в вектор, потому что во многих случаях он слишком велик.Вот пример кода:
Следующее, что нужно сделать, - включить высокоприоритетное прерывание при инициализации чипа. Это можно сделать несколькими простыми манипуляциями с регистром:
Теперь у нас работают прерывания. Если вы реализуете это, я бы проверил это сейчас. Напишите основную информацию,
SSPISR()
чтобы начать мигать светодиодом, когда происходит прерывание SSP.Ладно, значит, ваши прерывания работают. Теперь давайте напишем реальный код для
SSPISR()
функции. Но сначала немного теории. Мы выделяем пять различных типов прерываний I2C:Вы можете проверить, в каком состоянии вы находитесь, проверив биты в
SSPSTAT
регистре. Этот регистр выглядит следующим образом в режиме I2C (неиспользуемые или нерелевантные биты опускаются):С помощью этих данных легко увидеть, в каком состоянии находится модуль I2C:
В программном обеспечении лучше использовать состояние 5 по умолчанию, которое предполагается, когда не соблюдаются требования для других состояний. Таким образом, вы не отвечаете, когда не знаете, что происходит, потому что раб не отвечает на NACK.
В любом случае, давайте посмотрим на код:
Вы можете увидеть, как вы можете проверить
SSPSTAT
регистр (сначала с AND,0x2d
чтобы у нас были только полезные биты), используя битовые маски, чтобы увидеть, какой у нас тип прерывания.Ваша задача выяснить, что вы должны отправить или сделать, когда отвечаете на прерывание: это зависит от вашего приложения.
Ссылки
Опять же, я хотел бы упомянуть замечания по применению, которые Микрочип написал о I2C:
Есть документация для библиотек компилятора: Документация для библиотек компилятора
При настройке чего-либо самостоятельно проверьте таблицу данных вашего чипа в разделе (M) SSP для связи I2C. Я использовал PIC18F46K22 для основной части и PIC18F4620 для подчиненной части.
источник
Во-первых, я бы рекомендовал перейти на компилятор XC8 просто потому, что он самый последний. Доступны периферийные библиотеки, но я никогда ими не пользовался. Проверьте на сайте Microchips подробности и документацию.
Хорошо, у меня есть несколько очень старых базовых подпрограмм для IEP-коммуникаций EEPROM, которые я использовал давным-давно с PIC16F и старым компилятором среднего уровня Microhip (возможно, Hi-Tech), но я думаю, что они могут работать нормально с PIC18, так как я думаю, что периферийное устройство то же самое. Вы все равно очень быстро узнаете, все ли по-другому.
Они были частью большого файла, который использовался в проекте регистратора температуры, поэтому я быстро удалил все другие несвязанные функции и сохранил их в виде файлов ниже, так что, возможно, я немного напутал, но, надеюсь, вы сможет получить представление о том, что нужно (это может даже просто работать, вы никогда не знаете ;-))
Вам нужно убедиться, что основной файл заголовка правильный, и проверить / изменить контакты, чтобы убедиться, что они являются правильными периферийными выводами I2C, и имена регистров, если они от компилятора Hi-Tech, который сделал вещи немного по-другому в отношении соглашения о присвоении имен.
Файл I2C.c:
Заголовочный файл I2C.h:
источник
SSP1ADD = ((_XTAL_FREQ/100000)/4)-1;
для 1 кГц и т. Д.Компиляторы XC8 и XC16 включают библиотеки для I2C.
Проблема, с которой я столкнулся, заключается в том, что документация не очень хорошая! Если вы используете примеры из документации по Microchip, вам не повезло. Даже поддержка Microchip не может вам помочь. Я был там сам.
Некоторое время назад я работал с микроконтроллером серии PIC24EP512GP, и библиотека не работала для меня, как описано в Microchip.
источник