CH57x_spi1.c 5.4 KB

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