I2C MODULE

Обход ошибок в версии I2C MODULE – PIC18F25K42 Device ID Revision = A001

В Серии K42 применен совершенно новый модуль шины I2C, который позволяет поддерживать все режимы этой шины. Но в реализации микроконтроллера PIC18F25K42 версия A001 есть ряд ошибок которые не позволяют использовать это преимущество, в следующей версии многие баги пофиксены, но мне попалась версия 1.

Не задокументированные ошибки модуля

Максимальная частота шины до 100 кГц

При частоте шины выше 100 кГц невозможно передавать байт данных у которых старший бит равен 1. при это логика модуля воспринимает такое состояние как Останов шины и при этом тактовая не отключается.

Неправильное формирование состояние Останов

Флаг состояния PCIF не сбрасывается, по этому его надо перед формированием стоп сбросить принудительно.

Не формируется NOAck

Благ управления NoAck в модуле должен формироваться автоматически, но в этой версии он работает некорректно. Для обхода необходимо перед принятием последнего байта от подчиненного устройства произвести чтение регистра I2CRXB.

Логика работы модуля не позволяет сбросить через флаги внутреннию ошибку модуля

Это можно обойти только выключением модуля.

При работе с MCC генерируется библиотека которая не может работать на этом микроконтроллере

С выше приведенными багами, можно бороться, библиотека предлагаемая MCC была переработана для возможности полнофункционального использования модуля.

В библиотеку были добавлены ряд новых функций которые позволяют использовать микросхемы памяти типа 24LC1025.

Обратите внимание работая частота модуля не должна превышать 100 кГц. Есть варианты, когда её придется сделать чуть ниже.

Названия функций остались совместимыми с MCC.

Все функции тестировались при питании микроконтроллера 3,3 вольта.

Функции библиотеки


Чтение состояние ошибки

i2c_error i2c1_getLastError(void)


Чтение байта данных из устройства

uint8_t i2c1_read1ByteRegister(uint8_t address, uint8_t reg)
uint8_t i2c1_read12ByteRegister(uint8_t address, uint16_t reg)


Чтение слова из устройства

uint16_t i2c1_read2ByteRegister(uint8_t address, uint8_t reg);
uint16_t i2c1_read22ByteRegister(uint8_t address, uint16_t reg);


Запись байта в регистр (память) устройства

void i2c1_write1ByteRegister(uint8_t address, uint8_t reg, uint8_t data);
void i2c1_write12ByteRegister(uint8_t address, uint16_t reg, uint8_t data);


Запись слова в регистр (память) устройство

void i2c1_write2ByteRegister(uint8_t address, uint8_t reg, uint16_t data);
void i2c1_write22ByteRegister(uint8_t address, uint16_t reg, uint16_t data);


Запись массива данных в устройство

void i2c1_writeNBytes(uint8_t address, void * data, uint8_t len);
void i2c1_write1NBytes(uint8_t address, uint8_t reg, void* data, uint8_t len);
void i2c1_write2NBytes(uint8_t address, uint16_t reg, void* data, uint8_t len);


Чтение массива данных из устройства

void i2c1_readDataBlock(uint8_t address, uint8_t reg, char *data, uint8_t len);
void i2c1_read2DataBlock(uint8_t address, uint16_t reg, char *data, uint8_t len);


И простые функции непосредственного чтения и записи данных. Удобно использовать для работы с китайскими драйверами LED дисплеев, например TM1650.

передать 1 байт
void i2c1_writeBytes(uint8_t address, uint8_t data);
 получить 1 байт
uint8_t i2c1_readBytes(uint8_t address);


Tagged with →  
Share →

0 Responses to I2C MODULE – PIC18F25K42 Device ID Revision = A001

  1. […] Обход проблемы возможен библиотека см статью. […]

Translate »

Copyright © Catcatcat 2013-2018. Все права защищены.
Копирование разрешается только с указанием активной ссылки на правообладателя.

e-mail: catcatcat.electronics@gmail.com