From d3702da4a90890010e3a3b1dc2eb6d1eb3a3d1c9 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Sat, 12 Jan 2013 09:00:19 +0100 Subject: digital/ucoolib/ucoolib/hal/spi: new spi module --- digital/ucoolib/ucoolib/intf/spi_master.cc | 48 ++++++++++++++++++++ digital/ucoolib/ucoolib/intf/spi_master.hh | 70 ++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 digital/ucoolib/ucoolib/intf/spi_master.cc create mode 100644 digital/ucoolib/ucoolib/intf/spi_master.hh (limited to 'digital/ucoolib/ucoolib/intf') diff --git a/digital/ucoolib/ucoolib/intf/spi_master.cc b/digital/ucoolib/ucoolib/intf/spi_master.cc new file mode 100644 index 00000000..cec1231b --- /dev/null +++ b/digital/ucoolib/ucoolib/intf/spi_master.cc @@ -0,0 +1,48 @@ +// ucoolib - Microcontroller object oriented library. {{{ +// +// Copyright (C) 2013 Nicolas Schodet +// +// APBTeam: +// Web: http://apbteam.org/ +// Email: team AT apbteam DOT org +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// }}} +#include "spi_master.hh" + +namespace ucoo { + +char +SpiMaster::send_and_recv (char tx) +{ + char rx; + send_and_recv (&tx, &rx, 1); + return rx; +} + +void +SpiMaster::send (char tx) +{ + send_and_recv (tx); +} + +char +SpiMaster::recv () +{ + return send_and_recv (0); +} + +} // namespace ucoo diff --git a/digital/ucoolib/ucoolib/intf/spi_master.hh b/digital/ucoolib/ucoolib/intf/spi_master.hh new file mode 100644 index 00000000..63e0b95c --- /dev/null +++ b/digital/ucoolib/ucoolib/intf/spi_master.hh @@ -0,0 +1,70 @@ +#ifndef ucoolib_intf_spi_master_hh +#define ucoolib_intf_spi_master_hh +// ucoolib - Microcontroller object oriented library. {{{ +// +// Copyright (C) 2012 Nicolas Schodet +// +// APBTeam: +// Web: http://apbteam.org/ +// Email: team AT apbteam DOT org +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// }}} + +namespace ucoo { + +/// SPI clock polarity and phase modes. +enum SpiMode +{ + /// Mode 0, sample on rising edge, setup on falling edge. + SPI_MODE_0, + /// Mode 1, setup on rising edge, sample on falling edge. + SPI_MODE_1, + /// Mode 2, sample on falling edge, setup on rising edge. + SPI_MODE_2, + /// Mode 3, setup on falling edge, sample on rising edge. + SPI_MODE_3, +}; + +/// Interface to the master side of an SPI bus. Do not handle slave select, +/// this should be done with a regular IO. +class SpiMaster +{ + public: + /// Send and receive COUNT bytes of data. Send data from TX_BUF, store + /// received data in RX_BUF. TX_BUF and RX_BUF can be the same memory. + virtual void send_and_recv (const char *tx_buf, char *rx_buf, int count) + = 0; + /// Send and receive one byte, shortcut. + virtual char send_and_recv (char tx); + /// Send, and ignore received data. Same as send_and_recv, but received + /// data is discarded. + virtual void send (const char *tx_buf, int count) = 0; + /// Send one byte, shortcut. + virtual void send (char tx); + /// Send zeros, and receive data. Same as send_and_recv, but transmit + /// zeros. + virtual void recv (char *rx_buf, int count) = 0; + /// Receive one byte, shortcut. + virtual char recv (); + protected: + /// Default constructor. + SpiMaster () { } +}; + +} // namespace ucoo + +#endif // ucoolib_intf_spi_master_hh -- cgit v1.2.3