142 lines
5.1 KiB
C
142 lines
5.1 KiB
C
/********************************** (C) COPYRIGHT *******************************
|
|
* File Name : ch564_spi.h
|
|
* Author : WCH
|
|
* Version : V1.0.0
|
|
* Date : 2024/05/05
|
|
* Description : This file contains all the functions prototypes for the
|
|
* SPI firmware library.
|
|
*********************************************************************************
|
|
* 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.
|
|
*******************************************************************************/
|
|
#ifndef __CH564_SPI_H
|
|
#define __CH564_SPI_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
#include "ch564.h"
|
|
|
|
/**
|
|
* @brief SPI0 interrupt bit define
|
|
*/
|
|
#define SPI0_IT_FST_BYTE RB_SPI_IE_FST_BYTE
|
|
#define SPI0_IT_FIFO_OV RB_SPI_IE_FIFO_OV
|
|
#define SPI0_IT_DMA_END RB_SPI_IE_DMA_END
|
|
#define SPI0_IT_FIFO_HF RB_SPI_IE_FIFO_HF
|
|
#define SPI0_IT_BYTE_END RB_SPI_IE_BYTE_END
|
|
#define SPI0_IT_CNT_END RB_SPI_IE_CNT_END
|
|
|
|
#define SPI_MAX_DELAY 0xffff
|
|
|
|
/**
|
|
* @brief Configuration data mode
|
|
*/
|
|
typedef enum
|
|
{
|
|
Mode0_HighBitINFront,
|
|
Mode3_HighBitINFront,
|
|
} ModeBitOrderTypeDef;
|
|
|
|
/**
|
|
* @brief Configuration SPI slave mode
|
|
*/
|
|
typedef enum
|
|
{
|
|
Mode_DataStream = 0,
|
|
Mose_FirstCmd,
|
|
} Slave_ModeTypeDef;
|
|
|
|
/**************** SPI0 */
|
|
void SPI0_MasterInit(uint32_t clockRate);
|
|
void SPI0_DataMode(ModeBitOrderTypeDef mode);
|
|
|
|
void SPI0_MasterSendByte(uint8_t data);
|
|
uint8_t SPI0_MasterRecvByte(void);
|
|
|
|
void SPI0_MasterTrans(uint8_t *pbuf, uint16_t len);
|
|
void SPI0_MasterRecv(uint8_t *pbuf, uint16_t len);
|
|
|
|
void SPI0_DMATrans(uint8_t *pbuf, uint32_t len);
|
|
void SPI0_DMARecv(uint8_t *pbuf, uint32_t len);
|
|
void SPI0_MasterTransRecv(uint8_t *ptbuf, uint8_t *prbuf, uint16_t len);
|
|
|
|
void SPI0_SlaveInit();
|
|
#define SetFirst0Data(data) (R8_SPI0_SLAVE_PRE = (data))
|
|
void SPI0_SlaveSendByte(uint8_t data);
|
|
uint8_t SPI0_SlaveRecvByte(void);
|
|
|
|
uint8_t SPI0_SlaveTrans(uint8_t *pbuf, uint16_t len,uint16_t timeouts);
|
|
uint8_t SPI0_SlaveRecv(uint8_t *pbuf, uint16_t len,uint16_t timeouts);
|
|
|
|
// refer to SPI0 interrupt bit define
|
|
#define SPI0_MODE_CFG(cfglist, en) BITS_CFG(R8_SPI0_CTRL_MOD, cfglist, en)
|
|
#define SPI0_ITCfg(cfglist, en) BITS_CFG(R8_SPI0_INTER_EN, cfglist, en)
|
|
#define SPI0_SET_CLOCK_DIV(div) (R8_SPI0_CLOCK_DIV = (div))
|
|
#define SPI0_GetITFlag(f) (R8_SPI0_INT_FLAG & (f))
|
|
#define SPI0_ClearITFlag(f) (R8_SPI0_INT_FLAG = (f))
|
|
#define SPI0_SET_RST(dat) (R8_SPI0_RESET_CMD = (dat))
|
|
#define SPI0_GET_RST() (R8_SPI0_RESET_CMD)
|
|
#define SPI0_GET_BUSY() (R8_SPI0_BUSY)
|
|
#define SPI0_GET_BUFFER() (R8_SPI0_BUFFER)
|
|
#define SPI0_SET_BUFFER(dat) (R8_SPI0_BUFFER = (dat))
|
|
#define SPI0_CLEAR_FIFO() (R8_SPI0_CTRL_MOD |= RB_SPI_ALL_CLEAR);
|
|
#define SPI0_GET_FIFO() (R8_SPI0_FIFO)
|
|
#define SPI0_SET_FIFO(dat) (R8_SPI0_FIFO = (dat))
|
|
#define SPI0_SET_FIFO_CNT(cnt) (R8_SPI0_FIFO_COUNT = (cnt))
|
|
#define SPI0_GET_FIFO_CNT() (R8_SPI0_FIFO_COUNT)
|
|
#define SPI0_SET_TOTAL_CNT(cnt) (R16_SPI0_TOTAL_CNT = (cnt) )
|
|
#define SPI0_GET_TOTAL_CNT() (R16_SPI0_TOTAL_CNT)
|
|
|
|
#define SPI0_SET_DMA_MODE(cfglist, en) BITS_CFG(R8_SPI0_CTRL_DMA, cfglist, en)
|
|
#define SPI0_SET_DMA_RANGE(start, end) \
|
|
({ \
|
|
R32_SPI0_DMA_BEG = (uint32_t)(start) & MASK_SPI0_DMA_ADDR; \
|
|
R32_SPI0_DMA_END = (uint32_t)(end) & MASK_SPI0_DMA_ADDR; \
|
|
})
|
|
|
|
/**************** SPI1 */
|
|
void SPI1_MasterInit(uint32_t clockRate);
|
|
void SPI1_DataMode(ModeBitOrderTypeDef mode);
|
|
|
|
void SPI1_MasterSendByte(uint8_t data);
|
|
uint8_t SPI1_MasterRecvByte(void);
|
|
|
|
void SPI1_MasterTrans(uint8_t *pbuf, uint16_t len);
|
|
void SPI1_MasterRecv(uint8_t *pbuf, uint16_t len);
|
|
|
|
void SPI1_SlaveInit();
|
|
#define SetFirst1Data(data) (R8_SPI1_SLAVE_PRE = (data))
|
|
void SPI1_SlaveSendByte(uint8_t data);
|
|
uint8_t SPI1_SlaveRecvByte(void);
|
|
|
|
uint8_t SPI1_SlaveTrans(uint8_t *pbuf, uint16_t len,uint16_t timeouts);
|
|
uint8_t SPI1_SlaveRecv(uint8_t *pbuf, uint16_t len,uint16_t timeouts);
|
|
|
|
// refer to SPI1 interrupt bit define
|
|
#define SPI1_MODE_CFG(cfglist, en) BITS_CFG(R8_SPI1_CTRL_MOD, cfglist, en)
|
|
#define SPI1_ITCfg(cfglist, en) BITS_CFG(R8_SPI1_INTER_EN, cfglist, en)
|
|
#define SPI1_SET_CLOCK_DIV(div) (R8_SPI1_CLOCK_DIV = (div))
|
|
#define SPI1_GetITFlag(f) (R8_SPI1_INT_FLAG & (f))
|
|
#define SPI1_ClearITFlag(f) (R8_SPI1_INT_FLAG = (f))
|
|
#define SPI1_GET_BUFFER() (R8_SPI1_BUFFER)
|
|
#define SPI1_SET_BUFFER(dat) (R8_SPI1_BUFFER = (dat))
|
|
#define SPI1_CLEAR_FIFO() (R8_SPI1_CTRL_MOD |= RB_SPI_ALL_CLEAR);
|
|
#define SPI1_GET_FIFO() (R8_SPI1_FIFO)
|
|
#define SPI1_SET_FIFO(dat) (R8_SPI1_FIFO = (dat))
|
|
#define SPI1_SET_FIFO_CNT(cnt) (R8_SPI1_FIFO_COUNT = (cnt))
|
|
#define SPI1_GET_FIFO_CNT() (R8_SPI1_FIFO_COUNT)
|
|
#define SPI1_SET_TOTAL_CNT(cnt) (R16_SPI1_TOTAL_CNT = (cnt))
|
|
#define SPI1_GET_TOTAL_CNT() (R16_SPI1_TOTAL_CNT)
|
|
|
|
#define SPI1_SET_DMA_MODE(cfglist, en) BITS_CFG(R8_SPI1_CTRL_DMA, (cfglist), (en))
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|