123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- /********************************** (C) COPYRIGHT *******************************
- * File Name : CH57x_SPI0.c
- * Author : WCH
- * Version : V1.0
- * Date : 2018/12/15
- * Description
- *******************************************************************************/
- #include "CH57x_common.h"
- /*******************************************************************************
- * Function Name : SPI0_MasterDefInit
- * Description : 主机模式默认初始化:模式0+3线全双工+8MHz
- * Input : None
- * Return : None
- *******************************************************************************/
- void SPI0_MasterDefInit( void )
- {
- R8_SPI0_CLOCK_DIV = 4; // 主频时钟4分频
- R8_SPI0_CTRL_MOD = RB_SPI_ALL_CLEAR;
- R8_SPI0_CTRL_MOD = RB_SPI_MOSI_OE | RB_SPI_SCK_OE ;
- R8_SPI0_CTRL_CFG |= RB_SPI_AUTO_IF; // 访问BUFFER/FIFO自动清除IF_BYTE_END标志
- R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE; // 不启动DMA方式
- }
- /*******************************************************************************
- * Function Name : SPI0_CLKCfg
- * Description : SPI0 基准时钟配置,= d*Tsys
- * Input : c: 时钟分频系数
- * Return : None
- *******************************************************************************/
- void SPI0_CLKCfg( UINT8 c )
- {
- if(c==2)
- R8_SPI0_CTRL_CFG |= RB_SPI_MST_DLY_EN;
- else
- R8_SPI0_CTRL_CFG &= ~RB_SPI_MST_DLY_EN;
- R8_SPI0_CLOCK_DIV = c;
- }
- /*******************************************************************************
- * Function Name : SPI0_DataMode
- * Description : 设置数据流模式
- * Input : m: 数据流模式
- refer to ModeBitOrderTypeDef
- * Return : None
- *******************************************************************************/
- void SPI0_DataMode( ModeBitOrderTypeDef m )
- {
- switch( m )
- {
- case Mode0_LowBitINFront:
- R8_SPI0_CTRL_MOD &= ~RB_SPI_MST_SCK_MOD;
- R8_SPI0_CTRL_CFG |= RB_SPI_BIT_ORDER;
- break;
- case Mode0_HighBitINFront:
- R8_SPI0_CTRL_MOD &= ~RB_SPI_MST_SCK_MOD;
- R8_SPI0_CTRL_CFG &= ~RB_SPI_BIT_ORDER;
- break;
- case Mode3_LowBitINFront:
- R8_SPI0_CTRL_MOD |= RB_SPI_MST_SCK_MOD;
- R8_SPI0_CTRL_CFG |= RB_SPI_BIT_ORDER;
- break;
- case Mode3_HighBitINFront:
- R8_SPI0_CTRL_MOD |= RB_SPI_MST_SCK_MOD;
- R8_SPI0_CTRL_CFG &= ~RB_SPI_BIT_ORDER;
- break;
- default:
- break;
- }
- }
- /*******************************************************************************
- * Function Name : SPI0_MasterSendByte
- * Description : 发送单字节 (buffer)
- * Input : d: 发送字节
- * Return : None
- *******************************************************************************/
- void SPI0_MasterSendByte( UINT8 d )
- {
- R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
- R8_SPI0_BUFFER = d;
- while( !(R8_SPI0_INT_FLAG & RB_SPI_FREE) );
- }
- /*******************************************************************************
- * Function Name : SPI0_MasterRecvByte
- * Description : 接收单字节 (buffer)
- * Input : None
- * Return : 接收到的字节
- *******************************************************************************/
- UINT8 SPI0_MasterRecvByte( void )
- {
- R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
- R8_SPI0_BUFFER = 0xFF; // 启动传输
- while( !(R8_SPI0_INT_FLAG & RB_SPI_FREE) );
- return ( R8_SPI0_BUFFER );
- }
- /*******************************************************************************
- * Function Name : SPI0_MasterTrans
- * Description : 使用FIFO连续发送多字节
- * Input : pbuf: 待发送的数据内容首地址
- len: 请求发送的数据长度,最大4095
- * Return : None
- *******************************************************************************/
- void SPI0_MasterTrans( UINT8 *pbuf, UINT16 len )
- {
- UINT16 sendlen;
- sendlen = len;
- R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR; // 设置数据方向为输出
- R16_SPI0_TOTAL_CNT = sendlen; // 设置要发送的数据长度
- R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END;
- while( sendlen )
- {
- if( R8_SPI0_FIFO_COUNT < SPI_FIFO_SIZE )
- {
- R8_SPI0_FIFO = *pbuf;
- pbuf++;
- sendlen--;
- }
- }
- while( R8_SPI0_FIFO_COUNT != 0 ); // 等待FIFO中的数据全部发送完成
- }
- /*******************************************************************************
- * Function Name : SPI0_MasterRecv
- * Description : 使用FIFO连续接收多字节
- * Input : pbuf: 待发送的数据内容首地址
- len: 请求发送的数据长度,最大4095
- * Return : None
- *******************************************************************************/
- void SPI0_MasterRecv( UINT8 *pbuf, UINT16 len )
- {
- UINT16 readlen;
- readlen = len;
- R8_SPI0_CTRL_MOD |= RB_SPI_FIFO_DIR; // 设置数据方向为输入
- R16_SPI0_TOTAL_CNT = len; // 设置需要接收的数据长度,FIFO方向为输入长度不为0则会启动传输 */
- R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END;
- while( readlen )
- {
- if( R8_SPI0_FIFO_COUNT )
- {
- *pbuf = R8_SPI0_FIFO;
- pbuf++;
- readlen--;
- }
- }
- }
- /*******************************************************************************
- * Function Name : SPI0_MasterDMATrans
- * Description : DMA方式连续发送数据
- * Input : pbuf: 待发送数据起始地址
- * len : 待发送数据长度
- * Return : None
- *******************************************************************************/
- void SPI0_MasterDMATrans( PUINT8 pbuf, UINT16 len)
- {
- R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
- R16_SPI0_DMA_BEG = (UINT32)pbuf;
- R16_SPI0_DMA_END = (UINT32)(pbuf + len);
- R16_SPI0_TOTAL_CNT = len;
- R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END|RB_SPI_IF_DMA_END;
- R8_SPI0_CTRL_CFG |= RB_SPI_DMA_ENABLE;
- while(!(R8_SPI0_INT_FLAG & RB_SPI_IF_CNT_END));
- R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;
- }
- /*******************************************************************************
- * Function Name : SPI0_MasterDMARecv
- * Description : DMA方式连续接收数据
- * Input : pbuf: 待接收数据存放起始地址
- * len : 待接收数据长度
- * Return : None
- *******************************************************************************/
- void SPI0_MasterDMARecv( PUINT8 pbuf, UINT16 len)
- {
- R8_SPI0_CTRL_MOD |= RB_SPI_FIFO_DIR;
- R16_SPI0_DMA_BEG = (UINT32)pbuf;
- R16_SPI0_DMA_END = (UINT32)(pbuf + len);
- R16_SPI0_TOTAL_CNT = len;
- R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END|RB_SPI_IF_DMA_END;
- R8_SPI0_CTRL_CFG |= RB_SPI_DMA_ENABLE;
- while(!(R8_SPI0_INT_FLAG & RB_SPI_IF_CNT_END));
- R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;
- }
- /*******************************************************************************
- * Function Name : SPI0_SlaveInit
- * Description : 设备模式默认初始化,建议设置MISO的GPIO对应为输入模式
- * Input : None
- * Return : None
- *******************************************************************************/
- void SPI0_SlaveInit( void )
- {
- R8_SPI0_CTRL_MOD = RB_SPI_ALL_CLEAR;
- R8_SPI0_CTRL_MOD = RB_SPI_MISO_OE | RB_SPI_MODE_SLAVE;
- R8_SPI0_CTRL_CFG |= RB_SPI_AUTO_IF;
- }
- /*******************************************************************************
- * Function Name : SPI0_SlaveRecvByte
- * Description : 从机模式,接收一字节数据
- * Input : None
- * Return : 接收到数据
- *******************************************************************************/
- UINT8 SPI0_SlaveRecvByte( void )
- {
- R8_SPI0_CTRL_MOD |= RB_SPI_FIFO_DIR;
- while( R8_SPI0_FIFO_COUNT == 0 );
- return R8_SPI0_FIFO;
- }
- /*******************************************************************************
- * Function Name : SPI0_SlaveSendByte
- * Description : 从机模式,发送一字节数据
- * Input : d -待发送数据
- * Return : None
- *******************************************************************************/
- void SPI0_SlaveSendByte( UINT8 d )
- {
- R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
- R8_SPI0_FIFO = d;
- while( R8_SPI0_FIFO_COUNT != 0 ); // 等待发送完成
- }
- /*******************************************************************************
- * Function Name : SPI0_SlaveRecv
- * Description : 从机模式,接收多字节数据
- * Input : pbuf: 接收收数据存放起始地址
- * len : 请求接收数据长度
- * Return : None
- *******************************************************************************/
- void SPI0_SlaveRecv( PUINT8 pbuf, UINT16 len )
- {
- UINT16 revlen;
- revlen = len;
- R8_SPI0_CTRL_MOD |= RB_SPI_FIFO_DIR;
- R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END;
- while( revlen )
- {
- if( R8_SPI0_FIFO_COUNT )
- {
- *pbuf = R8_SPI0_FIFO;
- pbuf++;
- revlen--;
- }
- }
- }
- /*******************************************************************************
- * Function Name : SPI0_SlaveTrans
- * Description : 从机模式,发送多字节数据
- * Input : pbuf: 待发送的数据内容首地址
- len: 请求发送的数据长度,最大4095
- * Return : None
- *******************************************************************************/
- void SPI0_SlaveTrans( UINT8 *pbuf, UINT16 len )
- {
- UINT16 sendlen;
- sendlen = len;
- R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR; // 设置数据方向为输出
- R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END;
- while( sendlen )
- {
- if( R8_SPI0_FIFO_COUNT < SPI_FIFO_SIZE )
- {
- R8_SPI0_FIFO = *pbuf;
- pbuf++;
- sendlen--;
- }
- }
- while( R8_SPI0_FIFO_COUNT != 0 ); // 等待FIFO中的数据全部发送完成
- }
- /*******************************************************************************
- * Function Name : SPI0_SlaveDMARecv
- * Description : DMA方式连续接收数据
- * Input : pbuf: 待接收数据存放起始地址
- * len : 待接收数据长度
- * Return : None
- *******************************************************************************/
- void SPI0_SlaveDMARecv( PUINT8 pbuf, UINT16 len)
- {
- R8_SPI0_CTRL_MOD |= RB_SPI_FIFO_DIR;
- R16_SPI0_DMA_BEG = (UINT32)pbuf;
- R16_SPI0_DMA_END = (UINT32)(pbuf + len);
- R16_SPI0_TOTAL_CNT = len;
- R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END|RB_SPI_IF_DMA_END;
- R8_SPI0_CTRL_CFG |= RB_SPI_DMA_ENABLE;
- while(!(R8_SPI0_INT_FLAG & RB_SPI_IF_CNT_END));
- R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;
- }
- /*******************************************************************************
- * Function Name : SPI0_SlaveDMATrans
- * Description : DMA方式连续发送数据
- * Input : pbuf: 待发送数据起始地址
- * len : 待发送数据长度
- * Return : None
- *******************************************************************************/
- void SPI0_SlaveDMATrans( PUINT8 pbuf, UINT16 len)
- {
- R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
- R16_SPI0_DMA_BEG = (UINT32)pbuf;
- R16_SPI0_DMA_END = (UINT32)(pbuf + len);
- R16_SPI0_TOTAL_CNT = len;
- R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END|RB_SPI_IF_DMA_END;
- R8_SPI0_CTRL_CFG |= RB_SPI_DMA_ENABLE;
- while(!(R8_SPI0_INT_FLAG & RB_SPI_IF_CNT_END));
- R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;
- }
|