diff --git a/libs/i2c-fram/fram.ts b/libs/i2c-fram/fram.ts new file mode 100644 index 00000000..c37809d6 --- /dev/null +++ b/libs/i2c-fram/fram.ts @@ -0,0 +1,54 @@ +namespace i2c_fram { + const devaddr = 0x50; + + //% shim=ksrt::panic + function panic(code: number) { } + + function die() { panic(142) } + + export function readByte(addr: number) { + if (addr < 0 || addr > 0xffff) + die(); + + let buf = pins.createBuffer(2) + buf[0] = (addr >> 8) & 0xff; + buf[1] = addr & 0xff; + + pins.i2cWriteBuffer(devaddr, buf); + buf = pins.i2cReadBuffer(devaddr, 1); + + return buf[0]; + } + + export function writeByte(addr: number, val: number) { + if (addr < 0 || addr > 0xffff) + die(); + + if (val < 0 || val > 0xff) + die(); + + let buf = pins.createBuffer(3) + + buf[0] = (addr >> 8) & 0xff; + buf[1] = addr & 0xff; + buf[2] = val; + + pins.i2cWriteBuffer(devaddr, buf) + } + + export function readBuffer(addr: number, length: number) { + if (addr < 0 || length < 0 || (addr + length) > 0xffff) + die(); + let buf = pins.createBuffer(length) + for (let i = 0; i < length; ++i) + buf[i] = readByte(addr + i) + return buf + } + + export function writeBuffer(addr:number, buf: Buffer) { + if (addr < 0 || (addr + buf.length) > 0xffff) + die(); + for (let i = 0; i < buf.length; ++i) + writeByte(addr + i, buf[i]) + } +} diff --git a/libs/i2c-fram/ftest.ts b/libs/i2c-fram/ftest.ts new file mode 100644 index 00000000..e8638dfb --- /dev/null +++ b/libs/i2c-fram/ftest.ts @@ -0,0 +1,14 @@ +i2c_fram.writeByte(100, 42) +i2c_fram.writeByte(101, 108) + +function toBuf(arr: number[]) { + let buf = pins.createBuffer(arr.length) + for (let i = 0; i < arr.length; ++i) + buf[i] = arr[i] + return buf +} + +i2c_fram.writeBuffer(98, toBuf([1,2,3,4,5,6,7])) + +console.log("100:" + i2c_fram.readByte(100)) +console.log("101:" + i2c_fram.readByte(101)) diff --git a/libs/i2c-fram/kind.json b/libs/i2c-fram/kind.json new file mode 100644 index 00000000..ed97102e --- /dev/null +++ b/libs/i2c-fram/kind.json @@ -0,0 +1,14 @@ +{ + "name": "i2c-fram", + "description": "AdaFruit I2C FRAM driver for micro:bit", + "files": [ + "fram.ts" + ], + "testFiles": [ + "ftest.ts" + ], + "public": true, + "dependencies": { + "microbit": "file:../microbit" + } +}