diff options
| author | Fran莽ois Cartegnie <281376+fcartegnie@users.noreply.github.com> | 2024-06-06 11:22:09 +0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-06 11:22:09 +0700 |
| commit | f6d84a1ead1a57574c45bb80b6fd450c5b784e09 (patch) | |
| tree | ccfe2db3861197bc29eff52e53a814d909501863 /CH5xx_ble_firmware_library/StdPeriphDriver/CH58x_spi1.c | |
| parent | d641c0de85f6ccf73c8c99012f1a5c4e28af54dc (diff) | |
| parent | 90cdb61063b408aa4d8ba0c1e3c36d804f69f61a (diff) | |
Merge pull request #10 from kienvo/led-scan
Add basic Charlieplexing scan
Diffstat (limited to 'CH5xx_ble_firmware_library/StdPeriphDriver/CH58x_spi1.c')
| -rw-r--r-- | CH5xx_ble_firmware_library/StdPeriphDriver/CH58x_spi1.c | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/CH5xx_ble_firmware_library/StdPeriphDriver/CH58x_spi1.c b/CH5xx_ble_firmware_library/StdPeriphDriver/CH58x_spi1.c new file mode 100644 index 0000000..e96b9e0 --- /dev/null +++ b/CH5xx_ble_firmware_library/StdPeriphDriver/CH58x_spi1.c @@ -0,0 +1,178 @@ +/********************************** (C) COPYRIGHT *******************************
+ * File Name : CH58x_SPI1.c
+ * Author : WCH
+ * Version : V1.0
+ * Date : 2018/12/15
+ * Description
+ *********************************************************************************
+ * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
+ * Attention: This software (modified or not) and binary are used for
+ * microcontroller manufactured by Nanjing Qinheng Microelectronics.
+ *******************************************************************************/
+
+#include "CH58x_common.h"
+
+/*********************************************************************
+ * @fn SPI1_MasterDefInit
+ *
+ * @brief 主机模式默认初始化:模式0+3线全双工+8MHz
+ *
+ * @param none
+ *
+ * @return none
+ */
+void SPI1_MasterDefInit(void)
+{
+ R8_SPI1_CLOCK_DIV = 4; // 主频时钟4分频
+ R8_SPI1_CTRL_MOD = RB_SPI_ALL_CLEAR;
+ R8_SPI1_CTRL_MOD = RB_SPI1_SDO_OE | RB_SPI_SCK_OE;
+ R8_SPI1_CTRL_CFG |= RB_SPI_AUTO_IF; // 访问BUFFER/FIFO自动清除IF_BYTE_END标志
+}
+
+/*********************************************************************
+ * @fn SPI1_CLKCfg
+ *
+ * @brief SPI1 基准时钟配置,= d*Tsys
+ *
+ * @param c - 时钟分频系数
+ *
+ * @return none
+ */
+void SPI1_CLKCfg(uint8_t c)
+{
+ if(c == 2)
+ {
+ R8_SPI1_CTRL_CFG |= RB_SPI_MST_DLY_EN;
+ }
+ else
+ {
+ R8_SPI1_CTRL_CFG &= ~RB_SPI_MST_DLY_EN;
+ }
+ R8_SPI1_CLOCK_DIV = c;
+}
+
+/*********************************************************************
+ * @fn SPI1_DataMode
+ *
+ * @brief 设置数据流模式
+ *
+ * @param m - 数据流模式 refer to ModeBitOrderTypeDef
+ *
+ * @return none
+ */
+void SPI1_DataMode(ModeBitOrderTypeDef m)
+{
+ switch(m)
+ {
+ case Mode0_LowBitINFront:
+ R8_SPI1_CTRL_MOD &= ~RB_SPI_MST_SCK_MOD;
+ R8_SPI1_CTRL_CFG |= RB_SPI_BIT_ORDER;
+ break;
+ case Mode0_HighBitINFront:
+ R8_SPI1_CTRL_MOD &= ~RB_SPI_MST_SCK_MOD;
+ R8_SPI1_CTRL_CFG &= ~RB_SPI_BIT_ORDER;
+ break;
+ case Mode3_LowBitINFront:
+ R8_SPI1_CTRL_MOD |= RB_SPI_MST_SCK_MOD;
+ R8_SPI1_CTRL_CFG |= RB_SPI_BIT_ORDER;
+ break;
+ case Mode3_HighBitINFront:
+ R8_SPI1_CTRL_MOD |= RB_SPI_MST_SCK_MOD;
+ R8_SPI1_CTRL_CFG &= ~RB_SPI_BIT_ORDER;
+ break;
+ default:
+ break;
+ }
+}
+
+/*********************************************************************
+ * @fn SPI1_MasterSendByte
+ *
+ * @brief 发送单字节 (buffer)
+ *
+ * @param d - 发送字节
+ *
+ * @return none
+ */
+void SPI1_MasterSendByte(uint8_t d)
+{
+ R8_SPI1_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
+ R8_SPI1_BUFFER = d;
+ while(!(R8_SPI1_INT_FLAG & RB_SPI_FREE));
+}
+
+/*********************************************************************
+ * @fn SPI1_MasterRecvByte
+ *
+ * @brief 接收单字节 (buffer)
+ *
+ * @param none
+ *
+ * @return 接收到的字节
+ */
+uint8_t SPI1_MasterRecvByte(void)
+{
+ R8_SPI1_CTRL_MOD &= ~RB_SPI_FIFO_DIR;
+ R8_SPI1_BUFFER = 0xFF; // 启动传输
+ while(!(R8_SPI1_INT_FLAG & RB_SPI_FREE));
+ return (R8_SPI1_BUFFER);
+}
+
+/*********************************************************************
+ * @fn SPI1_MasterTrans
+ *
+ * @brief 使用FIFO连续发送多字节
+ *
+ * @param pbuf - 待发送的数据内容首地址
+ * @param len - 请求发送的数据长度,最大4095
+ *
+ * @return none
+ */
+void SPI1_MasterTrans(uint8_t *pbuf, uint16_t len)
+{
+ uint16_t sendlen;
+
+ sendlen = len;
+ R8_SPI1_CTRL_MOD &= ~RB_SPI_FIFO_DIR; // 设置数据方向为输出
+ R16_SPI1_TOTAL_CNT = sendlen; // 设置要发送的数据长度
+ R8_SPI1_INT_FLAG = RB_SPI_IF_CNT_END;
+ while(sendlen)
+ {
+ if(R8_SPI1_FIFO_COUNT < SPI_FIFO_SIZE)
+ {
+ R8_SPI1_FIFO = *pbuf;
+ pbuf++;
+ sendlen--;
+ }
+ }
+ while(R8_SPI1_FIFO_COUNT != 0); // 等待FIFO中的数据全部发送完成
+}
+
+/*********************************************************************
+ * @fn SPI1_MasterRecv
+ *
+ * @brief 使用FIFO连续接收多字节
+ *
+ * @param pbuf - 待接收的数据首地址
+ * @param len - 待接收的数据长度,最大4095
+ *
+ * @return none
+ */
+void SPI1_MasterRecv(uint8_t *pbuf, uint16_t len)
+{
+ uint16_t readlen;
+
+ readlen = len;
+ R8_SPI1_CTRL_MOD |= RB_SPI_FIFO_DIR; // 设置数据方向为输入
+ R16_SPI1_TOTAL_CNT = len; // 设置需要接收的数据长度,FIFO方向为输入长度不为0则会启动传输 */
+ R8_SPI1_INT_FLAG = RB_SPI_IF_CNT_END;
+ while(readlen)
+ {
+ if(R8_SPI1_FIFO_COUNT)
+ {
+ *pbuf = R8_SPI1_FIFO;
+ pbuf++;
+ readlen--;
+ }
+ }
+}
|