123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 |
- /*
- * ESPRSSIF MIT License
- *
- * Copyright (c) 2016 <ESPRESSIF SYSTEMS (SHANGHAI) PTE LTD>
- *
- * Permission is hereby granted for use on ESPRESSIF SYSTEMS ESP8266 only, in which case,
- * it is free of charge, to any person obtaining a copy of this software and associated
- * documentation files (the "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the Software is furnished
- * to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all copies or
- * substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- */
- /**
- * @file spi_interface.h
- * @brief Defines and Macros for the SPI.
- */
- #ifndef __SPI_INTERFACE_H__
- #define __SPI_INTERFACE_H__
- #include "driver/spi_register.h"
- #include "c_types.h"
- //*****************************************************************************
- //
- // Make sure all of the definitions in this header have a C binding.
- //
- //*****************************************************************************
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- /**
- * @brief Defines slave commands. Default value based on slave ESP8266.
- */
- #define MASTER_WRITE_DATA_TO_SLAVE_CMD 2
- #define MASTER_READ_DATA_FROM_SLAVE_CMD 3
- #define MASTER_WRITE_STATUS_TO_SLAVE_CMD 1
- #define MASTER_READ_STATUS_FROM_SLAVE_CMD 4
- /**
- * @brief Support HSPI and SPI module.
- *
- */
- typedef enum
- {
- SpiNum_SPI = 0,
- SpiNum_HSPI = 1,
- } SpiNum;
- /**
- * @brief The SPI module can work in either master or slave mode.
- *
- */
- typedef enum
- {
- SpiMode_Master = 0,
- SpiMode_Slave = 1,
- } SpiMode;
- /**
- * @brief SPI sub mode
- *
- * Support 4 sub modes based on SPI clock polarity and phase.
- * SPI_CPOL SPI_CPHA SubMode
- * 0 0 0
- * 0 1 1
- * 1 0 2
- * 1 1 3
- */
- typedef enum
- {
- SpiSubMode_0 = 0,
- SpiSubMode_1 = 1,
- SpiSubMode_2 = 2,
- SpiSubMode_3 = 3,
- } SpiSubMode;
- /**
- * @brief The SPI module working speed.
- *
- * @attention Max speed 80MHz
- *
- */
- typedef enum
- {
- SpiSpeed_0_5MHz = 160,
- SpiSpeed_1MHz = 80,
- SpiSpeed_2MHz = 40,
- SpiSpeed_5MHz = 16,
- SpiSpeed_8MHz = 10,
- SpiSpeed_10MHz = 8,
-
- } SpiSpeed;
- /**
- * @brief The SPI mode working speed.
- *
- */
- typedef enum
- {
- SpiBitOrder_MSBFirst = 0,
- SpiBitOrder_LSBFirst = 1,
- } SpiBitOrder;
- // @brief SPI interrupt soource defined.
- typedef enum
- {
- SpiIntSrc_TransDone = SPI_TRANS_DONE,
- SpiIntSrc_WrStaDone = SPI_SLV_WR_STA_DONE,
- SpiIntSrc_RdStaDone = SPI_SLV_RD_STA_DONE,
- SpiIntSrc_WrBufDone = SPI_SLV_WR_BUF_DONE,
- SpiIntSrc_RdBufDone = SPI_SLV_RD_BUF_DONE,
- } SpiIntSrc;
- // @brief SPI CS pin.
- typedef enum
- {
- SpiPinCS_0 = 1,
- SpiPinCS_1 = 2,
- SpiPinCS_2 = 4,
- } SpiPinCS;
- #pragma pack (1)
- /**
- * @brief SPI attribute
- */
- typedef struct
- {
- SpiMode mode; ///< Master or slave mode
- SpiSubMode subMode; ///< SPI SPI_CPOL SPI_CPHA mode
- SpiSpeed speed; ///< SPI Clock
- SpiBitOrder bitOrder; ///< SPI bit order
- } SpiAttr;
- /**
- * @brief SPI data package
- */
- typedef struct
- {
- uint16_t cmd; ///< Command value
- uint8_t cmdLen; ///< Command byte length
- uint32_t *addr; ///< Point to address value
- uint8_t addrLen; ///< Address byte length
- uint32_t *data; ///< Point to data buffer
- uint8_t dataLen; ///< Data byte length.
- } SpiData;
- /**
- * @brief SPI interrupt information
- */
- typedef struct
- {
- SpiIntSrc src; ///< Interrupt source
- void *isrFunc; ///< SPI interrupt callback function.
- } SpiIntInfo;
- #pragma upack (1)
- /**
- * @brief Initialize SPI module.
- *
- * @param [in] spiNum
- * Indicates which submode to be used, SPI or HSPI.
- * @param [in] pAttr
- * Pointer to a struct SpiAttr that indicates SPI working attribution.
- *
- * @return void.
- */
- void SPIInit(SpiNum spiNum, SpiAttr* pAttr);
- /**
- * @brief Set slave address value by master.
- *
- * @param [in] spiNum
- * Indicates which submode to be used, SPI or HSPI.
- * @param [in] addr
- * Slave address to be set.
- *
- * @return void.
- */
- void SPIMasterCfgAddr(SpiNum spiNum, uint32_t addr);
- /**
- * @brief Set command value by master.
- *
- * @param [in] spiNum
- * Indicates which submode to be used, SPI or HSPI.
- * @param [in] cmd
- * Command will be send to slave.
- *
- * @return void.
- */
- void SPIMasterCfgCmd(SpiNum spiNum, uint32_t cmd);
- /**
- * @brief Send data to slave from master.
- *
- * @param [in] spiNum
- * Indicates which submode to be used, SPI or HSPI.
- * @param [in] pInData
- * Pointer to a strcuture that will be send.
- *
- * @return int, -1:indicates failure,others indicates success.
- */
- int SPIMasterSendData(SpiNum spiNum, SpiData* pInData);
- /**
- * @brief Receive data from slave by master.
- *
- * @param [in] spiNum
- * Indicates which submode to be used, SPI or HSPI.
- * @param [in] pOutData
- * Point to data buffer.
- *
- * @return int, -1:indicates failure,others indicates success.
- *
- */
- int SPIMasterRecvData(SpiNum spiNum, SpiData* pOutData);
- /**
- * @brief Load data to slave send buffer.
- *
- * @param [in] spiNum
- * Indicates which submode to be used, SPI or HSPI.
- * @param [in] pInData
- * Point to data buffer.
- * @param [in] inLen
- * The number of bytes to be set.
- *
- * @return int, -1:indicates failure,others indicates success.
- */
- int SPISlaveSendData(SpiNum spiNum, uint32_t *pInData, uint8_t inLen);
- /**
- * @brief Receive data by slave.
- *
- * @param [in] spiNum
- * Indicates which submode to be used, SPI or HSPI.
- * @param [in] isrFunc
- * isrFunc is a pointer to the function to be called when the SPI interrupt occurs.
- *
- * @return int, -1:indicates failure,others indicates success.
- */
- int SPISlaveRecvData(SpiNum spiNum);
- /**
- * @brief Set slave status by master.
- *
- * @param [in] spiNum
- * Indicates which submode to be used, SPI or HSPI.
- * @param [in] data
- * Data will be write to slave SPI_WR_STATUS.
- *
- * @return void.
- *
- * @attention Just for ESP8266(slave) register of RD_STATUS or WR_STATUS.
- */
- void SPIMasterSendStatus(SpiNum spiNum, uint8_t data);
- /**
- * @brief Get salve status by master.
- *
- * @param [in] spiNum
- * Indicates which submode to be used, SPI or HSPI.
- *
- * @return int, -1: indicates failure; other value in slave status.
- *
- * @attention Just for ESP8266(slave) register of RD_STATUS or WR_STATUS.
- */
- int SPIMasterRecvStatus(SpiNum spiNum);
- /**
- * @brief Select SPI CS pin.
- *
- * @param [in] spiNum
- * Indicates which submode to be used, SPI or HSPI.
- * @param [in] pinCs
- * Indicates which SPI pin to choose.
- *
- * @return void.
- */
- void SPICsPinSelect(SpiNum spiNum, SpiPinCS pinCs);
- /**
- * @brief Set SPI module interrupt source and callback function.
- *
- * @param [in] spiNum
- * Indicates which submode to be used, SPI or HSPI.
- * @param [in] pIntInfo
- * Pointer to a struct SpiIntInfo that indicates SPI interrupt information.
- *
- * @return void.
- */
- void SPIIntCfg(SpiNum spiNum, SpiIntInfo *pIntInfo);
- /**
- * @brief Enable SPI module interrupt source.
- *
- * @param [in] spiNum
- * Indicates which submode to be used, SPI or HSPI.
- * @param [in] intSrc
- * Indicates which interrupt source to enable.
- *
- * @return void.
- */
- void SPIIntEnable(SpiNum spiNum, SpiIntSrc intSrc);
- /**
- * @brief Disable SPI module interrupt source.
- *
- * @param [in] spiNum
- * Indicates which submode to be used, SPI or HSPI.
- * @param [in] intSrc
- * Indicates which interrupt source to disable.
- *
- * @return void.
- */
- void SPIIntDisable(SpiNum spiNum, SpiIntSrc intSrc);
- /**
- * @brief Clear all of spi interrupt.
- *
- * @param [in] spiNum
- * Indicates which submode to be used, SPI or HSPI.
- *
- * @return void.
- */
- void SPIIntClear(SpiNum spiNum);
- #ifdef __cplusplus
- }
- #endif
- #endif // __SPI_INTERFACE_H__
|