212 lines
7.8 KiB
C
212 lines
7.8 KiB
C
|
|
/*
|
|||
|
|
******************************************************************************
|
|||
|
|
* @file apt32f102_spi.c
|
|||
|
|
* @author APT AE Team
|
|||
|
|
* @version V1.10
|
|||
|
|
* @date 2021/08/25
|
|||
|
|
******************************************************************************
|
|||
|
|
*THIS SOFTWARE WHICH IS FOR ILLUSTRATIVE PURPOSES ONLY WHICH PROVIDES
|
|||
|
|
*CUSTOMER WITH CODING INFORMATION REGARDING THEIR PRODUCTS.
|
|||
|
|
*APT CHIP SHALL NOT BE HELD RESPONSIBILITY ADN LIABILITY FOR ANY DIRECT,
|
|||
|
|
*INDIRECT DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF
|
|||
|
|
*SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION
|
|||
|
|
*CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.AND APT CHIP RESERVES
|
|||
|
|
*THE RIGHT TO MAKE CHANGES IN THE SOFTWARE WITHOUT NOTIFICATION
|
|||
|
|
******************************************************************************
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
|||
|
|
#include "apt32f102_spi.h"
|
|||
|
|
/* defines -------------------------------------------------------------------*/
|
|||
|
|
|
|||
|
|
/* -------- variables ---------------------------------------------------------*/
|
|||
|
|
|
|||
|
|
/* externs--------------------------------------------------------------------*/
|
|||
|
|
extern void delay_nus(unsigned int t);
|
|||
|
|
/*************************************************************/
|
|||
|
|
//SPI RESET,CLEAR ALL REGISTER
|
|||
|
|
//EntryParameter:NONE
|
|||
|
|
//ReturnValue:NONE
|
|||
|
|
/*************************************************************/
|
|||
|
|
void SPI_DeInit(void)
|
|||
|
|
{
|
|||
|
|
SPI0->CR0 = SPI_CR0_RST;
|
|||
|
|
SPI0->CR1 = SPI_CR1_RST;
|
|||
|
|
//SPI0->DR = SPI_DR_RST;
|
|||
|
|
SPI0->SR = SPI_SR_RST;
|
|||
|
|
SPI0->CPSR = SPI_CPSR_RST;
|
|||
|
|
SPI0->IMSCR = SPI_IMSCR_RST;
|
|||
|
|
SPI0->RISR = SPI_RISR_RST;
|
|||
|
|
SPI0->MISR = SPI_MISR_RST;
|
|||
|
|
SPI0->ICR = SPI_ICR_RST;
|
|||
|
|
}
|
|||
|
|
/*************************************************************/
|
|||
|
|
//SPI NSS IO Initial
|
|||
|
|
//ReturnValue:NONE
|
|||
|
|
/*************************************************************/
|
|||
|
|
void SPI_NSS_IO_Init(U8_T SPI_NSS_IO_GROUP)
|
|||
|
|
{
|
|||
|
|
if(SPI_NSS_IO_GROUP==0)
|
|||
|
|
{
|
|||
|
|
GPIOA0->CONLR = (GPIOA0->CONLR&0XF0FFFFFF) | 0x05000000; //PA0.6
|
|||
|
|
}
|
|||
|
|
else if(SPI_NSS_IO_GROUP==1)
|
|||
|
|
{
|
|||
|
|
GPIOB0->CONLR = (GPIOB0->CONLR&0XFF0FFFFF) | 0x00800000; //PB0.5
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/*************************************************************/
|
|||
|
|
//SPI Master Init
|
|||
|
|
//EntryParameter:SPI_IO,SPI_DATA_SIZE_x,SPI_SPO_X,SPI_SPH_X,SPI_LBM_X,SPI_SCR,SPI_CPSDVSR
|
|||
|
|
//SPI_IO:SPI_G0,SPI_G1,SPI_G2
|
|||
|
|
//SPI_DATA_SIZE_x:SPI_DATA_SIZE_4BIT~SPI_DATA_SIZE_16BIT
|
|||
|
|
//SPI_SPO_X:SPI_SPO_0,SPI_SPO_1
|
|||
|
|
//SPI_SPH_X:SPI_SPH_0,SPI_SPH_1
|
|||
|
|
//SPI_LBM_X:SPI_LBM_0,SPI_LBM_1
|
|||
|
|
//SPI_RXIFLSEL_X:SPI_RXIFLSEL_1_8,SPI_RXIFLSEL_1_4,SPI_RXIFLSEL_1_2
|
|||
|
|
//SPI_SCR:0~255
|
|||
|
|
//SPI_CPSDVSR:2~254,Must be an even number between 2 and 254
|
|||
|
|
//ReturnValue:NONE
|
|||
|
|
/*************************************************************/
|
|||
|
|
//SPI Baud rate:FSSPCLK = FPCLK / (CPSDVR × (1 + SCR))
|
|||
|
|
//FPCLK (max) → 2 × FSSPCLKOUT (max) master Fastest speed
|
|||
|
|
void SPI_Master_Init(SPI_IO_TypeDef SPI_IO , SPI_DATA_SIZE_TypeDef SPI_DATA_SIZE_x , SPI_SPO_TypeDef SPI_SPO_X , SPI_SPH_TypeDef SPI_SPH_X , SPI_LBM_TypeDef SPI_LBM_X , SPI_RXIFLSEL_TypeDef SPI_RXIFLSEL_X , U8_T SPI_SCR , U8_T SPI_CPSDVSR )
|
|||
|
|
{
|
|||
|
|
if (SPI_IO==SPI_G0)
|
|||
|
|
{
|
|||
|
|
GPIOB0->CONLR = (GPIOB0->CONLR&0XFFFF00FF) | 0x00008800;
|
|||
|
|
GPIOA0->CONHR = (GPIOA0->CONHR&0XFFFFFFF0) | 0x00000008; //PB0.2->SPI_SCK,PB0.3->SPI_MOSI,PA0.8->SPI_MIS0
|
|||
|
|
}
|
|||
|
|
else if(SPI_IO==SPI_G1)
|
|||
|
|
{
|
|||
|
|
GPIOA0->CONHR = (GPIOA0->CONHR&0XFFFF000F) | 0x00004440; //PA0.9->SPI_SCK,PA0.10->SPI_MOSI,PA0.11->SPI_MIS0
|
|||
|
|
}
|
|||
|
|
else if(SPI_IO==SPI_G2)
|
|||
|
|
{
|
|||
|
|
GPIOB0->CONLR = (GPIOB0->CONLR&0XFFF0FFFF) | 0x00080000; //SPI_SCK->PB0.4
|
|||
|
|
GPIOA0->CONHR = (GPIOA0->CONHR&0X00FFFFFF) | 0x88000000; //SPI_MOSI->PA0.14,SPI_MISO->PA0.15
|
|||
|
|
}
|
|||
|
|
SPI0->CPSR=SPI_CPSDVSR;
|
|||
|
|
|
|||
|
|
SPI0->CR0|=SPI_DATA_SIZE_x|(SPI_SPO_X<<6)|(SPI_SPH_X<<7)|(SPI_SCR<<8);
|
|||
|
|
SPI0->CR1|=0X02|SPI_LBM_X|(SPI_RXIFLSEL_X<<4);
|
|||
|
|
}
|
|||
|
|
/*************************************************************/
|
|||
|
|
//SPI Slave Init
|
|||
|
|
//EntryParameter:SPI_IO,SPI_DATA_SIZE_x,SPI_RXIFLSEL_X,SPI_SCR,SPI_CPSDVSR
|
|||
|
|
//SPI_DATA_SIZE_x:SPI_DATA_SIZE_4BIT~SPI_DATA_SIZE_16BIT
|
|||
|
|
//SPI_RXIFLSEL_X:SPI_RXIFLSEL_1_8,SPI_RXIFLSEL_1_4,SPI_RXIFLSEL_1_2
|
|||
|
|
//SPI_SCR:0~255
|
|||
|
|
//SPI_CPSDVSR:2~254,Must be an even number between 2 and 254
|
|||
|
|
//ReturnValue:NONE
|
|||
|
|
/*************************************************************/
|
|||
|
|
//SPI波特率:FSSPCLK = FPCLK / (CPSDVR × (1 + SCR))
|
|||
|
|
//FPCLK (max) → 12 × FSSPCLKIN (max) slave Fastest speed
|
|||
|
|
void SPI_Slave_Init(SPI_IO_TypeDef SPI_IO , SPI_DATA_SIZE_TypeDef SPI_DATA_SIZE_x , SPI_SPH_TypeDef SPI_SPH_X , SPI_RXIFLSEL_TypeDef SPI_RXIFLSEL_X , U8_T SPI_SCR , U8_T SPI_CPSDVSR)
|
|||
|
|
{
|
|||
|
|
if (SPI_IO==SPI_G0)
|
|||
|
|
{
|
|||
|
|
GPIOB0->CONLR = (GPIOB0->CONLR&0XFFFF00FF) | 0x00008800;
|
|||
|
|
GPIOA0->CONHR = (GPIOA0->CONHR&0XFFFFFFF0) | 0x00000008; //PB0.2->SPI_SCK,PB0.3->SPI_MISO,PA0.8->SPI_MOSI
|
|||
|
|
}
|
|||
|
|
else if(SPI_IO==SPI_G1)
|
|||
|
|
{
|
|||
|
|
GPIOA0->CONHR = (GPIOA0->CONHR&0XFFFF000F) | 0x00004440; //PA0.9->SPI_SCK,PA0.10->SPI_MISO,PA0.11->SPI_MOSI
|
|||
|
|
}
|
|||
|
|
else if(SPI_IO==SPI_G2)
|
|||
|
|
{
|
|||
|
|
GPIOB0->CONLR = (GPIOB0->CONLR&0XFFF0FFFF) | 0x00080000; //SPI_SCK->PB0.4
|
|||
|
|
GPIOA0->CONHR = (GPIOA0->CONHR&0X00FFFFFF) | 0x88000000; //SPI_MOSI->PA0.14,SPI_MISO->PA0.15
|
|||
|
|
}
|
|||
|
|
SPI0->CR0|=SPI_DATA_SIZE_x|(SPI_SPH_X<<7)|(SPI_SCR<<8);
|
|||
|
|
SPI0->CPSR=SPI_CPSDVSR;
|
|||
|
|
SPI0->CR1|=0X06|(SPI_RXIFLSEL_X<<4);
|
|||
|
|
}
|
|||
|
|
/*************************************************************/
|
|||
|
|
//SPI WRITE BYTE
|
|||
|
|
//EntryParameter:NONE
|
|||
|
|
//ReturnValue:NONE
|
|||
|
|
/*************************************************************/
|
|||
|
|
void SPI_WRITE_BYTE(U16_T wdata)
|
|||
|
|
{
|
|||
|
|
while(((SPI0->SR) & SSP_TNF) != SSP_TNF);
|
|||
|
|
SPI0->DR = wdata;
|
|||
|
|
while(((SPI0->SR) & SSP_BSY) == SSP_BSY); //wait for transmition finish
|
|||
|
|
}
|
|||
|
|
/*************************************************************/
|
|||
|
|
//SPI READ BYTE
|
|||
|
|
//EntryParameter:NONE
|
|||
|
|
//ReturnValue:NONE
|
|||
|
|
/*************************************************************/
|
|||
|
|
void SPI_READ_BYTE(U16_T wdata , volatile U16_T *rdata , U8_T Longth)
|
|||
|
|
{
|
|||
|
|
U8_T i;
|
|||
|
|
while(((SPI0->SR) & SSP_TNF) != SSP_TNF); //Transmit FIFO is not full?
|
|||
|
|
SPI0->DR = wdata;
|
|||
|
|
while(((SPI0->SR) & SSP_BSY) == SSP_BSY); //Send or receive over?
|
|||
|
|
delay_nus(1);
|
|||
|
|
*rdata = SPI0->DR;
|
|||
|
|
for(i=0;i<Longth;i++)
|
|||
|
|
{
|
|||
|
|
while(((SPI0->SR) & SSP_TNF) != SSP_TNF);
|
|||
|
|
SPI0->DR=0;
|
|||
|
|
while(((SPI0->SR) & SSP_BSY) == SSP_BSY);
|
|||
|
|
*(rdata+i) = SPI0->DR; //get data from FIFO
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/*************************************************************/
|
|||
|
|
//SPI inturrpt Configure
|
|||
|
|
//EntryParameter:SPI_IMSCR_X,NewState
|
|||
|
|
//SPI_IMSCR_X:SPI_PORIM,SPI_RTIM,SPI_RXIM,SPI_TXIM
|
|||
|
|
//NewState:ENABLE,DISABLE
|
|||
|
|
//ReturnValue:NONE
|
|||
|
|
/*************************************************************/
|
|||
|
|
void SPI_ConfigInterrupt_CMD(FunctionalStatus NewState,SPI_IMSCR_TypeDef SPI_IMSCR_X)
|
|||
|
|
{
|
|||
|
|
if (NewState != DISABLE)
|
|||
|
|
{
|
|||
|
|
SPI0->IMSCR |= SPI_IMSCR_X; //SET
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
SPI0->IMSCR &= ~SPI_IMSCR_X; //CLR
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/*************************************************************/
|
|||
|
|
//SPI Interrupt enable
|
|||
|
|
//EntryParameter:NONE
|
|||
|
|
//ReturnValue:NONE
|
|||
|
|
/*************************************************************/
|
|||
|
|
void SPI_Int_Enable(void)
|
|||
|
|
{
|
|||
|
|
INTC_ISER_WRITE(SPI_INT);
|
|||
|
|
}
|
|||
|
|
/*************************************************************/
|
|||
|
|
//SPI Interrupt disalbe
|
|||
|
|
//EntryParameter:NONE
|
|||
|
|
//ReturnValue:NONE
|
|||
|
|
/*************************************************************/
|
|||
|
|
void SPI_Int_Disable(void)
|
|||
|
|
{
|
|||
|
|
INTC_ICER_WRITE(SPI_INT);
|
|||
|
|
}
|
|||
|
|
/*************************************************************/
|
|||
|
|
//SPI Interrupt wake up enable
|
|||
|
|
//EntryParameter:NONE
|
|||
|
|
//ReturnValue:NONE
|
|||
|
|
/*************************************************************/
|
|||
|
|
void SPI_Wakeup_Enable(void)
|
|||
|
|
{
|
|||
|
|
INTC_IWER_WRITE(SPI_INT);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*************************************************************/
|
|||
|
|
//SPI Interrupt wake up disalbe
|
|||
|
|
//EntryParameter:NONE
|
|||
|
|
//ReturnValue:NONE
|
|||
|
|
/*************************************************************/
|
|||
|
|
void SPI_Wakeup_Disable(void)
|
|||
|
|
{
|
|||
|
|
INTC_IWDR_WRITE(SPI_INT);
|
|||
|
|
}
|
|||
|
|
/******************* (C) COPYRIGHT 2018 APT Chip *****END OF FILE****/
|