WIFI_API_20150524e
Diff: WIFI_Driver/nordic/spi_master.h
- Revision:
- 0:a2de37bf5f3d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WIFI_Driver/nordic/spi_master.h Tue Jun 09 06:04:13 2015 +0000 @@ -0,0 +1,110 @@ + /* Copyright (c) 2009 Nordic Semiconductor. All Rights Reserved. + * + * The information contained herein is property of Nordic Semiconductor ASA. + * Terms and conditions of usage are described in detail in NORDIC + * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. + * + * Licensees are granted free, non-transferable use of the information. NO + * WARRANTY of ANY KIND is provided. This heading must NOT be removed from + * the file. + * + */ + +#ifndef SPI_MASTER_H +#define SPI_MASTER_H + +#include <stdbool.h> +#include <stdint.h> + +/* @file +* @brief Software controlled SPI Master driver. +* +* +* @defgroup lib_driver_spi_master Software controlled SPI Master driver +* @{ +* @ingroup nrf_drivers +* @brief Software controlled SPI Master driver. +* +* Supported features: +* - Operate two SPI masters independently or in parallel. +* - Transmit and Receive given size of data through SPI. +* - configure each SPI module separately through @ref spi_master_init. +*/ + +/** + * SPI master operating frequency + */ +typedef enum +{ + Freq_125Kbps = 0, /*!< drive SClk with frequency 125Kbps */ + Freq_250Kbps, /*!< drive SClk with frequency 250Kbps */ + Freq_500Kbps, /*!< drive SClk with frequency 500Kbps */ + Freq_1Mbps, /*!< drive SClk with frequency 1Mbps */ + Freq_2Mbps, /*!< drive SClk with frequency 2Mbps */ + Freq_4Mbps, /*!< drive SClk with frequency 4Mbps */ + Freq_8Mbps /*!< drive SClk with frequency 8Mbps */ +} SPIFrequency_t; + +/** + * SPI master module number + */ +typedef enum +{ + SPI0 = 0, /*!< SPI module 0 */ + SPI1 /*!< SPI module 1 */ +} SPIModuleNumber; + +/** + * SPI mode + */ +typedef enum +{ + //------------------------Clock polarity 0, Clock starts with level 0------------------------------------------- + SPI_MODE0 = 0, /*!< Sample data at rising edge of clock and shift serial data at falling edge */ + SPI_MODE1, /*!< sample data at falling edge of clock and shift serial data at rising edge */ + //------------------------Clock polarity 1, Clock starts with level 1------------------------------------------- + SPI_MODE2, /*!< sample data at falling edge of clock and shift serial data at rising edge */ + SPI_MODE3 /*!< Sample data at rising edge of clock and shift serial data at falling edge */ +} SPIMode; + + +/** + * @brief Function for initializing given SPI master with given configuration. + * + * After initializing the given SPI master with given configuration, this function also test if the + * SPI slave is responding with the configurations by transmitting few test bytes. If the slave did not + * respond then error is returned and contents of the rx_data are invalid. + * + * @param module_number SPI master number (SPIModuleNumber) to initialize. + * @param mode SPI master mode (mode 0, 1, 2 or 3 from SPIMode) + * @param lsb_first true if lsb is first bit to shift in/out as serial data on MISO/MOSI pins. + * @return + * @retval pointer to direct physical address of the requested SPI module if init was successful + * @retval 0, if either init failed or slave did not respond to the test transfer + */ +uint32_t* spi_master_init(SPIModuleNumber module_number, SPIMode mode, bool lsb_first); + +/** + * @brief Function for transferring/receiving data over SPI bus. + * + * If TWI master detects even one NACK from the slave or timeout occurs, STOP condition is issued + * and the function returns false. + * + * @note Make sure at least transfer_size number of bytes is allocated in tx_data/rx_data. + * + * @param spi_base_address register base address of the selected SPI master module + * @param transfer_size number of bytes to transmit/receive over SPI master + * @param tx_data pointer to the data that needs to be transmitted + * @param rx_data pointer to the data that needs to be received + * @return + * @retval true if transmit/reveive of transfer_size were completed. + * @retval false if transmit/reveive of transfer_size were not complete and tx_data/rx_data points to invalid data. + */ +//bool spi_master_tx_rx(uint32_t *spi_base_address, uint16_t transfer_size, const uint8_t *tx_data, uint8_t *rx_data); +bool spi_master_tx_rx(SPIModuleNumber module_number, uint16_t transfer_size, const uint8_t *tx_data, uint8_t *rx_data); + +/** + *@} + **/ + +#endif /* SPI_MASTER_H */