1 /******************************************************************************
2 * Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
3 *
4 * This software is owned and published by:
5 * Huada Semiconductor Co.,Ltd ("HDSC").
6 *
7 * BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
8 * BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
9 *
10 * This software contains source code for use with HDSC
11 * components. This software is licensed by HDSC to be adapted only
12 * for use in systems utilizing HDSC components. HDSC shall not be
13 * responsible for misuse or illegal use of this software for devices not
14 * supported herein. HDSC is providing this software "AS IS" and will
15 * not be responsible for issues arising from incorrect user implementation
16 * of the software.
17 *
18 * Disclaimer:
19 * HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED   , ARISING BY LAW OR OTHERWISE,
20 * REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
21 * ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
22 * WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
23 * WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
24 * WARRANTY OF NONINFRINGEMENT.
25 * HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
26 * NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
27 * LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
28 * LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
29 * INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
30 * INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
31 * SAVINGS OR PROFITS,
32 * EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
33 * YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
34 * INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
35 * FROM, THE SOFTWARE.
36 *
37 * This software may be replicated in part or whole for the licensed use,
38 * with the restriction that this Disclaimer and Copyright notice must be
39 * included with each copy of this software, whether used in part or whole,
40 * at all times.
41 */
42 /*****************************************************************************/
43 /** \file spi.h
44  **
45  ** Headerfile for SPI functions
46  **
47  **
48  ** History:
49  **   - 2017-05-17  1.0  Devi     First Version
50  **
51  *****************************************************************************/
52 #ifndef __SPI_H__
53 #define __SPI_H__
54 
55 /******************************************************************************
56  * Include files
57  *****************************************************************************/
58 #include "ddl.h"
59 #include "interrupts_hc32l136.h"
60 
61 /* C binding of definitions if building with C++ compiler */
62 #ifdef __cplusplus
63 extern "C"
64 {
65 #endif
66 
67 //@{
68 
69 /******************************************************************************
70  * Global type definitions
71  *****************************************************************************/
72  /**
73  ******************************************************************************
74  ** \brief SPI 功能通道选择设置
75  ******************************************************************************/
76 typedef enum en_spi_channel
77 {
78     Spi0     = 0u,  ///< SPI通道0
79     Spi1     = 1u,  ///< SPI通道1
80 }en_spi_channel_t;
81 /**
82  ******************************************************************************
83  ** \brief SPI 功能使能设置
84  ******************************************************************************/
85 typedef enum en_spi_en
86 {
87     SpiEnable     = 1u,  ///< SPI模块使能
88     SpiDisable    = 0u,  ///< SPI模块禁止
89 }en_spi_en_t;
90 /**
91  ******************************************************************************
92  ** \brief SPI 模式配置
93  ******************************************************************************/
94 typedef enum en_spi_mode
95 {
96     SpiMaster = 1u,  ///<主机
97     SpiSlave  = 0u,  ///<从机
98 }en_spi_mode_t;
99 /**
100  ******************************************************************************
101  ** \brief SPI 时钟极性设置
102  ******************************************************************************/
103 typedef enum en_spi_cpol
104 {
105     Spicpollow   = 0u,  ///<极性为低
106     Spicpolhigh  = 1u,  ///<极性为高
107 }en_spi_cpol_t;
108 /**
109  ******************************************************************************
110  ** \brief SPI 时钟相位设置
111  ******************************************************************************/
112 typedef enum en_spi_cpha
113 {
114     Spicphafirst   = 0u,  ///<第一边沿采样
115     Spicphasecond  = 1u,  ///<第二边沿采样
116 }en_spi_cpha_t;
117 /**
118  ******************************************************************************
119  ** \brief SPI 时钟分频配置
120  *****************************************************************************/
121 typedef enum en_spi_clk_div
122 {
123     SpiClkDiv2   = 0u,   ///<2分频
124     SpiClkDiv4   = 1u,   ///<4分频
125     SpiClkDiv8   = 2u,   ///<8分频
126     SpiClkDiv16  = 3u,   ///<16分频
127     SpiClkDiv32  = 4u,   ///<32分频
128     SpiClkDiv64  = 5u,   ///<64分频
129     SpiClkDiv128 = 6u,   ///<128分频
130 }en_spi_clk_div_t;
131 
132 /**
133  ******************************************************************************
134  ** \brief SPI 片选脚电平选择
135  *****************************************************************************/
136 typedef enum en_spi_cspin
137 {
138     SpiCsLow  = 0u,      ///<片选低电平
139     SpiCsHigh = 1u,      ///<片选高电平
140 }en_spi_cspin_t;
141 
142 /**
143  ******************************************************************************
144  ** \brief SPI 状态
145  *****************************************************************************/
146 typedef enum en_spi_status
147 {
148     SpiIf              = 0x80,   ///<传输结束中断标志
149     SpiSserr           = 0x20,   ///<从机模式错误标志
150     SpiMdf             = 0x10,   ///<主机模式错误标志
151     SpiBusy            = 0x08,   ///<SPI总线忙标志
152     SpiTxe             = 0x04,   ///<发送缓冲器器空标志
153     SpiRxne            = 0x02,   ///<接受缓冲器非空标志
154 }en_spi_status_t;
155 /**
156  ******************************************************************************
157  ** \brief SPI 功能开启函数
158  *****************************************************************************/
159 typedef enum en_spi_func
160 {
161     SpiRxNeIe          = 0x40,   ///<接收缓冲器非空中断使能
162     SpiTxEIe           = 0x20,   ///<发送缓冲器空中断使能
163     SpiDmaTxEn         = 0x10,   ///<DMA硬件访问发送使能
164     SpiDmaRxEn         = 0x08,   ///<DMA硬件访问接收使能
165 }en_spi_func_t;
166 /**
167  ******************************************************************************
168  ** \brief SPI 总体配置结构体
169  *****************************************************************************/
170 typedef struct stc_spi_config
171 {
172     boolean_t           bMasterMode;     ///< 主从模式选择
173     uint8_t             u8BaudRate;      ///< 波特率设置
174     boolean_t           bCPOL;           ///< 时钟极性选择
175     boolean_t           bCPHA;           ///< 时钟相位选择
176     boolean_t           bIrqEn;          ///< 中断使能
177     func_ptr_t          pfnSpi0IrqCb;    ///< 中断回调函数
178     func_ptr_t          pfnSpi1IrqCb;    ///< 中断回调函数
179 }stc_spi_config_t;
180 
181 //SPI 中断
182 void Spi_IRQHandler(en_spi_channel_t enCh);
183 
184 //SPI 获取状态
185 uint8_t Spi_GetState(en_spi_channel_t enCh);
186 boolean_t Spi_GetStatus(en_spi_channel_t enCh,en_spi_status_t enStatus);
187 //SPI 清除中断标记
188 en_result_t Spi_ClearStatus(en_spi_channel_t enCh);
189 //SPI初始化函数
190 en_result_t Spi_Init(en_spi_channel_t enCh,stc_spi_config_t* pstcSpiConfig);
191 //SPI 功能使能禁止函数
192 en_result_t Spi_FuncEn(en_spi_channel_t enCh,en_spi_func_t enFunc,boolean_t bFlag);
193 //SPI关闭函数
194 en_result_t Spi_DeInit(en_spi_channel_t enCh);
195 //SPI 配置主发送的电平
196 void Spi_SetCS(en_spi_channel_t enCh,boolean_t bFlag);
197 //SPI 发送数据
198 en_result_t Spi_SendData(en_spi_channel_t enCh,uint8_t u8Data);
199 //SPI 主机接收数据
200 uint8_t Spi_ReceiveData(en_spi_channel_t enCh,boolean_t bMasterOrSlave);
201 
202 //@} // Spi Group
203 
204 #ifdef __cplusplus
205 }
206 #endif
207 
208 #endif /* __SPI_H__ */
209 /******************************************************************************
210  * EOF (not truncated)
211  *****************************************************************************/
212 
213