summaryrefslogtreecommitdiffhomepage
path: root/digital/avr/modules
diff options
context:
space:
mode:
Diffstat (limited to 'digital/avr/modules')
-rw-r--r--digital/avr/modules/spi/spi.c43
-rw-r--r--digital/avr/modules/spi/spi.h37
-rwxr-xr-xdigital/avr/modules/spi/test/Makefile4
-rw-r--r--digital/avr/modules/spi/test/spi_host.c107
-rw-r--r--digital/avr/modules/spi/test/test_spi.c31
5 files changed, 87 insertions, 135 deletions
diff --git a/digital/avr/modules/spi/spi.c b/digital/avr/modules/spi/spi.c
index e99055e0..1098b260 100644
--- a/digital/avr/modules/spi/spi.c
+++ b/digital/avr/modules/spi/spi.c
@@ -22,8 +22,20 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* }}} */
+#include "io.h"
+#include "common.h"
#include "spi.h"
+#define SPI_DIRVER_SIGNAL SIGNAL_SPI
+
+/** For host */
+#ifdef HOST
+static uint8_t SPCR;
+static uint8_t SPDR;
+static uint8_t SPSR;
+static uint8_t SPIF;
+#endif
+
/** Spi driver context. */
static spi_t spi_global;
@@ -35,9 +47,10 @@ static spi_t spi_global;
void
spi_init(uint8_t sprc, spi_recv_cb_t cb, void *user_data)
{
- SPRC = sprc;
- spi_global.cb = cb;
+ SPCR = sprc;
+ spi_global.recv_cb = cb;
spi_global.recv_user_data = user_data;
+ spi_global.interruption = sprc >> 7;
}
/** Send a data to the Slave.
@@ -45,9 +58,11 @@ spi_init(uint8_t sprc, spi_recv_cb_t cb, void *user_data)
* \param length the length of the data in bytes.
*/
void
-spi_send(uint8_t *data, u8 length)
+spi_send(uint8_t *data, uint8_t length)
{
- uint i;
+ uint8_t i;
+ // enables the SPI if not enabled.
+ SPCR |= SPI_ENABLE;
for ( i = 0; i < length; i++)
{
@@ -55,16 +70,19 @@ spi_send(uint8_t *data, u8 length)
// automatically.
SPDR = data[i];
- // Wait the end of the transmission.
- while(!(SPSR & (1<<SPIF)));
+ if (!spi_global.interruption)
+ {
+ // Wait the end of the transmission.
+ while(!(SPSR & (1<<SPIF)));
+ }
}
}
/** Receive a data from the SPI bus.
* \return the data received from the bus.
*/
-uint8_t *
-spi_recv(void);
+uint8_t
+spi_recv(void)
{
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)));
@@ -82,13 +100,12 @@ spi_status(void)
return SPSR;
}
-/** Function called by the interruption if an IT is requested.
- *
+/**
+ * Function called by the interruption if an IT is requested.
*/
-void
-spi_catch_it(void)
+SIGNAL (SIG_SPI)
{
// call the call back.
- (*spi_global.cb) (spi_global.user_data);
+ (*spi_global.recv_cb) (spi_global.recv_user_data, SPDR);
}
diff --git a/digital/avr/modules/spi/spi.h b/digital/avr/modules/spi/spi.h
index e4de8f07..f8771326 100644
--- a/digital/avr/modules/spi/spi.h
+++ b/digital/avr/modules/spi/spi.h
@@ -24,9 +24,34 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* }}} */
+#include "io.h"
+
+#define SPI_IT_ENABLE 0x80
+#define SPI_IT_DISABLE 0x0
+#define SPI_ENABLE 0x40
+#define SPI_DISABLE 0x0
+#define SPI_MSB_FIRST 0x00
+#define SPI_LSB_FIRST 0x20
+#define SPI_MASTER 0x10
+#define SPI_SLAVE 0x00
+#define SPI_CPOL_RISING 0x0
+#define SPI_CPOL_FALLING 0x8
+#define SPI_CPHA_SAMPLE 0x0
+#define SPI_CPHA_SETUP 0x4
+
+enum spi_fosc_t
+{
+ SPI_FOSC_DIV_4,
+ SPI_FOSC_DIV16,
+ SPI_FOSC_DIV64,
+ SPI_FOSC_DIV128,
+ SPI_FOSC_DIV2,
+ SPI_FOSC_DIV8,
+ SPI_FOSC_DIV32
+};
/** Call back use to call the user function on the reception of a data. */
-typedef void (*spi_recv_cb_t) (void *user_data);
+typedef void (*spi_recv_cb_t) (void *user_data, uint8_t data);
struct spi_t
{
@@ -34,6 +59,8 @@ struct spi_t
spi_recv_cb_t recv_cb;
/** user data on data reception. */
void *recv_user_data;
+ /** interruption status. */
+ int8_t interruption;
};
typedef struct spi_t spi_t;
@@ -56,7 +83,7 @@ spi_uninit (void);
* \param length the length of the data in bytes.
*/
void
-spi_send(uint8_t *data, u8 length);
+spi_send(uint8_t *data, uint8_t length);
/** Receive a data from the SPI bus.
* \return the data received from the bus.
@@ -70,10 +97,4 @@ spi_recv(void);
uint8_t
spi_status(void);
-/** Function called by the interruption if an IT is requested.
- *
- */
-void
-spi_catch_it(void);
-
#endif /* spi_h */
diff --git a/digital/avr/modules/spi/test/Makefile b/digital/avr/modules/spi/test/Makefile
index ba09e125..6992c660 100755
--- a/digital/avr/modules/spi/test/Makefile
+++ b/digital/avr/modules/spi/test/Makefile
@@ -1,7 +1,7 @@
BASE = ../../..
PROGS = test_spi
-test_spi_SOURCES = test_spi.c spi_host.c
-MODULES = proto uart utils
+test_spi_SOURCES = test_spi.c
+MODULES = utils spi
CONFIGFILE = avrconfig.h
# atmega8, atmega8535, atmega128...
AVR_MCU = atmega8
diff --git a/digital/avr/modules/spi/test/spi_host.c b/digital/avr/modules/spi/test/spi_host.c
deleted file mode 100644
index 9badb9bd..00000000
--- a/digital/avr/modules/spi/test/spi_host.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/* spi_host.c */
-/* avr.spi - SPI AVR module. {{{
- *
- * Copyright (C) 2008 NĂ©lio Laranjeiro
- *
- * 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 <stdint.h>
-#include "io.h"
-#include "common.h"
-#include "modules/proto/proto.h"
-#include "modules/spi/spi.h"
-
-/** Spi driver context. */
-static spi_t spi_global;
-
-#ifdef HOST
-static volatile uint8_t SPCR;
-static volatile uint8_t SPDR;
-static volatile uint8_t SPSR;
-#endif
-
-/** Initialise the SPI Control Register.
- * \param sprc the sprc register data to be store in the register.
- * \param cb the function call back to call the user which receive the data.
- * \param user_data the user data to be provieded in the function call back.
- */
-void
-spi_init(uint8_t sprc, spi_recv_cb_t cb, void *user_data)
-{
- SPCR = sprc;
- spi_global.recv_cb = cb;
- spi_global.recv_user_data = user_data;
-}
-
-/** Uninitialise the SPI module.
- * Unused on the target
- */
-void
-spi_uninit (void)
-{
-}
-
-/** Send a data to the Slave.
- * \param data the data to send
- * \param length the length of the data in bytes.
- */
-void
-spi_send(uint8_t *data, u8 length)
-{
- uint8_t i;
-
- for ( i = 0; i < length; i++)
- {
- proto_send0 (data[i]);
- }
-}
-
-/** Receive a data from the SPI bus.
- * \return the data received from the bus.
- */
-uint8_t
-spi_recv(void)
-{
- return SPDR;
-}
-
-/** Return the status register from the SPI driver.
- * \return the status register value
- */
-uint8_t
-spi_status(void)
-{
- return SPSR;
-}
-
-/** Function called by the interruption if an IT is requested.
- *
- */
-void
-spi_catch_it(void)
-{
- // call the call back.
- (*spi_global.recv_cb) (spi_global.recv_user_data);
-}
-
-void
-proto_callback (uint8_t cmd, uint8_t size, uint8_t *args)
-{
-}
diff --git a/digital/avr/modules/spi/test/test_spi.c b/digital/avr/modules/spi/test/test_spi.c
index 08e34db7..a6060b8b 100644
--- a/digital/avr/modules/spi/test/test_spi.c
+++ b/digital/avr/modules/spi/test/test_spi.c
@@ -27,13 +27,9 @@
#include "io.h"
#include "../spi.h"
-#ifdef HOST
-extern volatile uint8_t SPDR;
-#endif
-
/** Call back function to be called on the AVR interruption */
void
-spi_interruption_function (void *user_data)
+spi_interruption_function (void *user_data, uint8_t data)
{
}
@@ -43,6 +39,31 @@ main (void)
uint8_t test [10];
uint8_t res;
+ res = SPI_IT_ENABLE;
+ spi_init (res, spi_interruption_function, 0x0);
+ res = SPI_IT_DISABLE;
+ spi_init (res, spi_interruption_function, 0x0);
+ res = SPI_ENABLE;
+ spi_init (res, spi_interruption_function, 0x0);
+ res = SPI_DISABLE;
+ spi_init (res, spi_interruption_function, 0x0);
+ res = SPI_LSB_FIRST;
+ spi_init (res, spi_interruption_function, 0x0);
+ res = SPI_MSB_FIRST;
+ spi_init (res, spi_interruption_function, 0x0);
+ res = SPI_MASTER;
+ spi_init (res, spi_interruption_function, 0x0);
+ res = SPI_SLAVE;
+ spi_init (res, spi_interruption_function, 0x0);
+ res = SPI_CPOL_RISING;
+ spi_init (res, spi_interruption_function, 0x0);
+ res = SPI_CPOL_FALLING;
+ spi_init (res, spi_interruption_function, 0x0);
+ res = SPI_CPHA_SAMPLE;
+ spi_init (res, spi_interruption_function, 0x0);
+ res = SPI_CPHA_SETUP;
+ spi_init (res, spi_interruption_function, 0x0);
+
//initialise the spi.
spi_init (0x14, spi_interruption_function, 0x0);