From c99138b02e5a1d8eb0f11f9ad7522617f659c4ca Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 10 Aug 2016 23:26:58 -0700 Subject: [PATCH] adding SPI support --- docs/reference/pins.md | 3 ++- docs/reference/pins/spi-write.md | 19 +++++++++++++++++++ libs/microbit/enums.d.ts | 2 -- libs/microbit/pins.cpp | 20 +++++++++++++++++++- libs/microbit/pins.ts | 2 +- libs/microbit/shims.d.ts | 12 ++++++++---- sim/libmbit.ts | 5 +++++ 7 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 docs/reference/pins/spi-write.md diff --git a/docs/reference/pins.md b/docs/reference/pins.md index 0c824616..74ddf3c6 100644 --- a/docs/reference/pins.md +++ b/docs/reference/pins.md @@ -17,6 +17,7 @@ pins.servoWritePin(AnalogPin.P0, 180); pins.servoSetPulse(AnalogPin.P0, 1500); pins.i2cReadNumber(0, NumberFormat.Int8LE); pins.i2cWriteNumber(0, 0, NumberFormat.Int8LE); +pins.spiWrite(0); pins.setPull(DigitalPin.P0, PinPullMode.PullDown); pins.analogPitch(0, 0); pins.analogSetPitchPin(AnalogPin.P0); @@ -24,4 +25,4 @@ pins.analogSetPitchPin(AnalogPin.P0); ### See Also -[digitalReadPin](/reference/pins/digital-read-pin), [digitalWritePin](/reference/pins/digital-write-pin), [analogReadPin](/reference/pins/analog-read-pin), [analogWritePin](/reference/pins/analog-write-pin), [analogSetPeriod](/reference/pins/analog-set-period), [map](/reference/pins/map), [onPulsed](/reference/pins/on-pulsed), [pulseDuration](/reference/pins/pulse-duration), [servoWritePin](/reference/pins/servo-write-pin), [servoSetPulse](/reference/pins/servo-set-pulse), [i2cReadNumber](/reference/pins/i2c-read-number), [i2cWriteNumber](/reference/pins/i2c-write-number), [setPull](/reference/pins/set-pull), [analogPitch](/reference/pins/analog-pitch), [analogSetPitchPin](/reference/pins/analog-set-pitch) +[digitalReadPin](/reference/pins/digital-read-pin), [digitalWritePin](/reference/pins/digital-write-pin), [analogReadPin](/reference/pins/analog-read-pin), [analogWritePin](/reference/pins/analog-write-pin), [analogSetPeriod](/reference/pins/analog-set-period), [map](/reference/pins/map), [onPulsed](/reference/pins/on-pulsed), [pulseDuration](/reference/pins/pulse-duration), [servoWritePin](/reference/pins/servo-write-pin), [servoSetPulse](/reference/pins/servo-set-pulse), [i2cReadNumber](/reference/pins/i2c-read-number), [i2cWriteNumber](/reference/pins/i2c-write-number), [setPull](/reference/pins/set-pull), [analogPitch](/reference/pins/analog-pitch), [analogSetPitchPin](/reference/pins/analog-set-pitch), [spiWrite](/reference/pins/spi-write) diff --git a/docs/reference/pins/spi-write.md b/docs/reference/pins/spi-write.md new file mode 100644 index 00000000..ffee6be7 --- /dev/null +++ b/docs/reference/pins/spi-write.md @@ -0,0 +1,19 @@ +# SPI Write + +Write to the SPI Slave and return the response. + +```sig +pins.spiWrite(0); +``` + +### Parameters + +* ``value``: value Data to be sent to the SPI slave + +### Returns + +* a [number](/reference/types/number) Response from the SPI slave + +### See also + +[SPI](https://developer.mbed.org/handbook/SPI) diff --git a/libs/microbit/enums.d.ts b/libs/microbit/enums.d.ts index 2c687fdd..8e9372e3 100644 --- a/libs/microbit/enums.d.ts +++ b/libs/microbit/enums.d.ts @@ -288,8 +288,6 @@ declare namespace led { //% block="none" PullNone = 2, } -declare namespace pins { -} declare enum SerialPin { diff --git a/libs/microbit/pins.cpp b/libs/microbit/pins.cpp index 6df58fc0..efd9ee08 100644 --- a/libs/microbit/pins.cpp +++ b/libs/microbit/pins.cpp @@ -71,7 +71,6 @@ MicroBitPin *getPin(int id) { } -//% color=351 weight=30 namespace pins { #define PINOP(op) \ MicroBitPin *pin = getPin((int)name); \ @@ -268,4 +267,23 @@ namespace pins { { uBit.i2c.write(address << 1, (char*)buf->payload, buf->length, repeat); } + + SPI* spi = NULL; + SPI* allocSPI() { + if (spi == NULL) + spi = new SPI(MOSI, MISO, SCK); + return spi; + } + + /** + * Write to the SPI slave and return the response + * @param value Data to be sent to the SPI slave + */ + //% help=pins/spi-write weight=5 + //% blockId=spi_write block="spi write %value" + int spiWrite(int value) { + auto p = allocSPI(); + return p->write(value); + } + } diff --git a/libs/microbit/pins.ts b/libs/microbit/pins.ts index 3412b8e2..61fda293 100644 --- a/libs/microbit/pins.ts +++ b/libs/microbit/pins.ts @@ -30,7 +30,7 @@ namespace pins { /** * Write one number to a 7-bit I2C address. */ - //% help=pins/i2c-write-number + //% help=pins/i2c-write-number blockGap=8 //% blockId=i2c_writenumber block="i2c write number|at address %address|with value %value|of format %format=i2c_sizeof" weight=6 export function i2cWriteNumber(address: number, value: number, format: NumberFormat): void { let buf = createBuffer(pins.sizeOf(format)) diff --git a/libs/microbit/shims.d.ts b/libs/microbit/shims.d.ts index cf6f463f..9046d51c 100644 --- a/libs/microbit/shims.d.ts +++ b/libs/microbit/shims.d.ts @@ -448,10 +448,6 @@ declare namespace led { //% help=led/screenshot shim=led::screenshot function screenshot(): Image; } - - - - //% color=351 weight=30 declare namespace pins { /** @@ -573,6 +569,14 @@ declare namespace pins { */ //% repeat.defl=0 shim=pins::i2cWriteBuffer function i2cWriteBuffer(address: number, buf: Buffer, repeat?: boolean): void; + + /** + * Write to the SPI slave and return the response + * @param value Data to be sent to the SPI slave + */ + //% help=pins/spi-write weight=5 + //% blockId=spi_write block="spi write %value" shim=pins::spiWrite + function spiWrite(value: number): number; } diff --git a/sim/libmbit.ts b/sim/libmbit.ts index d36fa5a7..64bae051 100644 --- a/sim/libmbit.ts +++ b/sim/libmbit.ts @@ -588,6 +588,11 @@ namespace pxsim.pins { // TODO } + export function spiWrite(value: number): number { + // TODO + return 0; + } + export function i2cReadBuffer(address: number, size: number, repeat?: boolean): RefBuffer { // fake reading zeros return createBuffer(size)