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

📄 fm1702slspi.c

📁 C51读写fm1702sl SPI接口的读写程序 IO口模拟SPI接口
💻 C
📖 第 1 页 / 共 2 页
字号:

#include <reg51.h>				//51寄存器定义头文件
#include "main.h"				//主程序头文件
#include "globe.h"				//全局变量定义头文件
#include <absacc.h>
#include <intrins.h>
sbit	sck = P1 ^ 1; 				//接FM1702SL的SCK
sbit	si  = P1 ^ 2;				//接FM1702SL的MOSI
sbit	so  = P1 ^ 3;				//接FM1702SL的MISO
sbit    spi_cs=P1 ^ 4; 				//接FM1702SL的NSS
sbit	MFRST = P1 ^ 0;				//接FM1702SL的RSTPD

/****************************************************************/
/*名称: SPI_Init                                                */
/*功能: 该函数实现对FM1702SL SPI总线方式的选择       		*/ 
/*								*/
/*输入:                                                         */
/*      N/A                                                     */
/*                                                              */
/*输出:                                                         */
/*	TRUE,  总线选择成功                                     */
/*	FALSE, 总线选择失败  	                                */
/****************************************************************/
uchar SPI_Init(void)
{
	uchar temp;
	
	temp=read_reg(Command);
	if(temp!=0x00)
		return FALSE;
	write_reg(Page_Sel,0x80);
	temp=read_reg(Command);
	if(temp==0x00)
	{	
		write_reg(Page_Sel,0x00);
		return TRUE;
	}
	else
		return FALSE;
}
/****************************************************************/
/*名称: FM1702SL_Init                                           */
/*功能: 该函数实现初始化FM1702SL各相关寄存器       		*/ 
/*								*/
/*输入:                                                         */
/*      N/A                                                     */
/*                                                              */
/*输出:                                                         */
/*	TRUE,  初始化FM1702SL各寄存器成功                       */
/*	FALSE, 初始化FM1702SL各寄存器失败  	                */
/****************************************************************/
void FM1702SL_Init(void)
{		
	  write_reg(InterruptEn,0x7f);			//禁止所有中断
	  write_reg(Int_Req,0x7f);			//中断标识清零
	  write_reg(TxControl,0x5B);			//设置发射控制寄存器
	  write_reg(Rxcontrol2,0x01);			//设置接收控制寄存器
	  write_reg(RxWait,0x07);			//设置接收延时控制寄存器
}

/****************************************************************/
/*名称: Clear_FIFO                                              */
/*功能: 该函数实现清空FIFO寄存器                         	*/
/*								*/
/*输入:                                                         */
/*      N/A                                                     */
/*                                                              */
/*输出:                                                         */
/*	TRUE, FIFO寄存器清空成功                                */
/*	FALSE, FIFO寄存器清空失败  	                        */
/****************************************************************/
uchar Clear_FIFO(void)
{
	uchar temp;
	uint  i;
	
	temp=read_reg(Control);					//清空FIFO
	temp=(temp | 0x01);
	write_reg(Control, temp);
	for(i = 0; i < RF_TimeOut; i++)				//检查FIFO是否被清空
	{
		temp=read_reg(FIFO_Length);
		if(temp==0)
			return TRUE;
	}
	return FALSE;
}
/****************************************************************/
/*名称: Write_FIFO                                              */
/*功能: 该函数实现写FIFO寄存器                			*/
/*								*/
/*输入:                                                         */
/*      count, 待写入数据的长度                                 */
/*	buff, 指向待写入数据的指针                              */
/*                                                              */
/*输出:                                                         */
/*	N/A                                                     */
/****************************************************************/
void Write_FIFO(uchar count,uchar idata *buff)
{
	uchar i;
	
	for(i = 0; i < count; i++)
		write_reg(FIFO,*(buff + i));
}
/****************************************************************/
/*名称: Read_FIFO                                               */
/*功能: 该函数实现读FIFO寄存器                			*/
/*								*/
/*输入:                                                         */
/*       buff, 指向读出数据的指针                               */
/*                                                              */
/*输出:                                                         */
/*	 0代表读出数据长度为0                                   */
/*	 非0代表读出FIFO的数据长度				*/
/****************************************************************/
uchar Read_FIFO(uchar idata *buff)
{
	uchar temp;
	uchar i;
	
	temp=read_reg(FIFO_Length);
	if (temp==0)
	{
		return FALSE;
	}
	if (temp >= 64)					
		return FALSE;					
	for(i = 0;i < temp; i++)
	{
 		*(buff + i)=read_reg(FIFO);
	}
	return temp;
 }
/****************************************************************/
/*名称: Command_Send                                            */
/*功能: 该函数实现发送接收数据                       		*/
/*								*/
/*输入:                                                         */
/*       count, 待发送命令集的长度                              */
/*	 buff, 指向待发送数据的指针                             */
/*       Comm_Set, 命令码                                       */
/*								*/
/*输出:                                                         */
/*	TRUE, 命令被正确执行                                    */
/*	FALSE, 命令执行错误  	                                */
/****************************************************************/
uchar Command_Send(uchar count,uchar idata * buff,uchar Comm_Set)
{
	uint  j;
	uchar idata temp;
	
	write_reg(Command, 0x00);
	Clear_FIFO();
    	if (count != 0)
		Write_FIFO(count, buff); 
	
	write_reg(Command, Comm_Set);				
	
	for(j = 0; j< RF_TimeOut; j++)				
	{			
		temp=read_reg(Command);
		if(temp == 0x00)  
			return TRUE;	
	}
	return FALSE;	
}
/****************************************************************/
/*名称: Request                                                 */
/*功能: 该函数实现FM1702SL向空间发送request信号    		*/ 
/*								*/
/*输入:                                                         */
/*       N/A							*/
/*                                                              */
/*输出:                                                         */
/*	FALSE	request命令执行失败				*/
/*	TRUE	request命令执行成功				*/
/****************************************************************/
uchar Request(void)
{
	uchar  temp;
					
 	write_reg(Bit_Frame,0x07);			//写bitframing寄存器			
 	temp=read_reg(Control);				//写control寄存器
 	temp=temp&0xf7;
 	write_reg(Control,temp); 
  	write_reg(ChannelRedundancy,0x03);		//写ChannelRedundancy寄存器
  	buffer[0]=0x52;					
  	temp=Command_Send(1, buffer, Transceive);	//将待发送数据写入FIFO中,并执行发送接收命令
  	if(temp==FALSE)
		return FALSE;
	
  	temp=Read_FIFO(buffer);				//从FIFO中读取应答信息
  	if(temp==0x00)
  		return FALSE;
  	if(temp==0x02)					//进行回读数据的判断
  	{
  		if(buffer[0]!=0x04)
  			return FALSE;
  		if(buffer[1]!=0x00)
  			return FALSE;
  		return TRUE;
	}
	return FALSE;
}
/********************************************************************/
/*名称: Get_UID                                                     */
/*功能: 该函数实现FM1702SL向存在于其发射范围内的卡片发射GET_UID信号 */ 
/*								    */
/*输入:                                                             */
/*       N/A							    */
/*                                                                  */
/*输出:                                                             */
/*	FALSE	GET_UID命令执行失败				    */
/*	TRUE	GET_UID命令执行成功				    */
/********************************************************************/
uchar Get_UID(void)
{
	uchar temp,i;
	
	write_reg(ChannelRedundancy,0x03);		//写ChannelRedundancy寄存器
	buffer[0]=0x93;
	buffer[1]=0x20;
	temp=Command_Send(2, buffer, Transceive);	//将待发送数据写入FIFO中,并执行发送接收命令
	if(temp==FALSE)
		return FALSE;
	
	temp=Read_FIFO(buffer);				//读出FIFO寄存器的内容
	if(temp==0x00)
		return	FALSE;
	if(temp==0x05)					//保存得到的5位UID号
	{
		for(i=0;i<5;i++)
			UID[i]=buffer[i];
	}
	temp=Check_UID();
	return	temp;
}
/*********************************************************************/
/*名称: Select_Tag                                                   */
/*功能: 该函数实现FM1702SL向存在于其发射范围内的卡片发射选择卡片信号 */ 
/*								     */
/*输入:                                                              */
/*       N/A							     */
/*                                                                   */
/*输出:                                                              */
/*	FALSE	选择卡片执行失败				     */
/*	TRUE	选择卡片执行成功			 	     */
/*********************************************************************/
uchar	Select_Tag(void)
{
	uchar temp,i;
	
	write_reg(ChannelRedundancy,0x0f);		//写ChannelRedundancy寄存器
	buffer[0]=0x93;
	buffer[1]=0x70;
	for(i=0;i<5;i++)
		buffer[i+2]=UID[i];
	temp=Command_Send(7, buffer, Transceive);	//将待发送数据写入FIFO中,并执行发送接收命令
	if(temp==FALSE)
		return FALSE;
	
	temp=Read_FIFO(buffer);
	if(temp==0x00)
		return FALSE;
	if(temp==0x01)
	{
		if(buffer[0]==0x08)
			return	TRUE;
	}
	return FALSE;	
}
/*********************************************************************/
/*名称: Load_Key_EE                                                  */

⌨️ 快捷键说明

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