www.pudn.com > FM1702SL_Source.rar > spi.c, change:2005-07-15,size:1878b


 
#include <reg51.h>				//51寄存器定义头文件 
#include "main.h"				//主程序头文件 
#include "globe.h"				//全局变量定义头文件 
#include <absacc.h> 
#include <intrins.h> 
sbit	sck = P1 ^ 1; 
sbit	si = P1 ^ 2; 
sbit	so = P1 ^ 3;	 
sbit    spi_cs=P1 ^ 4; 
sbit	MFRST = P1 ^ 0; 
 
void delay1(uchar dlength) 
{  
  uchar i; 
  for (i=0;i<dlength;i++) 
  { 
       _nop_(); 
  } 
} 
 
unsigned char rev() 
{ 
	uchar idata i; 
	unsigned char idata var=0; 
	 
		var=0; 
		for (i=0;i<7;i++)          // 8位字节带进位左移 
		{  
			sck=1;                 // 产生SCK脉冲			 
			                       // SO移进位位 
			if (so==1) var+=1;         // 带进位左移 
			var=var*2; 
			 
			 
	 	} 
	 
	sck=1;	 
	 
	CY=so; 
	if (CY) var+=1;         // 判断是否结束*/ 
	sck=0; 
	return(var);          // 返回 
	 	 
}  
 
void Send(unsigned char var)  
 
{  
	unsigned char data i,tem; 
	 
	sck=0; 
	for (i=0;i<8;i++)          		// 8位字节输出 
	{ 
		                  // 使SCK为低电平 
		tem=var&0x80;            // 选择高位 
		if (tem==0x80) si=1;     // 输出高位 
      		else si=0; 
		sck=1;                   // 使SCK为1 
		var<<=1;	 
		delay1(1);	 
		sck=0; 							// 左移1位 
	}          
	si=0; 
	sck=0; 
}                   
 
uchar read_reg(uchar idata SpiAddress) 
{ 
		uchar idata rdata; 
		SpiAddress=SpiAddress<<1; 
		SpiAddress=SpiAddress | 0x80;  
		spi_cs=0;	 
		Send(SpiAddress); 
		rdata=rev(); 
		Send(0);			 
		spi_cs=1;		 
		return(rdata); 
 
} 
void write_reg(uchar idata SpiAddress,uchar dat) 
{ 
		SpiAddress=SpiAddress<<1; 
		SpiAddress=SpiAddress &0x7f; 
		spi_cs=0;  
		so=0; 
		Send(SpiAddress);		 
		Send(dat);	 
		spi_cs=1; 
} 
 
void Init_RC531(void) 
{	 
	  uchar	idata  temp; 
	  uint	i; 
		 
	  MFRST = 1;					//RC531复位 
	  for (i = 0; i < 0x1fff; i++) 
	  { 
	    _nop_(); 
	  } 
	  MFRST = 0; 
	  for (i = 0; i < 0x1fff; i++) 
	  { 
	    _nop_(); 
	  } 
}