1 #ifndef __SWM320_SPI_H__
2 #define __SWM320_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  RXHFullIEn;    //接收FIFO半满中断使能
13     uint8_t  TXEmptyIEn;    //发送FIFO  空中断使能
14     uint8_t  TXCompleteIEn; //发送FIFO  空且发送移位寄存器空中断使能
15 } SPI_InitStructure;
16 
17 #define SPI_FORMAT_SPI          0       //Motorola SPI 格式
18 #define SPI_FORMAT_TI_SSI       1       //TI SSI 格式
19 
20 #define SPI_FIRST_EDGE          0       //第一个时钟沿开始采样
21 #define SPI_SECOND_EDGE         1       //第二个时钟沿开始采样
22 
23 #define SPI_LOW_LEVEL           0       //空闲时时钟线保持低电平
24 #define SPI_HIGH_LEVEL          1       //空闲时时钟线保持高电平
25 
26 #define SPI_CLKDIV_4            0
27 #define SPI_CLKDIV_8            1
28 #define SPI_CLKDIV_16           2
29 #define SPI_CLKDIV_32           3
30 #define SPI_CLKDIV_64           4
31 #define SPI_CLKDIV_128          5
32 #define SPI_CLKDIV_256          6
33 #define SPI_CLKDIV_512          7
34 
35 
36 /* Interrupt Type */
37 #define SPI_IT_RX_OVF       (1 << 0)    //RX FIFO Overflow
38 #define SPI_IT_RX_FULL      (1 << 1)    //RX FIFO Full
39 #define SPI_IT_RX_HFULL     (1 << 2)    //RX FIFO Half Full
40 #define SPI_IT_TX_EMPTY     (1 << 3)    //TX FIFO Empty
41 #define SPI_IT_TX_HFULL     (1 << 4)    //TX FIFO Half Full
42 #define SPI_IT_TX_DONE      (1 << 9)    //TX Done(发送FIFO空且发送移位寄存器空)
43 
44 
45 
46 void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct);      //SPI初始化
47 void SPI_Open(SPI_TypeDef * SPIx);                                      //SPI打开,允许收发
48 void SPI_Close(SPI_TypeDef * SPIx);                                     //SPI关闭,禁止收发
49 
50 uint32_t SPI_Read(SPI_TypeDef * SPIx);
51 void SPI_Write(SPI_TypeDef * SPIx, uint32_t data);
52 void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data);
53 uint32_t SPI_ReadWrite(SPI_TypeDef * SPIx, uint32_t data);
54 
55 uint32_t SPI_IsRXEmpty(SPI_TypeDef * SPIx);             //接收FIFO是否空,如果不空则可以继续SPI_Read()
56 uint32_t SPI_IsTXFull(SPI_TypeDef * SPIx);              //发送FIFO是否满,如果不满则可以继续SPI_Write()
57 uint32_t SPI_IsTXEmpty(SPI_TypeDef * SPIx);             //发送FIFO是否空
58 
59 
60 void SPI_INTEn(SPI_TypeDef * SPIx, uint32_t it);        //中断使能
61 void SPI_INTDis(SPI_TypeDef * SPIx, uint32_t it);       //中断禁止
62 void SPI_INTClr(SPI_TypeDef * SPIx, uint32_t it);       //中断标志清除
63 uint32_t SPI_INTStat(SPI_TypeDef * SPIx, uint32_t it);  //中断状态查询
64 
65 
66 #endif //__SWM320_SPI_H__
67