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

📄 spi.c

📁 一个基于PIC18F单片机的开发的流量计量仪表
💻 C
字号:
//********************************************* FM1702.c ***************************************//
//Hardware Connect:
//                                   MCU --------------- FM1702
//                  			  HQCCLK <-------------> SCK    13
//                                 HQCDI <-------------> MISO   12
//                                 HQCDO <-------------> MOSI   14
//                                HQCRST <-------------> RSTPD  23
//		                           HQCMN <-------------> NSS	15	
//
//										▅▄▄〓〓▃▃▃▃▃▃▄ 
//										◢◤—┛ 
//										Со∪итЁя- SтЯiΚе 
//**********************************************************************************************//
#include "p18f6720.h"	                 //PIC18F6720 Head File	
#include "PIC18F6720_IO.h"
#include "PIC18F6720_PERIPHERYDEVICE.h"
#include "delays.h"		                 //soft delay Head Flie
						                 //Delay1TCY();  delay one TCY
                                         		//Delay10TCYx(uchar t); (255~0)*10TCY 
						                 //.....100........ 
                                         		//.....1K.........
 					                 	//.....10K........
						                 //if uchar t = 0  that delay time = 2560000tCY

//*****************************************************************//
//Name 		:SpiRev
//Input		:void   
//Output	:unsigned char
//Function	:This function receive one 8bit byte from fm1702 spi port
//D.R.P		:HaoQiu
//Data		:06.06.09
//*****************************************************************//
//时钟由MCU提供,在每一个时钟的上升沿,MCU读RF-MISO上的电平,8BIT为一个字节
//先高位,后低位
unsigned char SpiRev()
{
	unsigned char iSR,jSR;
	unsigned char varr;
	HQCCLK=0;		
	varr=0;
	for (iSR=0;iSR<8;iSR++)    
		{   
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			HQCCLK=1;                 // 产生SCK脉冲
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			jSR=HQCDO;
			if(jSR)
			varr+=1;
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			HQCCLK=0;     
			varr<<=1;
			Delay1TCY();   
			Delay1TCY();
			Delay1TCY(); 
	 	}		
	return varr;                      // 返回	
} 

//*****************************************************************//
//Name 		:SpiSend
//Input		:unsigned char var  
//Output	:void
//Function	:This function sent one 8bit byte to fm1702 spi port
//D.R.P		:HaoQiu
//Data		:06.06.09
//*****************************************************************//
void SpiSend(unsigned char var) 
{ 
	unsigned char iSS,tem;
	for (iSS=0;iSS<8;iSS++)          		  // 8位字节输出
	{
		HQCCLK=0; 
		Delay1TCY();
		Delay1TCY();
		Delay1TCY();
		Delay1TCY();
	    tem=var&0x80;                 // 选择高位
		Delay1TCY();
		if (tem==0x80) 
			HQCDI=1;       // 输出高位
      	else 
			HQCDI=0;
		Delay1TCY();
		Delay1TCY();
		Delay1TCY();
		Delay1TCY();
		HQCCLK=1;                     // 使SCK为1,上升沿有效
		Delay1TCY();
		Delay1TCY();
		Delay1TCY();
		Delay1TCY();
		var<<=1;					  // 左移1位
		Delay1TCY();
		Delay1TCY();
		Delay1TCY();
		Delay1TCY();
		HQCCLK=0; 	                  // 使SCK为低电平						
	}         
	HQCDI=1;
}                  


//**********************************************************************//
//Name 		:SPIRead
//Input		:unsigned char SpiAddress:Fm1702 register address  
//Output	:unsigned char 
//Function	:This function read one byte from FM1702 in one address  
//D.R.P		:HaoQiu
//Data		:06.06.09
//**********************************************************************//
unsigned char SPIRead(unsigned char SpiAddress)
{
	unsigned char isrd,rdatasrd,tempsrd,tsrd=0;
	 
	rdatasrd=0;
	SpiAddress <<= 1 ; //LEFT ONE BIT
	SpiAddress=SpiAddress | 0x80;    //HIGHEST BIT SET 1 
	HQCCLK=0;
	HQCMN=0;
//Send SpiAddress;
	for (isrd=0;isrd<8;isrd++)
	{
		tempsrd=SpiAddress&0x80;
		if (tempsrd==0x80)	HQCDI=1;
		else HQCDI=0;
		HQCCLK=1;
		Delay1TCY();
		Delay1TCY();
		Delay1TCY();
		SpiAddress<<=1;
		HQCCLK=0;
	}
//Send SpiAddress;
//Receive data
		for (isrd=0;isrd<8;isrd++)
		{
			HQCCLK=1;
			rdatasrd<<=1;         //is here??
			tsrd=HQCDO;
			if (tsrd) rdatasrd+=1;
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			HQCCLK=0;
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
		}
	HQCMN=1;		
	return(rdatasrd);
}
//*****************************************************************//
//Name 		:SPIWrite
//Input		:unsigned char SpiAddress:Fm1702 register address 
//          :unsigned char dat       :what data for write 
//Output	:void 
//Function	:This function write one byte data to FM1702 in one address  
//D.R.P		:HaoQiu
//Data		:06.06.09
//*****************************************************************//
void SPIWrite(unsigned char SpiAddress,unsigned char SpiData)
{
	unsigned char ispw,kspw,tempspw,tspw=0;
	SpiAddress <<= 1;
	SpiAddress=SpiAddress &0x7e;
	HQCCLK=0;
	HQCMN=0; 
//Send SpiAddress
	for (ispw=0;ispw<8;ispw++)
	{
		tempspw=SpiAddress&0x80;
		if (tempspw==0x80)	HQCDI=1;
		else HQCDI=0;
		Delay1TCY();
		HQCCLK=1;
		SpiAddress<<=1;
		Delay1TCY();
		Delay1TCY();
		Delay1TCY();
		HQCCLK=0;
		Delay1TCY();
		Delay1TCY();
		Delay1TCY();
	}
//	Send data;
		for(kspw=0;kspw<8;kspw++)
		{
			tempspw=SpiData&0x80;
			Delay1TCY();
			if (tempspw==0x80)	HQCDI=1;
			else HQCDI=0;
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			HQCCLK=1;
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			SpiData<<=1;
			HQCCLK=0;
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
			Delay1TCY();
		}
	HQCMN=1;
	tspw=0;
}



⌨️ 快捷键说明

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