1 /********************************** (C) COPYRIGHT ******************************* 2 * File Name : CH57x_SPI1.c 3 * Author : WCH 4 * Version : V1.0 5 * Date : 2019/4/29 6 * Description 7 *******************************************************************************/ 8 9 #include "CH57x_common.h" 10 11 12 /******************************************************************************* 13 * Function Name : SPI1_MasterDefInit 14 * Description : 主机模式默认初始化:模式0+3线全双工+8MHz 15 * Input : None 16 * Return : None 17 *******************************************************************************/ SPI1_MasterDefInit(void)18void SPI1_MasterDefInit( void ) 19 { 20 R8_SPI1_CLOCK_DIV = 4; // 主频时钟4分频 21 R8_SPI1_CTRL_MOD = RB_SPI_ALL_CLEAR; 22 R8_SPI1_CTRL_MOD = RB_SPI_MOSI_OE | RB_SPI_SCK_OE ; 23 R8_SPI1_CTRL_CFG |= RB_SPI_AUTO_IF; // 访问BUFFER/FIFO自动清除IF_BYTE_END标志 24 R8_SPI1_CTRL_CFG &= ~RB_SPI_DMA_ENABLE; // 不启动DMA方式 25 } 26 27 /******************************************************************************* 28 * Function Name : SPI1_CLKCfg 29 * Description : SPI1 基准时钟配置,= d*Tsys 30 * Input : c: 时钟分频系数 31 * Return : None 32 *******************************************************************************/ SPI1_CLKCfg(UINT8 c)33void SPI1_CLKCfg( UINT8 c ) 34 { 35 if(c==2) 36 R8_SPI1_CTRL_CFG |= RB_SPI_MST_DLY_EN; 37 else 38 R8_SPI1_CTRL_CFG &= ~RB_SPI_MST_DLY_EN; 39 R8_SPI1_CLOCK_DIV = c; 40 } 41 42 /******************************************************************************* 43 * Function Name : SPI1_DataMode 44 * Description : 设置数据流模式 45 * Input : m: 数据流模式 46 refer to ModeBitOrderTypeDef 47 * Return : None 48 *******************************************************************************/ SPI1_DataMode(ModeBitOrderTypeDef m)49void SPI1_DataMode( ModeBitOrderTypeDef m ) 50 { 51 switch( m ) 52 { 53 case Mode0_LowBitINFront: 54 R8_SPI1_CTRL_MOD &= ~RB_SPI_MST_SCK_MOD; 55 R8_SPI1_CTRL_CFG |= RB_SPI_BIT_ORDER; 56 break; 57 case Mode0_HighBitINFront: 58 R8_SPI1_CTRL_MOD &= ~RB_SPI_MST_SCK_MOD; 59 R8_SPI1_CTRL_CFG &= ~RB_SPI_BIT_ORDER; 60 break; 61 case Mode3_LowBitINFront: 62 R8_SPI1_CTRL_MOD |= RB_SPI_MST_SCK_MOD; 63 R8_SPI1_CTRL_CFG |= RB_SPI_BIT_ORDER; 64 break; 65 case Mode3_HighBitINFront: 66 R8_SPI1_CTRL_MOD |= RB_SPI_MST_SCK_MOD; 67 R8_SPI1_CTRL_CFG &= ~RB_SPI_BIT_ORDER; 68 break; 69 default: 70 break; 71 } 72 } 73 74 /******************************************************************************* 75 * Function Name : SPI1_MasterSendByte 76 * Description : 发送单字节 (buffer) 77 * Input : d: 发送字节 78 * Return : None 79 *******************************************************************************/ SPI1_MasterSendByte(UINT8 d)80void SPI1_MasterSendByte( UINT8 d ) 81 { 82 R8_SPI1_CTRL_MOD &= ~RB_SPI_FIFO_DIR; 83 R8_SPI1_BUFFER = d; 84 while( !(R8_SPI1_INT_FLAG & RB_SPI_FREE) ); 85 } 86 87 /******************************************************************************* 88 * Function Name : SPI1_MasterRecvByte 89 * Description : 接收单字节 (buffer) 90 * Input : None 91 * Return : 接收到的字节 92 *******************************************************************************/ SPI1_MasterRecvByte(void)93UINT8 SPI1_MasterRecvByte( void ) 94 { 95 R8_SPI1_CTRL_MOD &= ~RB_SPI_FIFO_DIR; 96 R8_SPI1_BUFFER = 0xFF; // 启动传输 97 while( !(R8_SPI1_INT_FLAG & RB_SPI_FREE) ); 98 return ( R8_SPI1_BUFFER ); 99 } 100 101 102 /******************************************************************************* 103 * Function Name : SPI1_MasterTrans 104 * Description : 使用FIFO连续发送多字节 105 * Input : pbuf: 待发送的数据内容首地址 106 len: 请求发送的数据长度,最大4095 107 * Return : None 108 *******************************************************************************/ SPI1_MasterTrans(UINT8 * pbuf,UINT16 len)109void SPI1_MasterTrans( UINT8 *pbuf, UINT16 len ) 110 { 111 UINT16 sendlen; 112 113 sendlen = len; 114 R8_SPI1_CTRL_MOD &= ~RB_SPI_FIFO_DIR; // 设置数据方向为输出 115 R16_SPI1_TOTAL_CNT = sendlen; // 设置要发送的数据长度 116 R8_SPI1_INT_FLAG = RB_SPI_IF_CNT_END; 117 while( sendlen ) 118 { 119 if( R8_SPI1_FIFO_COUNT < SPI_FIFO_SIZE ) 120 { 121 R8_SPI1_FIFO = *pbuf; 122 pbuf++; 123 sendlen--; 124 } 125 } 126 while( R8_SPI1_FIFO_COUNT != 0 ); // 等待FIFO中的数据全部发送完成 127 } 128 129 /******************************************************************************* 130 * Function Name : SPI1_MasterRecv 131 * Description : 使用FIFO连续接收多字节 132 * Input : pbuf: 待发送的数据内容首地址 133 len: 请求发送的数据长度,最大4095 134 * Return : None 135 *******************************************************************************/ SPI1_MasterRecv(UINT8 * pbuf,UINT16 len)136void SPI1_MasterRecv( UINT8 *pbuf, UINT16 len ) 137 { 138 UINT16 readlen; 139 140 readlen = len; 141 R8_SPI1_CTRL_MOD |= RB_SPI_FIFO_DIR; // 设置数据方向为输入 142 R16_SPI1_TOTAL_CNT = len; // 设置需要接收的数据长度,FIFO方向为输入长度不为0则会启动传输 */ 143 R8_SPI1_INT_FLAG = RB_SPI_IF_CNT_END; 144 while( readlen ) 145 { 146 if( R8_SPI1_FIFO_COUNT ) 147 { 148 *pbuf = R8_SPI1_FIFO; 149 pbuf++; 150 readlen--; 151 } 152 } 153 } 154 155 156 157