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