Skip to content

Commit bdddcce

Browse files
committed
add
1 parent 7547a12 commit bdddcce

File tree

6 files changed

+317
-0
lines changed

6 files changed

+317
-0
lines changed

README.md

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)
2+
![author](https://img.shields.io/badge/author-AlexGyver-informational.svg)
3+
# microWire
4+
Лёгкая библиотека со стандартным набором инструментов для работы с аппаратным I2C
5+
- Облегчайте свой код простой заменой Wire.h на microWire.h
6+
- ATmega168/328p (nano,uno,mini), ATmega32u4 (leonardo,micro) , ATmega2560 (mega)
7+
8+
### Совместимость
9+
AVR ATmega168/328p (nano,uno,mini), ATmega32u4 (leonardo,micro), ATmega2560 (mega)
10+
11+
## Содержание
12+
- [Установка](#install)
13+
- [Инициализация](#init)
14+
- [Использование](#usage)
15+
- [Пример](#example)
16+
- [Версии](#versions)
17+
- [Баги и обратная связь](#feedback)
18+
19+
<a id="install"></a>
20+
## Установка
21+
- Библиотеку можно найти по названию **microWire** и установить через менеджер библиотек в:
22+
- Arduino IDE
23+
- Arduino IDE v2
24+
- PlatformIO
25+
- [Скачать библиотеку](https://github.com/GyverLibs/microWire/archive/refs/heads/main.zip) .zip архивом для ручной установки:
26+
- Распаковать и положить в *C:\Program Files (x86)\Arduino\libraries* (Windows x64)
27+
- Распаковать и положить в *C:\Program Files\Arduino\libraries* (Windows x32)
28+
- Распаковать и положить в *Документы/Arduino/libraries/*
29+
- (Arduino IDE) автоматическая установка из .zip: *Скетч/Подключить библиотеку/Добавить .ZIP библиотеку…* и указать скачанный архив
30+
- Читай более подробную инструкцию по установке библиотек [здесь](https://alexgyver.ru/arduino-first/#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA)
31+
32+
<a id="init"></a>
33+
## Инициализация
34+
Нет
35+
36+
<a id="usage"></a>
37+
## Использование
38+
```cpp
39+
void begin(void); // инициализация шины
40+
void setClock(uint32_t clock); // ручная установка частоты шины 31-900 kHz (в герцах)
41+
void beginTransmission(uint8_t address); // открыть соединение (для записи данных)
42+
uint8_t endTransmission(bool stop); // закрыть соединение , произвести stop или restart (по умолчанию - stop)
43+
uint8_t endTransmission(void); // закрыть соединение , произвести stop
44+
void write(uint8_t data); // отправить в шину байт данных , отправка производится сразу , формат - byte "unsigned char"
45+
void requestFrom(uint8_t address , uint8_t length , bool stop); //открыть соединение и запросить данные от устройства, отпустить или удержать шину
46+
void requestFrom(uint8_t address , uint8_t length); //открыть соединение и запросить данные от устройства, отпустить шину
47+
uint8_t read(void); // прочитать байт , БУФЕРА НЕТ!!! , читайте сразу все запрошенные байты , stop или restart после чтения последнего байта, настраивается в requestFrom
48+
uint8_t available(void); // вернет количество оставшихся для чтения байт
49+
```
50+
51+
<a id="example"></a>
52+
## Пример
53+
```cpp
54+
/* Пример записи и чтения данных в I2C - EEPROM "AT24C32" */
55+
56+
// #include <Wire.h> // заменяем Wire.h на microWire.h
57+
#include <microWire.h>
58+
59+
uint8_t chipAddress = 0x57; // адрес устройства (используйте i2c scaner для определения)
60+
uint16_t cellAddress = 3064; // адрес первой ячейки , куда будем писать и откуда читать
61+
uint8_t data_0 = 115; // данные , которые запишем в EEPROM ( сравнивайте с этим числом при чтении )
62+
uint8_t data_1 = 14;
63+
64+
void setup() {
65+
Serial.begin(9600);
66+
Wire.begin();
67+
68+
/* запись */
69+
Wire.beginTransmission(chipAddress); // начинаем передачу с устройством , зовем по адресу
70+
Wire.write(highByte(cellAddress)); // отправляем старший байт первой адреса ячейки
71+
Wire.write(lowByte(cellAddress)); // отправляем младший байт первой адреса ячейки
72+
Wire.write(data_0); // отпарвляем байт данных
73+
Wire.write(data_1); // отпарвляем еще байт данных
74+
Wire.endTransmission(); // завершаем передачу
75+
76+
delay(50); // подождем
77+
78+
/* чтение */
79+
Wire.beginTransmission(chipAddress); // начинаем передачу с устройством , зовем по адресу
80+
Wire.write(highByte(cellAddress)); // отправляем старший байт адреса первой ячейки
81+
Wire.write(lowByte(cellAddress)); // отправляем младший байт адреса первой ячейки
82+
Wire.endTransmission(); // завершаем передачу
83+
Wire.requestFrom(chipAddress , 2); // запрашиваем свои 2 байта данных
84+
while (Wire.available()) { // пока запрошенные данные не кончились
85+
Serial.println(Wire.read()); // читаем и выводим их
86+
}
87+
}
88+
89+
void loop() {
90+
}
91+
```
92+
93+
<a id="versions"></a>
94+
## Версии
95+
- v2.1
96+
97+
<a id="feedback"></a>
98+
## Баги и обратная связь
99+
При нахождении багов создавайте **Issue**, а лучше сразу пишите на почту [[email protected]](mailto:[email protected])
100+
Библиотека открыта для доработки и ваших **Pull Request**'ов!
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/* Пример записи и чтения данных в I2C - EEPROM "AT24C32" */
2+
3+
// #include <Wire.h> // заменяем Wire.h на microWire.h
4+
#include <microWire.h>
5+
6+
uint8_t chipAddress = 0x57; // адрес устройства (используйте i2c scaner для определения)
7+
uint16_t cellAddress = 3064; // адрес первой ячейки , куда будем писать и откуда читать
8+
uint8_t data_0 = 115; // данные , которые запишем в EEPROM ( сравнивайте с этим числом при чтении )
9+
uint8_t data_1 = 14;
10+
11+
void setup() {
12+
Serial.begin(9600);
13+
Wire.begin();
14+
15+
/* запись */
16+
Wire.beginTransmission(chipAddress); // начинаем передачу с устройством , зовем по адресу
17+
Wire.write(highByte(cellAddress)); // отправляем старший байт первой адреса ячейки
18+
Wire.write(lowByte(cellAddress)); // отправляем младший байт первой адреса ячейки
19+
Wire.write(data_0); // отпарвляем байт данных
20+
Wire.write(data_1); // отпарвляем еще байт данных
21+
Wire.endTransmission(); // завершаем передачу
22+
23+
delay(50); // подождем
24+
25+
/* чтение */
26+
Wire.beginTransmission(chipAddress); // начинаем передачу с устройством , зовем по адресу
27+
Wire.write(highByte(cellAddress)); // отправляем старший байт адреса первой ячейки
28+
Wire.write(lowByte(cellAddress)); // отправляем младший байт адреса первой ячейки
29+
Wire.endTransmission(); // завершаем передачу
30+
Wire.requestFrom(chipAddress , 2); // запрашиваем свои 2 байта данных
31+
while (Wire.available()) { // пока запрошенные данные не кончились
32+
Serial.println(Wire.read()); // читаем и выводим их
33+
}
34+
35+
}
36+
37+
void loop() {
38+
39+
}

keywords.txt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#######################################
2+
# Syntax Coloring Map For microWire
3+
#######################################
4+
#######################################
5+
# Datatypes (KEYWORD1)
6+
#######################################
7+
microWire KEYWORD1
8+
#######################################
9+
# Methods and Functions (KEYWORD2)
10+
#######################################
11+
begin KEYWORD2
12+
setClock KEYWORD2
13+
beginTransmission KEYWORD2
14+
endTransmission KEYWORD2
15+
write KEYWORD2
16+
read KEYWORD2
17+
requestFrom KEYWORD2
18+
available KEYWORD2
19+
#######################################
20+
# Constants (LITERAL1)
21+
#######################################
22+

library.properties

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
name=microWire
2+
version=2.1
3+
author=AlexGyver <[email protected]>
4+
maintainer=AlexGyver <[email protected]>
5+
sentence=Light library for I2C communication
6+
paragraph=Light library for I2C communication
7+
category=Communication
8+
url=https://github.com/GyverLibs/microWire
9+
architectures=avr

src/microWire.cpp

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#include "microWire.h"
2+
3+
void TwoWire::begin()
4+
{ // Инициализация шины в роли master
5+
pinMode(SDA, INPUT_PULLUP); // Подтяжка шины
6+
pinMode(SCL, INPUT_PULLUP); // Подтяжка шины
7+
TWBR = 72; // Стандартная скорость - 100kHz
8+
TWSR = 0; // Делитель - /1 , статус - 0;
9+
}
10+
11+
void TwoWire::setClock(uint32_t clock)
12+
{ // Функция установки частоты шины 31-900 kHz (в герцах)
13+
TWBR = (((long)F_CPU / clock) - 16) / 2; // Расчет baudrate - регистра
14+
}
15+
16+
void TwoWire::beginTransmission(uint8_t address)
17+
{ // Начать передачу (для записи данных)
18+
TwoWire::start(); // Старт
19+
TwoWire::write(address << 1); // Отправка slave - устройству адреса с битом "write"
20+
}
21+
22+
uint8_t TwoWire::endTransmission(void)
23+
{ // Завершить передачу и отпустить шину
24+
return TwoWire::endTransmission(true);
25+
}
26+
27+
uint8_t TwoWire::endTransmission(bool stop)
28+
{ // Завершить передачу (после записи данных)
29+
if (stop) TwoWire::stop(); // Если задано stop или аргумент пуст - отпустить шину
30+
else TwoWire::start(); // Иначе - restart (другой master на шине не сможет влезть между сообщениями)
31+
if (_address_nack) { // Если нет ответа при передаче адреса
32+
_address_nack = false; // Обнуляем оба флага
33+
_data_nack = false; // Обнуляем оба флага
34+
return 2; // Возвращаем '2'
35+
} if (_data_nack) { // Если нет ответа при передаче данных
36+
_address_nack = false; // Обнуляем оба флага
37+
_data_nack = false; // Обнуляем оба флага
38+
return 3; // Возвращаем '2'
39+
} return 0; // Если все ОК - возвращаем '0'
40+
}
41+
42+
void TwoWire::write(uint8_t data)
43+
{ // Прямая отправка байта на шину
44+
TWDR = data; // Записать данные в data - регистр
45+
TWCR = _BV(TWEN) | _BV(TWINT); // Запустить передачу
46+
while (!(TWCR & _BV(TWINT))); // Дождаться окончания
47+
uint8_t _bus_status = TWSR & 0xF8; // Чтение статуса шины
48+
if(_bus_status == 0x20) _address_nack = true; // SLA + W + NACK ? - нет ответа при передаче адреса
49+
if(_bus_status == 0x30) _data_nack = true; // BYTE + NACK ? - нет ответа при передаче данных
50+
}
51+
52+
uint8_t TwoWire::available()
53+
{ // Вернуть оставшееся количество запрошенных для чтения байт
54+
return _requested_bytes; // Это содержимое этой переменной
55+
}
56+
57+
uint8_t TwoWire::read()
58+
{ // Прямое чтение байта из шины после запроса
59+
if (--_requested_bytes) { // Если байт не последний
60+
TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWEA); // Запустить чтение шины (с подтверждением "ACK")
61+
while (!(TWCR & _BV(TWINT))); // Дождаться окончания приема данных
62+
return TWDR; // Вернуть принятые данные , это содержимое data - регистра
63+
}
64+
_requested_bytes = 0; // Если читаем последний байт
65+
TWCR = _BV(TWEN) | _BV(TWINT); // Запустить чтение шины (БЕЗ подтверждения "NACK")
66+
while (!(TWCR & _BV(TWINT))); // Дождаться окончания приема данных
67+
if (_stop_after_request) TwoWire::stop(); // Если в requestFrom не задан аргумент stop , или stop задан как true - отпустить шину
68+
else TwoWire::start(); // Иначе - restart (другой master на шине не сможет влезть между сообщениями)
69+
return TWDR; // Вернуть принятый ранее байт из data - регистра
70+
}
71+
72+
void TwoWire::requestFrom(uint8_t address , uint8_t length)
73+
{ // Запрос n-го кол-ва байт от ведомого устройства и отпускание шины
74+
TwoWire::requestFrom(address , length , true);
75+
}
76+
77+
void TwoWire::requestFrom(uint8_t address , uint8_t length , bool stop)
78+
{ // Запрос n-го кол-ва байт от ведомого устройства (Читайте все байты сразу!!!)
79+
_stop_after_request = stop; // stop или restart после чтения последнего байта
80+
_requested_bytes = length; // Записать в переменную количество запрошенных байт
81+
TwoWire::start(); // Начать работу на шине
82+
TwoWire::write((address << 1) | 0x1); // Отправить устройству адрес + бит "read"
83+
}
84+
85+
void TwoWire::start()
86+
{ // сервисная функция с нее начинается любая работа с шиной
87+
TWCR = _BV(TWSTA) | _BV(TWEN) | _BV(TWINT); // start + TwoWire enable + установка флага "выполнить задачу"
88+
while (!(TWCR & _BV(TWINT))); // Ожидание завершения
89+
}
90+
91+
void TwoWire::stop()
92+
{ // сервисная функция ей заканчивается работа с шиной
93+
TWCR = _BV(TWSTO) | _BV(TWEN) | _BV(TWINT); // stop + TwoWire enable + установка флага "выполнить задачу"
94+
}
95+
96+
TwoWire Wire = TwoWire();

0 commit comments

Comments
 (0)