1 #ifndef __SWM341_SPI_H__
2 #define __SWM341_SPI_H__
3 
4 typedef struct {
5     uint8_t  FrameFormat;   //帧格式:SPI_FORMAT_SPI、SPI_FORMAT_TI_SSI
6     uint8_t  SampleEdge;    //在SPI帧格式下,选择数据采样边沿:SPI_FIRST_EDGE、SPI_SECOND_EDGE
7     uint8_t  IdleLevel;     //在SPI帧格式下,选择空闲时(无数据传输时)时钟线的电平:SPI_LOW_LEVEL、SPI_HIGH_LEVEL
8     uint8_t  WordSize;      //字长度, 有效值4-16
9     uint8_t  Master;        //1 主机模式    0 从机模式
10     uint8_t  clkDiv;        //SPI_CLK = SYS_CLK / clkDiv,有效值:SPI_CLKDIV_4、SPI_CLKDIV_8、... ... 、SPI_CLKDIV_512
11 
12     uint8_t  RXThreshold;   //取值1--8
13     uint8_t  RXThresholdIEn;//当RX FIFO中数据个数 >= RXThreshold时触发中断
14 
15     uint8_t  TXThreshold;   //取值0--7
16     uint8_t  TXThresholdIEn;//当TX FIFO中数据个数 <= TXThreshold时触发中断
17 
18     uint8_t  TXCompleteIEn; //发送FIFO空且发送移位寄存器空中断使能
19 } SPI_InitStructure;
20 
21 #define SPI_FORMAT_SPI          0       //Motorola SPI 格式
22 #define SPI_FORMAT_TI_SSI       1       //TI SSI 格式
23 #define SPI_FORMAT_I2S          2
24 
25 #define SPI_FIRST_EDGE          0       //第一个时钟沿开始采样
26 #define SPI_SECOND_EDGE         1       //第二个时钟沿开始采样
27 
28 #define SPI_LOW_LEVEL           0       //空闲时时钟线保持低电平
29 #define SPI_HIGH_LEVEL          1       //空闲时时钟线保持高电平
30 
31 #define SPI_CLKDIV_2            8
32 #define SPI_CLKDIV_4            0
33 #define SPI_CLKDIV_8            1
34 #define SPI_CLKDIV_16           2
35 #define SPI_CLKDIV_32           3
36 #define SPI_CLKDIV_64           4
37 #define SPI_CLKDIV_128          5
38 #define SPI_CLKDIV_256          6
39 #define SPI_CLKDIV_512          7
40 
41 
42 /* Interrupt Type */
43 #define SPI_IT_RX_OVF       (1 << 0)    //RX FIFO Overflow
44 #define SPI_IT_RX_FULL      (1 << 1)    //RX FIFO Full
45 #define SPI_IT_RX_HFULL     (1 << 2)    //RX FIFO Half Full
46 #define SPI_IT_TX_EMPTY     (1 << 3)    //TX FIFO Empty
47 #define SPI_IT_TX_HFULL     (1 << 4)    //TX FIFO Half Full
48 #define SPI_IT_RX_THRES     (1 << 5)    //RX FIFO Threshold(接收FIFO中数据个数大于CTRL.RFTHR设定值)
49 #define SPI_IT_TX_THRES     (1 << 6)    //TX FIFO Threshold(发送FIFO中数据个数小于CTRL.TFTHR设定值)
50 #define SPI_IT_TX_DONE      (1 << 9)    //TX Done(发送FIFO空且发送移位寄存器空)
51 #define SPI_IT_CS_FALL      (1 << 10)   //从机模式下,CS下降沿中断
52 #define SPI_IT_CS_RISE      (1 << 11)   //从机模式下,CS上升沿中断
53 
54 
55 void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct);      //SPI初始化
56 void SPI_Open(SPI_TypeDef * SPIx);                                      //SPI打开,允许收发
57 void SPI_Close(SPI_TypeDef * SPIx);                                     //SPI关闭,禁止收发
58 
59 uint32_t SPI_Read(SPI_TypeDef * SPIx);
60 void SPI_Write(SPI_TypeDef * SPIx, uint32_t data);
61 void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data);
62 uint32_t SPI_ReadWrite(SPI_TypeDef * SPIx, uint32_t data);
63 
64 uint32_t SPI_IsRXEmpty(SPI_TypeDef * SPIx);             //接收FIFO是否空,如果不空则可以继续SPI_Read()
65 uint32_t SPI_IsTXFull(SPI_TypeDef * SPIx);              //发送FIFO是否满,如果不满则可以继续SPI_Write()
66 uint32_t SPI_IsTXEmpty(SPI_TypeDef * SPIx);             //发送FIFO是否空
67 
68 
69 void SPI_INTEn(SPI_TypeDef * SPIx, uint32_t it);        //中断使能
70 void SPI_INTDis(SPI_TypeDef * SPIx, uint32_t it);       //中断禁止
71 void SPI_INTClr(SPI_TypeDef * SPIx, uint32_t it);       //中断标志清除
72 uint32_t SPI_INTStat(SPI_TypeDef * SPIx, uint32_t it);  //中断状态查询
73 
74 
75 
76 
77 typedef struct {
78     uint8_t  Mode;          //I2S_MASTER_TX、I2S_MASTER_RX、I2S_MASTER_TX_RX、I2S_SLAVE_TX、I2S_SLAVE_RX、I2S_SLAVE_TX_RX
79     uint8_t  FrameFormat;   //I2S_I2S_PHILIPS、I2S_MSB_JUSTIFIED、I2S_PCM_SHORT、I2S_PCM_LONG0、I2S_PCM_LONG1
80     uint8_t  ChannelLen;    //I2S_CHNNLEN_16、I2S_CHNNLEN_32
81     uint8_t  DataLen;       //I2S_DATALEN_8、I2S_DATALEN_16、I2S_DATALEN_24、I2S_DATALEN_32
82     uint32_t ClkFreq;       //I2S_SCLK Frequency
83 
84     uint8_t  RXThreshold;   //取值1--8
85     uint8_t  RXThresholdIEn;//当RX FIFO中数据个数 >= RXThreshold时触发中断
86 
87     uint8_t  TXThreshold;   //取值0--7
88     uint8_t  TXThresholdIEn;//当TX FIFO中数据个数 <= TXThreshold时触发中断
89 
90     uint8_t  TXCompleteIEn; //发送FIFO空且发送移位寄存器空中断使能
91 } I2S_InitStructure;
92 
93 #define I2S_MASTER_RX       5
94 #define I2S_MASTER_TX       6
95 #define I2S_SLAVE_RX        1
96 #define I2S_SLAVE_TX        2
97 
98 #define I2S_I2S_PHILIPS     0
99 #define I2S_MSB_JUSTIFIED   1
100 #define I2S_PCM_SHORT       2
101 #define I2S_PCM_LONG0       3   //PCM Long Mode Sync Width 1 SCLK period
102 #define I2S_PCM_LONG1       4   //PCM Long Mode Sync Width 1 Data Length
103 
104 #define I2S_CHNNLEN_16      0
105 #define I2S_CHNNLEN_32      1
106 
107 #define I2S_DATALEN_8       0
108 #define I2S_DATALEN_16      1
109 #define I2S_DATALEN_24      2
110 #define I2S_DATALEN_32      3
111 
112 void I2S_Init(SPI_TypeDef * SPIx, I2S_InitStructure * initStruct);      //I2S初始化
113 void I2S_Open(SPI_TypeDef * SPIx);                                      //I2S打开,允许收发
114 void I2S_Close(SPI_TypeDef * SPIx);                                     //I2S关闭,禁止收发
115 
116 
117 #endif //__SWM341_SPI_H__
118