Files
RS485_T1_Transition/Source/FWlib/apt32f102_spi.c
yeyangwen 5a726f7378 feat:修改设备类型
feat:修改为红外转发设备,将中弘网关协议转换为主机红外协议
2026-02-09 17:48:39 +08:00

212 lines
7.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
******************************************************************************
* @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****/