diff options
Diffstat (limited to 'tool/mbed/mbed-sdk/libraries/tests/libs')
4 files changed, 262 insertions, 0 deletions
diff --git a/tool/mbed/mbed-sdk/libraries/tests/libs/SPIHalfDuplex/SPIHalfDuplex.cpp b/tool/mbed/mbed-sdk/libraries/tests/libs/SPIHalfDuplex/SPIHalfDuplex.cpp new file mode 100644 index 000000000..5fc6e8568 --- /dev/null +++ b/tool/mbed/mbed-sdk/libraries/tests/libs/SPIHalfDuplex/SPIHalfDuplex.cpp @@ -0,0 +1,43 @@ +/* mbed Microcontroller Library - SPIHalfDuplex + * Copyright (c) 2010-2011 ARM Limited. All rights reserved. + */ +#include "SPIHalfDuplex.h" + +#if DEVICE_SPI + +#include "spi_api.h" +#include "pinmap.h" + +#define GPIO_MODE 0 +#define SPI_MODE  2 + +namespace mbed { + +SPIHalfDuplex::SPIHalfDuplex(PinName mosi, PinName miso, PinName sclk) : SPI(mosi, miso, sclk) { +    _mosi = mosi; +    _miso = miso; +    _sbits = _bits; +} + +void SPIHalfDuplex::slave_format(int sbits) { +    _sbits = sbits; +} + +int SPIHalfDuplex::write(int value) { +    int t_bits = _bits; +    pin_function(_mosi, SPI_MODE); +    int ret_val = SPI::write(value); +    if (ret_val != value) { +        return -1; +    } +    format(_sbits, _mode); +    pin_function(_mosi, GPIO_MODE); +    ret_val = SPI::write(0x55); +    format(t_bits, _mode); +    pin_function(_mosi, SPI_MODE); +    return ret_val; +} + +} // end namespace mbed + +#endif diff --git a/tool/mbed/mbed-sdk/libraries/tests/libs/SPIHalfDuplex/SPIHalfDuplex.h b/tool/mbed/mbed-sdk/libraries/tests/libs/SPIHalfDuplex/SPIHalfDuplex.h new file mode 100644 index 000000000..14633b855 --- /dev/null +++ b/tool/mbed/mbed-sdk/libraries/tests/libs/SPIHalfDuplex/SPIHalfDuplex.h @@ -0,0 +1,85 @@ +/* mbed Microcontroller Library - SPIHalfDuplex + * Copyright (c) 2010-2011 ARM Limited. All rights reserved. + */ +#ifndef MBED_SPIHALFDUPLEX_H +#define MBED_SPIHALFDUPLEX_H + +#include "platform.h" + +#if DEVICE_SPI + +#include "SPI.h" + +namespace mbed { + +/** A SPI half-duplex master, used for communicating with SPI slave devices + * over a shared data line. + * + * The default format is set to 8-bits for both master and slave, and a + * clock frequency of 1MHz + * + * Most SPI devies will also require Chip Select and Reset signals. These + * can be controlled using <DigitalOut> pins. + * + * Although this is for a shared data line, both MISO and MOSI are defined, + * and should be tied together externally to the mbed. This class handles + * the tri-stating of the MOSI pin. + * + * Example: + * @code + * // Send a byte to a SPI half-duplex slave, and record the response + * + * #include "mbed.h" + * + * SPIHalfDuplex device(p5, p6, p7) // mosi, miso, sclk + * + * int main() { + *     int respone = device.write(0xAA); + * } + * @endcode + */ + +class SPIHalfDuplex : public SPI { + +public: + +    /** Create a SPI half-duplex master connected to the specified pins +     * +     * Pin Options: +     *  (5, 6, 7) or (11, 12, 13) +     * +     *  mosi or miso can be specfied as NC if not used +     * +     *  @param mosi SPI Master Out, Slave In pin +     *  @param miso SPI Master In, Slave Out pin +     *  @param sclk SPI Clock pin +     *  @param name (optional) A string to identify the object +     */ +    SPIHalfDuplex(PinName mosi, PinName miso, PinName sclk); + +    /** Write to the SPI Slave and return the response +     * +     *  @param value Data to be sent to the SPI slave +     * +     *  @returns +     *    Response from the SPI slave +     */ +    virtual int write(int value); + +    /** Set the number of databits expected from the slave, from 4-16 +     * +     *  @param sbits Number of expected bits in the slave response +     */ +    void slave_format(int sbits); + +protected: +    PinName _mosi; +    PinName _miso; +    int     _sbits; +}; // End of class + +} // End of namespace mbed + +#endif + +#endif diff --git a/tool/mbed/mbed-sdk/libraries/tests/libs/SerialHalfDuplex/SerialHalfDuplex.cpp b/tool/mbed/mbed-sdk/libraries/tests/libs/SerialHalfDuplex/SerialHalfDuplex.cpp new file mode 100644 index 000000000..7594e4047 --- /dev/null +++ b/tool/mbed/mbed-sdk/libraries/tests/libs/SerialHalfDuplex/SerialHalfDuplex.cpp @@ -0,0 +1,52 @@ +/* mbed Microcontroller Library - SerialHalfDuplex + * Copyright (c) 2010-2011 ARM Limited. All rights reserved. + */ +#include "SerialHalfDuplex.h" + +#if DEVICE_SERIAL + +#include "pinmap.h" +#include "serial_api.h" + +namespace mbed { + +SerialHalfDuplex::SerialHalfDuplex(PinName tx, PinName rx) +    : Serial(tx, rx) { + +    gpio_init(&gpio, tx, PIN_INPUT); +    gpio_mode(&gpio, PullNone); // no pull +} + +// To transmit a byte in half duplex mode: +// 1. Disable interrupts, so we don't trigger on loopback byte +// 2. Set tx pin to UART out +// 3. Transmit byte as normal +// 4. Read back byte from looped back tx pin - this both confirms that the +//    transmit has occurred, and also clears the byte from the buffer. +// 5. Return pin to input mode +// 6. Re-enable interrupts +int SerialHalfDuplex::_putc(int c) { +    int retc; + +    // TODO: We should not disable all interrupts +    __disable_irq(); + +    serial_pinout_tx(gpio.pin); + +    Serial::_putc(c); +    retc = Serial::getc();       // reading also clears any interrupt + +    pin_function(gpio.pin, 0); + +    __enable_irq(); + +    return retc; +} + +int SerialHalfDuplex::_getc(void) { +    return Serial::_getc(); +} + +} // End namespace + +#endif diff --git a/tool/mbed/mbed-sdk/libraries/tests/libs/SerialHalfDuplex/SerialHalfDuplex.h b/tool/mbed/mbed-sdk/libraries/tests/libs/SerialHalfDuplex/SerialHalfDuplex.h new file mode 100644 index 000000000..0ba13d38e --- /dev/null +++ b/tool/mbed/mbed-sdk/libraries/tests/libs/SerialHalfDuplex/SerialHalfDuplex.h @@ -0,0 +1,82 @@ +/* mbed Microcontroller Library - SerialHalfDuplex + * Copyright (c) 2010-2011 ARM Limited. All rights reserved. + */ +#ifndef MBED_SERIALHALFDUPLEX_H +#define MBED_SERIALHALFDUPLEX_H + +#include "platform.h" + +#if DEVICE_SERIAL + +#include "Serial.h" +#include "gpio_api.h" + +namespace mbed { + +/** A serial port (UART) for communication with other devices using + * Half-Duplex, allowing transmit and receive on a single + * shared transmit and receive line. Only one end should be transmitting + * at a time. + * + * Both the tx and rx pin should be defined, and wired together. + * This is in addition to them being wired to the other serial + * device to allow both read and write functions to operate. + * + *  For Simplex and Full-Duplex Serial communication, see Serial() + * + *  Example: + * @code + * // Send a byte to a second HalfDuplex device, and read the response + * + * #include "mbed.h" + * + * // p9 and p10 should be wired together to form "a" + * // p28 and p27 should be wired together to form "b" + * // p9/p10 should be wired to p28/p27 as the Half Duplex connection + * + * SerialHalfDuplex a(p9, p10); + * SerialHalfDuplex b(p28, p27); + * + * void b_rx() { // second device response + *     b.putc(b.getc() + 4); + * } + * + * int main() { + *     b.attach(&b_rx); + *     for (int c = 'A'; c < 'Z'; c++) { + *         a.putc(c); + *         printf("sent [%c]\n", c); + *         wait(0.5);   // b should respond + *         if (a.readable()) { + *             printf("received [%c]\n", a.getc()); + *         } + *     } + * } + * @endcode + */ +class SerialHalfDuplex : public Serial { + +public: +    /** Create a half-duplex serial port, connected to the specified transmit +     * and receive pins. +     * +     * These pins should be wired together, as well as to the target device +     * +     *  @param tx Transmit pin +     *  @param rx Receive pin +     */ +    SerialHalfDuplex(PinName tx, PinName rx); + +protected: +    gpio_object gpio; + +    virtual int _putc(int c); +    virtual int _getc(void); + +}; // End class SerialHalfDuplex + +} // End namespace + +#endif + +#endif  | 
