⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi_unit.c

📁 USBUSB开发资料类
💻 C
字号:
//============================================================================================================
//
//
//	本单元的功能描述:
//
//			实现	通过UART1	传输数据的功能。
//
//
//	输出函数列表:
//
//			UART1_Init		初始化
//			UART1_Send		发送数据
//===========================================================================================================
//	日期	|	动作	|   	单位       	|	描述	  |联系方式
//===========================================================================================================
//2008-07-28|	创建 	|	 西安达泰电子  	|	创建文件  |029-85272421  http://www.dataie.com
//============================================================================================================

//============================================================================================================
//		引入头文件
//============================================================================================================
//#include	<LPC23xx.h>                        /* LPC23xx definitions */

#include	"Config.h"
#include	"IRQ_Unit.h"
#include	"SPI_unit.h"

//============================================================================================================
//定义一些常量
BYTE*	vSPI_RD_pData;
WORD	vSPI_ReadLength;
WORD	vSPI_ReadCounter;
DWORD	vSPI_FirstData;
//============================================================================================================



//============================================================================================================
//************************************************************************************************************
//*
//*
//*			开始定义	处理UART中断、实施数据传输的	函数。
//*
//*
//************************************************************************************************************
//============================================================================================================
//函数名:		SPI_Handler
//
//调用关系:	被	硬件中断	调用。
//
//功能描述:	SPI1的中断处理程序。
//
//入口参数:	无。
//
//返回值:		无。
//============================================================================================================
void SPI_Handler (void) __irq 
{
	WORD	IntCond;
	volatile	BYTE Dummy;

	IntCond	=	SSPMIS;
	if ( IntCond & SSPMIS_RORMIS )	/* Receive overrun interrupt */
	{
		SSPICR = SSPICR_RORIC;		/* clear interrupt */
	}
	if ( IntCond & SSPMIS_RTMIS )	/* Receive timeout interrupt */
	{
		SSPICR = SSPICR_RTIC;		/* clear interrupt */
	}

    VICVectAddr = 0;		// Acknowledge Interrupt
}
//============================================================================================================
//************************************************************************************************************
//*
//*
//*			开始定义	本单元的外部接口函数	函数。
//*
//*
//************************************************************************************************************
//============================================================================================================
//函数名:		SPI_Init
//
//调用关系:	被	外部函数	函数调用。
//
//功能描述:	SPI1的初始化程序。
//
//入口参数:	无
//
//返回值:		无。
//============================================================================================================
BOOL	SPI_Init( void )
{

	PINSEL0	|=	0x20000000;       /* SCK1 */
	PINSEL1	|=	0x00000540;       /* SSEL1,MOSI1,MOSI1 */

	vSPI_ReadCounter	=	0;
	
	// enable clock to SSP1 for security reason. By default, it's enabled already
	PCONP	|=	(1 << 10);

	//Set DSS data to 8-bit, Frame format SPI, CPOL = 0, CPHA = 0, and SCR is 15
	SSPCR0	=	0x0107;

	// SSPCPSR clock prescale register, minimum divisor is 0x02 in master mode
	SSPCPSR	=	0x4;

	//IRQ_SetInt( cIRQ_SPI1, 1, (DWORD)SPI_Handler );
	
	// Device select as master, SSP Enabled
	SSPCR1	=	SSPCR1_SSE;
	//* Set SSPINMS registers to enable interrupts */
	//* enable all error related interrupts */
	SSPIMSC	=	0;//SSPIMSC_RORIM | SSPIMSC_RTIM;

	return	TRUE;
}
//============================================================================================================
//函数名:		SPI_Send
//
//调用关系:	被	外部函数	函数调用。
//
//功能描述:	设置发送数据缓冲区的指针,然后,填写第一次的THR,以后的数据都在中断服务程序中被填写到THR、发送。
//
//入口参数:	pBufStart	发送缓冲区的起始位置。
//				DataLength	需要发送的数据长度。
//
//返回值:		无。
//============================================================================================================
BOOL	SPI_Send(void*	pBufStart,	DWORD	DataLength)
{
	BYTE*	pData;

	pData	=	pBufStart;
	while	(DataLength)
	{
		if	(SSPSR	&	SSPSR_TNF)
		{
			SSPDR	=	*pData;
			pData++;
			DataLength--;
		}
	}
	return	TRUE;
}
//============================================================================================================
//函数名:		SPI_CanSendNextPacket
//
//调用关系:	被	外部函数	函数调用。
//
//功能描述:	查询是否可以发送下一个数据包。
//
//入口参数:	无
//
//返回值:		如果写指针等于发送数据传冲区结束位置,则返回真;否则返回假。
//============================================================================================================
BOOL	SPI_CanSendNextPacket(void)
{
	return	TRUE;
}
//============================================================================================================
//函数名:		SPI_StartRead
//
//调用关系:	被	外部函数	函数调用。
//
//功能描述:	启动读数据过程。
//
//入口参数:	pBufStart	发送缓冲区的起始位置。
//				DataLength	需要接收的数据长度。
//
//返回值:		无。
//============================================================================================================
void	SPI_StartRead(void*	pBufStart,	DWORD	DataLength,	DWORD	FirstData)
{
	vSPI_RD_pData	=	pBufStart;
	vSPI_ReadLength	=	DataLength;
	vSPI_ReadCounter	=	0;
	vSPI_FirstData	=	FirstData;
	
	while	(SSPSR	&	SSPSR_RNE)
	{
		*vSPI_RD_pData	=	SSPDR;
	}
}
//============================================================================================================
//函数名:		SPI_GetReadCounter
//
//调用关系:	被	外部函数	函数调用。
//
//功能描述:	查询读了多少个数据。
//
//入口参数:	无
//
//返回值:		读了多少个数据。
//============================================================================================================
DWORD	SPI_GetReadCounter(void)
{
	DWORD	i;

	for	(i=0;	i<4;	i++)
	{
		SSPDR	=	0xFFFF;
	}

	while	((SSPSR	&	SSPSR_RNE)	&&	(vSPI_ReadCounter	<	vSPI_ReadLength))
	{
		*vSPI_RD_pData	=	SSPDR;
		if	((vSPI_ReadCounter	==	0)	&&	(*vSPI_RD_pData	!=	vSPI_FirstData))
		{
			if	(*vSPI_RD_pData	!=	0x34)
			{
				*vSPI_RD_pData	=	vSPI_FirstData;
			}
			continue;
		}
		vSPI_ReadCounter++;
		vSPI_RD_pData++;
	}
	return	vSPI_ReadCounter;
}
//============================================================================================================
//函数名:		SPI_CancelRead
//
//调用关系:	被	外部函数	函数调用。
//
//功能描述:	终止读数据过程。
//
//入口参数:	无
//
//返回值:		无。
//============================================================================================================
void	SPI_CancelRead(void)
{
	vSPI_ReadCounter	=	0;
	vSPI_ReadLength		=	0;
}
//============================================================================================================




//============================================================================================================
//
//			End	of	File
//
//============================================================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -