From f10126a95e528a04b4ec6be1d0fc30be4fbb7e98 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Thu, 16 Jun 2011 07:23:37 +0000 Subject: [PATCH] Added new \ref SPI_GetCurrentMode() function to the SPI peripheral driver. --- LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h | 24 ++++++++++++++++++++---- LUFA/ManPages/ChangeLog.txt | 5 ++++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h b/LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h index 36e7de3f00..2caacaa00b 100644 --- a/LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h +++ b/LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h @@ -167,16 +167,23 @@ */ static inline void SPI_Init(const uint8_t SPIOptions) { - DDRB |= ((1 << 1) | (1 << 2)); - DDRB &= ~((1 << 0) | (1 << 3)); - PORTB |= ((1 << 0) | (1 << 3)); + /* Prevent high rise times on PB.0 (/SS) from forcing a change to SPI slave mode */ + DDRB |= (1 << 0); + PORTB |= (1 << 0); - SPCR = ((1 << SPE) | SPIOptions); + DDRB |= ((1 << 1) | (1 << 2)); + DDRB &= ~(1 << 3); + PORTB |= (1 << 3); if (SPIOptions & SPI_USE_DOUBLESPEED) SPSR |= (1 << SPI2X); else SPSR &= ~(1 << SPI2X); + + /* Switch /SS to input mode after configuration to allow for forced mode changes */ + DDRB &= ~(1 << 0); + + SPCR = ((1 << SPE) | SPIOptions); } /** Turns off the SPI driver, disabling and returning used hardware to their default configuration. */ @@ -188,6 +195,15 @@ SPCR = 0; SPSR = 0; } + + /** Retrieves the currently selected SPI mode, once the SPI interface has been configured. + * + * \return \ref SPI_MODE_MASTER if the interface is currently in SPI Master mode, \ref SPI_MODE_SLAVE otherwise + */ + static inline uint8_t SPI_GetCurrentMode(void) + { + return (SPCR & SPI_MODE_MASTER); + } /** Sends and receives a byte through the SPI interface, blocking until the transfer is complete. * diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 2770fd2066..abf86a9eae 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -18,6 +18,7 @@ * - Added new EVENT_Audio_Device_StreamStartStop() event to the Audio Device Class driver to detect stream start/stop events * - Added board driver support for the Busware TUL board * - Added new Host mode Audio Class driver + * - Added new \ref SPI_GetCurrentMode() function to the SPI peripheral driver * - Library Applications: * - Added RNDIS device mode to the Webserver project * - Added new incomplete AndroidAccessoryHost Host LowLevel demo @@ -40,7 +41,9 @@ * * Fixed: * - Core: - * - Large number of documentation and code comment corrections (thanks to Andrewy from Microsin.ru) + * - Large number of documentation and code comment corrections (thanks to Andrey from Microsin.ru) + * - Fixed possibility of the AVR's SPI interface being pulled out of master mode if the /SS pin is a input and pulled low (thanks + * to Andrey from Microsin.ru) * - Library Applications: * - Fixed incorrect signature in the CDC and DFU class bootloaders for the ATMEGA8U2 * - Fixed KeyboardHost and KeyboardHostWithParser demos displaying incorrect values when numerical keys were pressed