Alter.Org.UA
 << Back Home EN en   Donate Donate

Arduino Zero-copy I2C (Wire) library

#програмерське побутове Робив п╕д одну задачу простий ╕ дешевий перех╕дник Wire I2C для Arduino. Про його застосування окремо буде трохи згодом. Наче все просто, але в якийсь момент з'ясувалось, що ╓ обмеження 32 байти на прийом/передачу. Тому що б╕бл╕отека TwoWire використову╓ 5(!) ф╕ксованих буфер╕в по 32 байти. Два (2) в сам╕й Wire, що забезпечу╓ високор╕вневий ╕нтерфейс, ╕ ще три (3) в twi, що безпосередньо працю╓ з I2C. Можна нав╕ть з╕брати ╖╖ з буфером 64 байти. А б╕льше вже н╕, бо ма╓мо всього 2Кб пам'ят╕.

Не те, щоб це було критично для само╖ задач╕, але ж вже наклепав р╕зних ц╕кавинок в UART-to-I2C, а тут таке тупе обмеження. Пошукав вар╕анти, вони ╕снують, але скр╕зь щось не так. То ╕нтерфейс дуже в╕др╕зня╓ться (не зручно переробляти), то щось не доробили. В результат╕ переробив штатну б╕бл╕отеку так, що по-перше внутр╕шн╕х буфер╕в лишилось лише 2 по 32 (╕ можна скоротити до одного на 4 байти), а по-друге, можна використовувати р╕вно один (1) кл╕╓нтський буфер до 255 байт, а також уникнути коп╕ювання даних м╕ж пром╕жними буферам. Проф╕т )

Example

#include <stdint.h>
#include "WireZ.h"

#define Wire WireZ

#define I2C_MAX_TRANSFER  255
uint8_t i2cbuffer[I2C_MAX_TRANSFER];    // I2C input buffer

void setup() {

  Wire.begin();
  Wire.setUserBuffer(&i2cbuffer[0], I2C_MAX_TRANSFER, true /*twi ZeroCopy and shared buffer with Wire*/);

  Serial.begin(115200);  
}

GitHub: https://github.com/Alter-1/WireZeroCopy

Download

WireZ-v1.tar.gz

2023.05.17


См. также


FB or mail alterX@alter.org.ua (remove X)   Share
Автор: Alter (Александр А. Телятников) Сервер: Apache+PHP под FBSD © 2002-2024