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

📄 spi.c

📁 ZIGBEE 2006协议栈 BAT测试代码 RADIO PULSE MG2455
💻 C
字号:


/*******************************************************************************
	- Chip		: MG24500/55
	- Author		: RadioPulse Inc, 2007.
	- Date		: 2007-07-02
	- Version		: VER 1.0	
*******************************************************************************/

#include "INCLUDE_TOP.h"

#define	SPI_CSN		P3_7
#define	SPI_CLK		P3_6
#define	SPI_DO		P3_5
#define	SPI_DI		P3_4


//-- Mode
// bit[4] : 1=Master
// bit[3] : CPOL, 1=SCK default high, 0=SCK default low
// bit[2] : CPHA, bit transition timing
//		  If CPOL=0, 0=falling edge, 1=rising edge
//		  If CPOL=1, 0=rising edge, 1=falling edge


//-- Speed
//			@8MHz System Clock	@16MHz System Clock
//	0	: 	1000	KHz			2000 	KHz
//	1	: 	500 		KHz			1000 	KHz
//	2	: 	250 		KHz			500 		KHz
//	3	: 	125 		KHz			250 		KHz
//	4	: 	62.5 	KHz			125 		KHz
//	5	: 	31.2 	KHz			62.5 	KHz
//	6	: 	15.6 	KHz			31.2 	KHz
//	7	: 	7.8 		KHz			15.6 	KHz
//	8	: 	3.9 		KHz			7.8 		KHz
//	9	: 	1.9 		KHz			3.9 		KHz

void ZHAL_SPI_SET(UINT8 Ena, UINT8 Mode, UINT8 Speed)
{
	UINT8	Div;

	if(Speed == 1)		Div = 0x05;
	else if(Speed == 2)	Div = 0x03;
	else if(Speed == 3)	Div = 0x04;
	else if(Speed > 9)	Div = 0x0B;
	else					Div = Speed + 2;

	xSPCR = 0x00;
	xSPER = 0x00;

	xSPCR |= Div & 0x03 ;
	xSPER |= (Div & 0x0C) >> 2;	
	
	if(Ena)
	{
		if(Mode & 0x10)	// Master
		{
			SPI_DI = 1;		
			SPI_DO = (Mode & 0x08)? 1 : 0;
			SPI_CLK = (Mode & 0x08)? 1 : 0;
			SPI_CSN = 0;

			P3REN &= 0x0F;		// P3REN = 0000_xxxx
			P3REN |= 0xE0;		// P3REN = 111x_xxxx	--> P3REN = 1110_xxxx
			P3OEN |= 0xF0;		// P3OEN = 1111_xxxx
			P3OEN &= 0x1F;		// P3OEN = 000x_xxxx	--> P3OEN = 0001_xxxx
		}
		else		// Slave Mode
		{
			SPI_DI = 1;		
			SPI_DO = (Mode & 0x08)? 1 : 0;
			SPI_CLK = 1;
			SPI_CSN = 1;

			P3REN &= 0x0F;		// P3REN = 0000_xxxx
			P3REN |= 0x20;		// P3REN = xx1x_xxxx	--> P3REN = 0010_xxxx
			P3OEN |= 0xF0;		// P3OEN = 1111_xxxx
			P3OEN &= 0xDF;		// P3OEN = xx0x_xxxx	--> P3OEN = 1101_xxxx			
		}
	
		xSPCR |= (Mode & 0x3C) ;	
		xSPCR |= 0xC0;		// bit[7;6] = 2'b11, if bit[6] is 1 from 0, RD/WR pointer is reset		
		SPIIE = 1;

		if( (Mode & 0x10) == 0)	// Slave Mode
		{
			xSPDR = 0x55;		// 1st Dummy Write
		}		
		
	}
	else
	{	
		xSPCR = 0x00;
		SPIIE = 0;
	}
}


	extern	UINT8	INT_SPI;
	extern	UINT8	SPI_RD_DATA;

UINT8 ZHAL_SPI_MASTER(UINT8 SendByte)
{
	xSPDR = SendByte;
	while(!INT_SPI);
	INT_SPI = 0;
	return	SPI_RD_DATA;
}

// Return
//	1 : Received Data OK
// 	0 : No Received Data
UINT8 ZHAL_SPI_SLAVE(UINT8* pReceiveByte, UINT8 NextSendByte)
{
	if(INT_SPI)
	{
		*pReceiveByte = SPI_RD_DATA;
		INT_SPI = 0;
		xSPDR = NextSendByte;		// Dummy Write
		return	1;
	}
	else return	0;
}
		

⌨️ 快捷键说明

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