spid.h
上传用户:xukun0987
上传日期:2022-07-16
资源大小:216k
文件大小:7k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /* ----------------------------------------------------------------------------
  2.  *         ATMEL Microcontroller Software Support 
  3.  * ----------------------------------------------------------------------------
  4.  * Copyright (c) 2008, Atmel Corporation
  5.  *
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions are met:
  10.  *
  11.  * - Redistributions of source code must retain the above copyright notice,
  12.  * this list of conditions and the disclaimer below.
  13.  *
  14.  * Atmel's name may not be used to endorse or promote products derived from
  15.  * this software without specific prior written permission.
  16.  *
  17.  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  20.  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  22.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  23.  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  24.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  25.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  26.  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * ----------------------------------------------------------------------------
  28.  */
  29. //------------------------------------------------------------------------------
  30. /// unit
  31. ///
  32. /// !!!Purpose
  33. /// 
  34. /// The Spi driver is a low level spi driver which performs SPI device Initializes, 
  35. /// spi transfer and receive. It can be used by upper SPI driver such as AT45 
  36. /// driver and AT26 driver. 
  37. ///  
  38. /// !!!Usage
  39. /// 
  40. /// -# Initializes a SPI instance and the corresponding SPI hardware,
  41. ///    Configure SPI in Master Mode using SPID_Configure().
  42. /// -# Configures the SPI characteristics (such as Clock Polarity, Phase, 
  43. ///    transfers delay and Baud Rate) for the device corresponding to the
  44. ///    chip select using SPID_ConfigureCS().
  45. /// -# Starts a SPI master transfer using SPID_SendCommand().
  46. ///    The transfer is performed using the PDC channels. 
  47. ///    -# It enable the SPI clock.
  48. ///    -# Set the corresponding peripheral chip select.
  49. ///    -# Initialize the two SPI PDC buffers.
  50. ///       - Initialize SPI_TPR and SPI_TCR with SPI command data and size
  51. ///         to send command data first.
  52. ///       - Initialize SPI_RPR and SPI_RCR with SPI command data and size
  53. ///         as dummy value.
  54. ///       - Initialize SPI_TNPR and SPI_TNCR with rest of the data to be 
  55. ///        transfered.(if the data specified in cmd structure)
  56. ///       - Initialize SPI_RNPR and SPI_RNCR with rest of the data to be 
  57. ///         received.(if the data specified in cmd structure)
  58. ///    -# Initialize the callback function if specified.
  59. ///    -# Enable transmitter and receiver.
  60. ///    -# Example for sending a command to the dataflash through the SPI. 
  61. /// code
  62. ///      /// Build command to be sent.
  63. ///      ...
  64. ///      // Send Command and data through the SPI
  65. ///      if (SPID_SendCommand(pAt45->pSpid, pCommand)) {
  66. ///          return AT45_ERROR_SPI;
  67. ///      }
  68. /// endcode
  69. /// -# The SPI_Handler() must be called by the SPI Interrupt Service Routine 
  70. ///    with the corresponding Spi instance. It is invokes to check for pending
  71. ///    interrupts. 
  72. ///    - Example for initializing SPI interrupt handler in upper application.
  73. /// code
  74. ///       AIC_ConfigureIT(AT91C_ID_SPI, 0, SPI_Handler);
  75. /// endcode
  76. //------------------------------------------------------------------------------
  77. #ifndef SPID_H
  78. #define SPID_H
  79. //------------------------------------------------------------------------------
  80. //         Headers
  81. //------------------------------------------------------------------------------
  82. #include <board.h>
  83. //------------------------------------------------------------------------------
  84. //         Definitions
  85. //------------------------------------------------------------------------------
  86. /// An unspecified error has occured.
  87. #define SPID_ERROR          1
  88. /// SPI driver is currently in use.
  89. #define SPID_ERROR_LOCK     2
  90. //------------------------------------------------------------------------------
  91. //         Macros
  92. //------------------------------------------------------------------------------
  93. /// Calculates the value of the SCBR field of the Chip Select Register given
  94. /// MCK and SPCK.
  95. #define SPID_CSR_SCBR(mck, spck)    ((((mck) / (spck)) << 8) & AT91C_SPI_SCBR)
  96. /// Calculates the value of the DLYBS field of the Chip Select Register given
  97. /// the delay in ns and MCK.
  98. #define SPID_CSR_DLYBS(mck, delay) 
  99.     ((((((delay) * ((mck) / 1000000)) / 1000) + 1)  << 16) & AT91C_SPI_DLYBS)
  100. /// Calculates the value of the DLYBCT field of the Chip Select Register given
  101. /// the delay in ns and MCK.
  102. #define SPID_CSR_DLYBCT(mck, delay) 
  103.     ((((((delay) / 32 * ((mck) / 1000000)) / 1000) + 1) << 24) & AT91C_SPI_DLYBCT)
  104. //------------------------------------------------------------------------------
  105. //         Types
  106. //------------------------------------------------------------------------------
  107. /// SPI transfer complete callback.
  108. typedef void (*SpidCallback )(unsigned char, void *);
  109. //------------------------------------------------------------------------------
  110. /// Spi Transfer Request prepared by the application upper layer. This structure
  111. /// is sent to the SPI_SendCommand function to start the transfer. At the end of 
  112. /// the transfer, the callback is invoked by the interrupt handler.
  113. //------------------------------------------------------------------------------
  114. typedef struct _SpidCmd {
  115.     /// Pointer to the command data.
  116. unsigned char *pCmd;
  117.     /// Command size in bytes.
  118. unsigned char cmdSize;
  119.     /// Pointer to the data to be sent.
  120. unsigned char *pData;
  121.     /// Data size in bytes.
  122. unsigned short dataSize;
  123.     /// SPI chip select.
  124. unsigned char spiCs;
  125.     /// Callback function invoked at the end of transfer.
  126. SpidCallback callback;
  127.     /// Callback arguments.
  128. void *pArgument;
  129. } SpidCmd;
  130. //------------------------------------------------------------------------------
  131. /// Constant structure associated with SPI port. This structure prevents
  132. /// client applications to have access in the same time.
  133. //------------------------------------------------------------------------------
  134. typedef struct {
  135.     /// Pointer to SPI Hardware registers
  136. AT91S_SPI *pSpiHw;
  137.     /// SPI Id as defined in the product datasheet
  138. char spiId;
  139.     /// Current SpiCommand being processed
  140. SpidCmd *pCurrentCommand;
  141.     /// Mutual exclusion semaphore.
  142. volatile char semaphore;
  143. } Spid;
  144. //------------------------------------------------------------------------------
  145. //         Exported functions
  146. //------------------------------------------------------------------------------
  147. extern unsigned char SPID_Configure(
  148.     Spid *pSpid,
  149.     AT91S_SPI *pSpiHw,
  150.     unsigned char spiId);
  151. extern void SPID_ConfigureCS(Spid *pSpid, unsigned char cs, unsigned int csr);
  152. extern unsigned char SPID_SendCommand(
  153. Spid *pSpid,
  154. SpidCmd *pCommand);
  155. extern void SPID_Handler(Spid *pSpid);
  156. extern unsigned char SPID_IsBusy(const Spid *pSpid);
  157. #endif // #ifndef SPID_H