/trunk/libraries/spi/spi.h |
---|
0,0 → 1,174 |
/**************************************************************************//** |
* \brief SPI library |
* \author Copyright (C) 2011 Julien Le Sech - www.idreammicro.com |
* \version 1.0 |
* \date 20110315 |
* |
* This file is part of the iDreamMicro library. |
* |
* This library is free software: you can redistribute it and/or modify it under |
* the terms of the GNU Lesser General Public License as published by the Free |
* Software Foundation, either version 3 of the License, or (at your option) any |
* later version. |
* |
* This library 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 Lesser General Public License for more |
* details. |
* |
* You should have received a copy of the GNU Lesser General Public License |
* along with this program. If not, see http://www.gnu.org/licenses/ |
******************************************************************************/ |
/**************************************************************************//** |
* \headerfile spi.h |
******************************************************************************/ |
#ifndef H__IDREAMMICRO__SPI__H |
#define H__IDREAMMICRO__SPI__H |
#ifdef _cplusplus |
extern "C"{ |
#endif |
/****************************************************************************** |
* Header file inclusions. |
******************************************************************************/ |
#include <stdint.h> |
/****************************************************************************** |
* Public types. |
******************************************************************************/ |
/**************************************************************************//** |
* |
******************************************************************************/ |
typedef enum spi__clock_rates |
{ |
SPI__CLOCK_RATE__FOSC_OVER_2, |
SPI__CLOCK_RATE__FOSC_OVER_4, |
SPI__CLOCK_RATE__FOSC_OVER_8, |
SPI__CLOCK_RATE__FOSC_OVER_16, |
SPI__CLOCK_RATE__FOSC_OVER_32, |
SPI__CLOCK_RATE__FOSC_OVER_64, |
SPI__CLOCK_RATE__FOSC_OVER_128 |
} spi__clock_rate_t; |
/**************************************************************************//** |
* |
******************************************************************************/ |
typedef enum spi__data_modes |
{ |
SPI__DATA_MODE_0, |
SPI__DATA_MODE_1, |
SPI__DATA_MODE_2, |
SPI__DATA_MODE_3 |
} spi__data_mode_t; |
/**************************************************************************//** |
* |
******************************************************************************/ |
typedef enum spi__data_orders |
{ |
SPI__DATA_ORDER__MSB_FIRST, |
SPI__DATA_ORDER__LSB_FIRST |
} spi__data_order_t; |
/****************************************************************************** |
* Public function prototypes. |
******************************************************************************/ |
/**************************************************************************//** |
* \fn void spi_master__initialize(void) |
* |
* \brief Initialize SPI in master mode. |
******************************************************************************/ |
void |
spi_master__initialize |
( |
void |
); |
/**************************************************************************//** |
* \fn void spi_master__transmit(uint8_t data) |
* |
* \brief Transmit data. |
* |
* \param data Data to transmit. |
******************************************************************************/ |
void |
spi_master__transmit |
( |
uint8_t data |
); |
/**************************************************************************//** |
* \fn void spi_slave__initialize(void) |
* |
* \brief Initialize SPI in slave mode. |
******************************************************************************/ |
void |
spi_slave__initialize |
( |
void |
); |
/**************************************************************************//** |
* \fn uint8_t spi_slave__receive(void) |
* |
* \brief Receive data. |
* |
* \return Received data. |
******************************************************************************/ |
uint8_t |
spi_slave__receive |
( |
void |
); |
/**************************************************************************//** |
* \fn void spi__set_clock_rate(spi__clock_rate_t clock_rate) |
* |
* \brief Set clock rate. |
* |
* \param[in] clock_rate Clock rate to set. |
******************************************************************************/ |
void |
spi__set_clock_rate |
( |
spi__clock_rate_t clock_rate |
); |
/**************************************************************************//** |
* \fn void spi__set_data_mode(spi__data_mode_t mode) |
* |
* \brief Set SPI data mode. |
* |
* \param[in] mode Data mode to set. |
******************************************************************************/ |
void |
spi__set_data_mode |
( |
spi__data_mode_t data_mode |
); |
/**************************************************************************//** |
* \fn void spi__set_data_order(spi__data_order_t data_order) |
* |
* \brief Set SPI data order. |
* |
* \param[in] data_order Data order to set. |
******************************************************************************/ |
void |
spi__set_data_order |
( |
spi__data_order_t data_order |
); |
#ifdef _cplusplus |
} |
#endif |
#endif /* H__IDREAMMICRO__SPI__H */ |
/trunk/libraries/spi/include/spi_atmega128.h |
---|
0,0 → 1,55 |
/**************************************************************************//** |
* \brief SPI library |
* \author Copyright (C) 2011 Julien Le Sech - www.idreammicro.com |
* \version 1.0 |
* \date 20110315 |
* |
* This file is part of the iDreamMicro library. |
* |
* This library is free software: you can redistribute it and/or modify it under |
* the terms of the GNU Lesser General Public License as published by the Free |
* Software Foundation, either version 3 of the License, or (at your option) any |
* later version. |
* |
* This library 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 Lesser General Public License for more |
* details. |
* |
* You should have received a copy of the GNU Lesser General Public License |
* along with this program. If not, see http://www.gnu.org/licenses/ |
******************************************************************************/ |
/**************************************************************************//** |
* \headerfile spi_atmega128.h |
******************************************************************************/ |
#ifndef H__IDREAMMICRO__SPI_ATMEGA128__H |
#define H__IDREAMMICRO__SPI_ATMEGA128__H |
#ifdef _cplusplus |
extern "C"{ |
#endif |
/****************************************************************************** |
* Header file inclusions. |
******************************************************************************/ |
#include <avr/io.h> |
/****************************************************************************** |
* Public macros. |
******************************************************************************/ |
#define DDR_SPI DDRB |
#define DD_SS PB0 |
#define DD_SCK PB1 |
#define DD_MOSI PB2 |
#define DD_MISO PB3 |
#ifdef _cplusplus |
} |
#endif |
#endif /* H__IDREAMMICRO__SPI_ATMEGA128__H */ |
/trunk/libraries/spi/include/spi_atmega2560.h |
---|
0,0 → 1,55 |
/**************************************************************************//** |
* \brief SPI library |
* \author Copyright (C) 2011 Julien Le Sech - www.idreammicro.com |
* \version 1.0 |
* \date 20110315 |
* |
* This file is part of the iDreamMicro library. |
* |
* This library is free software: you can redistribute it and/or modify it under |
* the terms of the GNU Lesser General Public License as published by the Free |
* Software Foundation, either version 3 of the License, or (at your option) any |
* later version. |
* |
* This library 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 Lesser General Public License for more |
* details. |
* |
* You should have received a copy of the GNU Lesser General Public License |
* along with this program. If not, see http://www.gnu.org/licenses/ |
******************************************************************************/ |
/**************************************************************************//** |
* \headerfile spi_atmega2560.h |
******************************************************************************/ |
#ifndef H__IDREAMMICRO__SPI_ATMEGA2560__H |
#define H__IDREAMMICRO__SPI_ATMEGA2560__H |
#ifdef _cplusplus |
extern "C"{ |
#endif |
/****************************************************************************** |
* Header file inclusions. |
******************************************************************************/ |
#include <avr/io.h> |
/****************************************************************************** |
* Public macros. |
******************************************************************************/ |
#define DDR_SPI DDRB |
#define DD_SS PB0 |
#define DD_SCK PB1 |
#define DD_MOSI PB2 |
#define DD_MISO PB3 |
#ifdef _cplusplus |
} |
#endif |
#endif /* H__IDREAMMICRO__SPI_ATMEGA2560__H */ |
/trunk/libraries/spi/include/spi_atmega328.h |
---|
0,0 → 1,55 |
/**************************************************************************//** |
* \brief SPI library |
* \author Copyright (C) 2011 Julien Le Sech - www.idreammicro.com |
* \version 1.0 |
* \date 20110315 |
* |
* This file is part of the iDreamMicro library. |
* |
* This library is free software: you can redistribute it and/or modify it under |
* the terms of the GNU Lesser General Public License as published by the Free |
* Software Foundation, either version 3 of the License, or (at your option) any |
* later version. |
* |
* This library 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 Lesser General Public License for more |
* details. |
* |
* You should have received a copy of the GNU Lesser General Public License |
* along with this program. If not, see http://www.gnu.org/licenses/ |
******************************************************************************/ |
/**************************************************************************//** |
* \headerfile spi_atmega328.h |
******************************************************************************/ |
#ifndef H__IDREAMMICRO__SPI_ATMEGA328__H |
#define H__IDREAMMICRO__SPI_ATMEGA328__H |
#ifdef _cplusplus |
extern "C"{ |
#endif |
/****************************************************************************** |
* Header file inclusions. |
******************************************************************************/ |
#include <avr/io.h> |
/****************************************************************************** |
* Public macros. |
******************************************************************************/ |
#define DDR_SPI DDRB |
#define DD_SS PB2 |
#define DD_SCK PB5 |
#define DD_MOSI PB3 |
#define DD_MISO PB4 |
#ifdef _cplusplus |
} |
#endif |
#endif /* H__IDREAMMICRO__SPI_ATMEGA328__H */ |
/trunk/libraries/spi/src/spi_slave.c |
---|
0,0 → 1,85 |
/**************************************************************************//** |
* \brief SPI library |
* \author Copyright (C) 2011 Julien Le Sech - www.idreammicro.com |
* \version 1.0 |
* \date 20110315 |
* |
* This file is part of the iDreamMicro library. |
* |
* This library is free software: you can redistribute it and/or modify it under |
* the terms of the GNU Lesser General Public License as published by the Free |
* Software Foundation, either version 3 of the License, or (at your option) any |
* later version. |
* |
* This library 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 Lesser General Public License for more |
* details. |
* |
* You should have received a copy of the GNU Lesser General Public License |
* along with this program. If not, see http://www.gnu.org/licenses/ |
******************************************************************************/ |
/**************************************************************************//** |
* \file spi_slave.c |
******************************************************************************/ |
/****************************************************************************** |
* Header file inclusions. |
******************************************************************************/ |
#include <spi/spi.h> |
#include <useful/bits.h> |
#include <avr/io.h> |
#include <stdint.h> |
#if defined (__AVR_ATmega128__) |
#include "../include/spi_atmega128.h" |
#elif defined (__AVR_ATmega328P__) || defined (__AVR_ATmega328__) |
#include "../include/spi_atmega328.h" |
#elif defined (__AVR_ATmega2560__) |
#include "../include/spi_atmega2560.h" |
#endif |
/****************************************************************************** |
* Public function definitions. |
******************************************************************************/ |
/**************************************************************************//** |
* \fn void spi_slave__initialize(void) |
* |
* \brief Initialize SPI in slave mode. |
******************************************************************************/ |
void |
spi_slave__initialize |
( |
void |
){ |
// Configure pins. |
DDR_SPI = _BV(DD_MISO); |
// Enable SPI. |
SPCR = _BV(SPE); |
} |
/**************************************************************************//** |
* \fn uint8_t spi_slave__receive(void) |
* |
* \brief Receive data. |
* |
* \return Received data. |
******************************************************************************/ |
uint8_t |
spi_slave__receive |
( |
void |
){ |
// Wait for previous transmission complete. |
while (!(SPSR & (1 << SPIF))); |
// Read data from SPI data register. |
return SPDR; |
} |
/trunk/libraries/spi/src/SConscript |
---|
0,0 → 1,15 |
# Import environment set for target. |
Import('env_target') |
# Define target name. |
TARGET = 'spi' |
# Define source files. |
sources = [ |
'spi.c', |
'spi_master.c', |
'spi_slave.c' |
] |
# Build library. |
env_target.BuildLibrary(sources, TARGET) |
/trunk/libraries/spi/src/spi_master.c |
---|
0,0 → 1,85 |
/**************************************************************************//** |
* \brief SPI library |
* \author Copyright (C) 2011 Julien Le Sech - www.idreammicro.com |
* \version 1.0 |
* \date 20110315 |
* |
* This file is part of the iDreamMicro library. |
* |
* This library is free software: you can redistribute it and/or modify it under |
* the terms of the GNU Lesser General Public License as published by the Free |
* Software Foundation, either version 3 of the License, or (at your option) any |
* later version. |
* |
* This library 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 Lesser General Public License for more |
* details. |
* |
* You should have received a copy of the GNU Lesser General Public License |
* along with this program. If not, see http://www.gnu.org/licenses/ |
******************************************************************************/ |
/**************************************************************************//** |
* \file spi_master.c |
******************************************************************************/ |
/****************************************************************************** |
* Header file inclusions. |
******************************************************************************/ |
#include <spi/spi.h> |
#include <useful/bits.h> |
#include <avr/io.h> |
#include <stdint.h> |
#if defined (__AVR_ATmega128__) |
#include "../include/spi_atmega128.h" |
#elif defined (__AVR_ATmega328P__) || defined (__AVR_ATmega328__) |
#include "../include/spi_atmega328.h" |
#elif defined (__AVR_ATmega2560__) |
#include "../include/spi_atmega2560.h" |
#endif |
/****************************************************************************** |
* Public function definitions. |
******************************************************************************/ |
/**************************************************************************//** |
* \fn void spi_master__initialize(void) |
* |
* \brief Initialize SPI in master mode. |
******************************************************************************/ |
void |
spi_master__initialize |
( |
void |
){ |
// Configure pins. |
DDR_SPI |= _BV(DD_MOSI) | _BV(DD_SCK); |
// Enable SPI and set master mode. |
SPCR = _BV(SPE) | _BV(MSTR); |
} |
/**************************************************************************//** |
* \fn void spi_master__transmit(uint8_t data) |
* |
* \brief Transmit data. |
* |
* \param data Data to transmit. |
******************************************************************************/ |
void |
spi_master__transmit |
( |
uint8_t data |
){ |
// Write data to SPI data register. |
SPDR = data; |
// Wait for transmission complete. |
while (!(SPSR & (1 << SPIF))); |
} |
/trunk/libraries/spi/src/spi.c |
---|
0,0 → 1,193 |
/**************************************************************************//** |
* \brief SPI library |
* \author Copyright (C) 2011 Julien Le Sech - www.idreammicro.com |
* \version 1.0 |
* \date 20110315 |
* |
* This file is part of the iDreamMicro library. |
* |
* This library is free software: you can redistribute it and/or modify it under |
* the terms of the GNU Lesser General Public License as published by the Free |
* Software Foundation, either version 3 of the License, or (at your option) any |
* later version. |
* |
* This library 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 Lesser General Public License for more |
* details. |
* |
* You should have received a copy of the GNU Lesser General Public License |
* along with this program. If not, see http://www.gnu.org/licenses/ |
******************************************************************************/ |
/**************************************************************************//** |
* \file spi.c |
******************************************************************************/ |
/****************************************************************************** |
* Header file inclusions. |
******************************************************************************/ |
#include <spi/spi.h> |
#include <useful/bits.h> |
#include <avr/io.h> |
#include <stdint.h> |
#if defined (__AVR_ATmega128__) |
#include "../include/spi_atmega128.h" |
#elif defined (__AVR_ATmega328P__) || defined (__AVR_ATmega328__) |
#include "../include/spi_atmega328.h" |
#elif defined (__AVR_ATmega2560__) |
#include "../include/spi_atmega2560.h" |
#endif |
/****************************************************************************** |
* Public function definitions. |
******************************************************************************/ |
/**************************************************************************//** |
* \fn void spi__set_clock_rate(spi__clock_rate_t clock_rate) |
* |
* \brief Set clock rate. |
* |
* \param[in] clock_rate Clock rate to set. |
******************************************************************************/ |
void |
spi__set_clock_rate |
( |
spi__clock_rate_t clock_rate |
){ |
switch (clock_rate) |
{ |
case SPI__CLOCK_RATE__FOSC_OVER_2: |
{ |
BIT__SET(SPCR, SPI2X); |
BIT__RST(SPCR, SPR1); |
BIT__RST(SPCR, SPR0); |
} |
break; |
case SPI__CLOCK_RATE__FOSC_OVER_4: |
{ |
BIT__RST(SPCR, SPI2X); |
BIT__RST(SPCR, SPR1); |
BIT__RST(SPCR, SPR0); |
} |
break; |
case SPI__CLOCK_RATE__FOSC_OVER_8: |
{ |
BIT__SET(SPCR, SPI2X); |
BIT__RST(SPCR, SPR1); |
BIT__SET(SPCR, SPR0); |
} |
break; |
case SPI__CLOCK_RATE__FOSC_OVER_16: |
{ |
BIT__RST(SPCR, SPI2X); |
BIT__RST(SPCR, SPR1); |
BIT__SET(SPCR, SPR0); |
} |
break; |
case SPI__CLOCK_RATE__FOSC_OVER_32: |
{ |
BIT__SET(SPCR, SPI2X); |
BIT__SET(SPCR, SPR1); |
BIT__RST(SPCR, SPR0); |
} |
break; |
case SPI__CLOCK_RATE__FOSC_OVER_64: |
{ |
BIT__SET(SPCR, SPI2X); |
BIT__SET(SPCR, SPR1); |
BIT__SET(SPCR, SPR0); |
} |
break; |
case SPI__CLOCK_RATE__FOSC_OVER_128: |
{ |
BIT__RST(SPCR, SPI2X); |
BIT__SET(SPCR, SPR1); |
BIT__SET(SPCR, SPR0); |
} |
break; |
default: |
break; |
} |
} |
/**************************************************************************//** |
* \fn void spi__set_data_mode(spi__data_mode_t mode) |
* |
* \brief Set SPI data mode. |
* |
* \param[in] mode Data mode to set. |
******************************************************************************/ |
void |
spi__set_data_mode |
( |
spi__data_mode_t mode |
){ |
switch (mode) |
{ |
case SPI__DATA_MODE_0: |
{ |
BIT__RST(SPCR, CPOL); |
BIT__RST(SPCR, CPHA); |
} |
break; |
case SPI__DATA_MODE_1: |
{ |
BIT__RST(SPCR, CPOL); |
BIT__SET(SPCR, CPHA); |
} |
break; |
case SPI__DATA_MODE_2: |
{ |
BIT__SET(SPCR, CPOL); |
BIT__RST(SPCR, CPHA); |
} |
break; |
case SPI__DATA_MODE_3: |
{ |
BIT__SET(SPCR, CPOL); |
BIT__SET(SPCR, CPHA); |
} |
break; |
default: |
break; |
} |
} |
/**************************************************************************//** |
* \fn void spi__set_data_order(spi__data_order_t data_order) |
* |
* \brief Set SPI data order. |
* |
* \param[in] data_order Data order to set. |
******************************************************************************/ |
void |
spi__set_data_order |
( |
spi__data_order_t data_order |
){ |
if (SPI__DATA_ORDER__LSB_FIRST == data_order) |
{ |
BIT__SET(SPCR, DORD); |
} |
else |
{ |
BIT__RST(SPCR, DORD); |
} |
} |
/trunk/libraries/spi/SConscript |
---|
0,0 → 1,16 |
# Import environment set for target. |
Import('env_target') |
# Define directories to process. |
directories = [ |
'src/' |
] |
# Process directories. |
for directory in directories: |
SConscript( |
directory + 'SConscript', |
variant_dir = '#build/' + '/libraries/spi/' + env_target['NAME'], |
exports = { 'env_target' : env_target }, |
duplicate = 0 |
) |
/trunk/libraries/spi/SConstruct |
---|
0,0 → 1,40 |
# Import build tools. |
SConscript('#min_env/build_tools.py') |
# Set environment for AVR-GCC. |
SConscript('#min_env/env_target.py') |
# Import environment set for AVR-GCC. |
Import('env_target') |
# Append CPPPATH. |
env_target.Append(CPPPATH = [ '#../' ]) |
# Build library. |
SConscript( |
'src/SConscript', |
variant_dir = '#build/lib/', |
exports = { 'env_target' : env_target }, |
duplicate = 0 |
) |
# Append LIBPATH and LIBS. |
env_target.Append(LIBPATH = [ '#build/lib/']) |
env_target.Append(LIBS = [ 'spi' ]) |
# Build demonstration program. |
SConscript( |
'demo/SConscript', |
variant_dir = '#build/demo/', |
exports = { 'env_target' : env_target }, |
duplicate = 0 |
) |
# Build test program. |
SConscript( |
'test/SConscript', |
variant_dir = '#build/test/', |
exports = { 'env_target' : env_target }, |
duplicate = 0 |
) |
/trunk/libraries/spi/min_env/env_target.py |
---|
0,0 → 1,27 |
# Create and initialize the environment. |
env_target = Environment() |
# Set environment for AVR-GCC. |
env_target['CC'] = 'avr-gcc' |
env_target['CPPPATH'] = '/usr/lib/avr/include' |
env_target['OBJCOPY'] = 'avr-objcopy' |
env_target['SIZE'] = 'avr-size' |
env_target['AR'] = 'avr-ar' |
env_target['RANLIB'] = 'avr-ranlib' |
env_target.Append(CCFLAGS = '-Os') |
# Define environment name. |
env_target.Append(NAME = 'env_target') |
# Microcontroller type. |
env_target.Append(MCU = 'atmega328p') |
# Microcontroller frequency in Hertz. |
env_target.Append(F_CPU = '16000000UL') |
# Set environment for an Atmel AVR ATmega328p microcontroller. |
env_target.Append(CCFLAGS = '-mmcu=' + env_target['MCU']) |
env_target.Append(LINKFLAGS = '-mmcu=' + env_target['MCU']) |
env_target.Append(CPPDEFINES = 'F_CPU=' + env_target['F_CPU']) |
# Export environment set for target. |
Export('env_target') |
/trunk/libraries/spi/min_env/build_tools.py |
---|
0,0 → 1,41 |
""" |
Build project. |
""" |
def BuildProject(env, sources, target_name): |
# Build program. |
env.Program(target = target_name + '.elf', source = sources) |
# Create hex binary file. |
env.Command( |
target_name + '.hex', |
target_name + '.elf', |
env['OBJCOPY'] + ' -O ihex $SOURCE $TARGET' |
) |
AddMethod(Environment, BuildProject) |
""" |
Build library. |
""" |
def BuildLibrary(env, sources, target_name): |
# Build static library. |
env.StaticLibrary(target = target_name, source = sources) |
# Append LIBPATH and LIBS. |
env.Append(LIBPATH = [ '#build/libraries/' + target_name + '/' + env['NAME'] ]) |
env.Append(LIBS = [ target_name ]) |
AddMethod(Environment, BuildLibrary) |
""" |
Compute memory usage. |
""" |
def ComputeMemoryUsage(env, target_name): |
# Compute memory usage. |
env.Command( |
None, |
target_name + '.elf', |
env['SIZE'] + ' -C --mcu=' + env['MCU'] + ' $SOURCE' |
) |
AddMethod(Environment, ComputeMemoryUsage) |