1 2 3 4 #ifndef __CH57x_SPI_H__ 5 #define __CH57x_SPI_H__ 6 7 #ifdef __cplusplus 8 extern "C" { 9 #endif 10 11 #include "CH579SFR.h" 12 #include "core_cm0.h" 13 14 /** 15 * @brief SPI0 interrupt bit define 16 */ 17 18 #define SPI0_IT_FST_BYTE RB_SPI_IE_FST_BYTE // 从机模式的首字节命令模式下,接收到首字节中断 19 #define SPI0_IT_FIFO_OV RB_SPI_IE_FIFO_OV // FIFO 溢出 20 #define SPI0_IT_DMA_END RB_SPI_IE_DMA_END // DMA 传输结束 21 #define SPI0_IT_FIFO_HF RB_SPI_IE_FIFO_HF // FIFO 使用过半 22 #define SPI0_IT_BYTE_END RB_SPI_IE_BYTE_END // 单字节传输完成 23 #define SPI0_IT_CNT_END RB_SPI_IE_CNT_END // 全部字节传输完成 24 25 26 27 /** 28 * @brief Configuration data mode 29 */ 30 typedef enum 31 { 32 Mode0_LowBitINFront = 0, // 模式0,低位在前 33 Mode0_HighBitINFront, // 模式0,高位在前 34 Mode3_LowBitINFront, // 模式3,低位在前 35 Mode3_HighBitINFront, // 模式3,高位在前 36 }ModeBitOrderTypeDef; 37 38 39 /** 40 * @brief Configuration SPI0 slave mode 41 */ 42 typedef enum 43 { 44 Mode_DataStream = 0, // 数据流模式 45 Mose_FirstCmd, // 首字节命令模式 46 }Slave_ModeTypeDef; 47 48 49 /**************** SPI0 */ 50 void SPI0_MasterDefInit( void ); /* 主机模式默认初始化:模式0+3线全双工+8MHz */ 51 void SPI0_CLKCfg( UINT8 c ); /* SPI0 基准时钟配置,= d*Tsys */ 52 void SPI0_DataMode( ModeBitOrderTypeDef m ); /* 设置数据流模式 */ 53 54 void SPI0_MasterSendByte( UINT8 d ); /* 发送单字节 (buffer) */ 55 UINT8 SPI0_MasterRecvByte( void ); /* 接收单字节 (buffer) */ 56 57 void SPI0_MasterTrans( UINT8 *pbuf, UINT16 len ); /* 使用FIFO连续发送多字节 */ 58 void SPI0_MasterRecv( UINT8 *pbuf, UINT16 len ); /* 使用FIFO连续接收多字节 */ 59 60 void SPI0_MasterDMATrans( PUINT8 pbuf, UINT16 len); /* DMA方式连续发送数据 */ 61 void SPI0_MasterDMARecv( PUINT8 pbuf, UINT16 len); /* DMA方式连续接收数据 */ 62 63 64 void SPI0_SlaveInit( void ); /* 设备模式默认初始化,建议设置MISO的GPIO对应为输入模式 */ 65 #define SetFirstData(d) (R8_SPI0_SLAVE_PRE = d) /* 加载首字节数据内容 */ 66 void SPI0_SlaveSendByte( UINT8 d ); /* 从机模式,发送一字节数据 */ 67 UINT8 SPI0_SlaveRecvByte( void ); /* 从机模式,接收一字节数据 */ 68 69 void SPI0_SlaveTrans( UINT8 *pbuf, UINT16 len ); /* 从机模式,发送多字节数据 */ 70 void SPI0_SlaveRecv( PUINT8 pbuf, UINT16 len ); /* 从机模式,接收多字节数据 */ 71 72 void SPI0_SlaveDMATrans( PUINT8 pbuf, UINT16 len); /* 从机模式,DMA方式发送多字节数据 */ 73 void SPI0_SlaveDMARecv( PUINT8 pbuf, UINT16 len); /* 从机模式,DMA方式接收多字节数据 */ 74 75 // refer to SPI0 interrupt bit define 76 #define SPI0_ITCfg(s,f) ((s)?(R8_SPI0_INTER_EN|=f):(R8_SPI0_INTER_EN&=~f)) 77 #define SPI0_GetITFlag(f) (R8_SPI0_INT_FLAG&f) /* 获取中断标志状态,0-未置位,(!0)-触发 */ 78 #define SPI0_ClearITFlag(f) (R8_SPI0_INT_FLAG = f) /* 清除当前中断标志 */ 79 80 81 82 83 /**************** SPI1 */ 84 void SPI1_MasterDefInit( void ); /* 主机模式默认初始化:模式0+3线全双工+8MHz */ 85 void SPI1_CLKCfg( UINT8 c ); /* SPI1 基准时钟配置,= d*Tsys */ 86 void SPI1_DataMode( ModeBitOrderTypeDef m ); /* 设置数据流模式 */ 87 88 void SPI1_MasterSendByte( UINT8 d ); /* 发送单字节 (buffer) */ 89 UINT8 SPI1_MasterRecvByte( void ); /* 接收单字节 (buffer) */ 90 91 void SPI1_MasterTrans( UINT8 *pbuf, UINT16 len ); /* 使用FIFO连续发送多字节 */ 92 void SPI1_MasterRecv( UINT8 *pbuf, UINT16 len ); /* 使用FIFO连续接收多字节 */ 93 94 95 // refer to SPI1 interrupt bit define 96 #define SPI1_ITCfg(s,f) ((s)?(R8_SPI1_INTER_EN|=f):(R8_SPI1_INTER_EN&=~f)) 97 #define SPI1_GetITFlag(f) (R8_SPI1_INT_FLAG&f) /* 获取中断标志状态,0-未置位,(!0)-触发 */ 98 #define SPI1_ClearITFlag(f) (R8_SPI1_INT_FLAG = f) /* 清除当前中断标志 */ 99 100 101 102 103 #ifdef __cplusplus 104 } 105 #endif 106 107 #endif // __CH57x_SPI_H__ 108 109