fm25cl64.c

来自「LPC2103两轴步进电机控制程序,带加减速,一路脉冲+方向输出、继电器延时、报」· C语言 代码 · 共 242 行

C
242
字号
/****************************************************

*---------------------------------------------------*
*  功能描述: FM25CL64操作								*
*---------------------------------------------------*/
#include "mpa101.h"

//------------------------------------------
// Function   : FM25X_Init
// Description: 初始化
//------------------------------------------
void FM25X_Init(U32 sp)
{
	U32 n;
	n = Fpclk*2/sp;
	if(n<8) n = 8;
	S0SPCCR = n;		// 时钟>=8 16*2/8 = 4M
//	S0SPCR = 0x38;		// 主模式、CPOL=1、CPHA=1 SPIMODE=3
	S0SPCR = 0x20;		// 主模式、CPOL=0、CPHA=0 SPIMODE=0
	FIO0SET = SS1;
}	

//------------------------------------------
// Function   : FM_Wen
// Description: 允许写操作
//------------------------------------------
void FM_Wren(void)
{
	FIO0CLR = SS1;
	S0SPDR = WREN;
	while(0==(S0SPSR&0x80));
	FIO0SET = SS1;
}	

//------------------------------------------
// Function   : FM_Wrdi
// Description: 写操作禁止
//------------------------------------------
void FM_Wrdi(void)
{
	FIO0CLR = SS1;
	S0SPDR = WRDI;
	while(0==(S0SPSR&0x80));
	FIO0SET = SS1;
}	

//------------------------------------------
// Function   : FM_Rdsr
// Description: 读状态值
//------------------------------------------
U8 FM_Rdsr(void)
{
	U8 re;
	FIO0CLR = SS1;
	S0SPDR = (U8)(RDSR);
	while(0==(S0SPSR&0x80));
	S0SPDR = 0xff;								// 送8个SCK
	while(0==(S0SPSR&0x80));
	re = S0SPDR;
	FIO0SET = SS1;
	return(re);
}	

//------------------------------------------
// Function   : FM_Wrsr
// Description: 写状态值
//------------------------------------------
void FM_Wrsr(U8 status)
{
	FM_Wren();
	FIO0CLR = SS1;
	S0SPDR = (U8)(WRSR);
	while(0==(S0SPSR&0x80));
	S0SPDR = status;
	while(0==(S0SPSR&0x80));
	FIO0SET = SS1;
}	
//************FM25CL04**********************
//------------------------------------------
// Function   : FM_WByte
// Description: 写byte数据至FM25CL04
//------------------------------------------
void FM_WByte(U16 add, U8 dat)
{
	FM_Wren();
	FIO0CLR = SS1;
	S0SPDR = WRITE|(U8)((add/256)<<3);		// 写指令
		while(0==(S0SPSR&0x80));
	S0SPDR = (U8)(add%256);					// 低位地址
		while(0==(S0SPSR&0x80));
	S0SPDR = dat;							// 送数据
		while(0==(S0SPSR&0x80));
	FIO0SET = SS1;
}	

//------------------------------------------
// Function   : FM_WriteSeq
// Description: 写数据串至FM25CL04
//------------------------------------------
void FM_WriteSeq(U16 add, U8 *ptr, U16 num)
{
	U16 i;
	FM_Wren();
	FIO0CLR = SS1;
	S0SPDR = WRITE|(U8)((add/256)<<3);		// 写指令
		while(0==(S0SPSR&0x80));
	S0SPDR = (U8)(add%256);					// 低位地址
		while(0==(S0SPSR&0x80));
	for(i=0; i<num; i++){
		S0SPDR = *(ptr+i);					// 送数据
		while(0==(S0SPSR&0x80));
	}
	FIO0SET = SS1;
}	

//------------------------------------------
// Function   : FM_RByte
// Description: 从FM25CL04读byte数据
//------------------------------------------
U8 FM_RByte(U16 add)
{
	U8  re;
	
	FIO0CLR = SS1;
	S0SPDR = READ|(U8)((add/256)<<3);		// 读指令
		while(0==(S0SPSR&0x80));
	S0SPDR = (U8)(add%256);					// 低位地址
		while(0==(S0SPSR&0x80));
	S0SPDR = 0xff;							// 送8个SCK
		while(0==(S0SPSR&0x80));
	re = S0SPDR;							// 读取数据
	FIO0SET = SS1;
	return(re);
}	

//------------------------------------------
// Function   : FM_ReadSeq
// Description: 从FM25CL04读数据串
//------------------------------------------
void FM_ReadSeq(U16 add, U8 *ptr, U16 num)
{
	U16 i;
	FIO0CLR = SS1;
	S0SPDR = READ|(U8)((add/256)<<3);		// 读指令
		while(0==(S0SPSR&0x80));
	S0SPDR = (U8)(add%256);					// 低位地址
		while(0==(S0SPSR&0x80));
	for(i=0; i<num; i++){
		S0SPDR = 0xff;						// 送8个SCK
		while(0==(S0SPSR&0x80));
		*(ptr+i) = S0SPDR;					// 读取数据
	}
	FIO0SET = SS1;
}	
//**************FM25CL04********************

//**************FM25CL64********************
//------------------------------------------
// Function   : FM_WByte
// Description: 写byte数据至FM25CL64
//------------------------------------------
/*void FM_WByte(U16 add, U8 dat)
{
	FM_Wren();
	FIO0CLR = SS1;
	S0SPDR = WRITE;							// 写指令
		while(0==(S0SPSR&0x80));
	S0SPDR = (U8)(add/256);					// 写高位地址
		while(0==(S0SPSR&0x80));
	S0SPDR = (U8)(add%256);					// 低位地址
		while(0==(S0SPSR&0x80));
	S0SPDR = dat;							// 送数据
		while(0==(S0SPSR&0x80));
	FIO0SET = SS1;
}	

//------------------------------------------
// Function   : FM_WriteSeq
// Description: 写数据串至FM25CL64
//------------------------------------------
void FM_WriteSeq(U16 add, U8 *ptr, U16 num)
{
	U16 i;
	FM_Wren();
	FIO0CLR = SS1;
	S0SPDR = WRITE;							// 写指令
		while(0==(S0SPSR&0x80));
	S0SPDR = (U8)(add/256);					// 写高位地址
		while(0==(S0SPSR&0x80));
	S0SPDR = (U8)(add%256);					// 低位地址
		while(0==(S0SPSR&0x80));
	for(i=0; i<num; i++){
		S0SPDR = *(ptr+i);					// 送数据
		while(0==(S0SPSR&0x80));
	}
	FIO0SET = SS1;
}	

//------------------------------------------
// Function   : FM_RByte
// Description: 从FM25CL64读byte数据
//------------------------------------------
U8 FM_RByte(U16 add)
{
	U8  re;
	
	FIO0CLR = SS1;
	S0SPDR = READ;							// 读指令
		while(0==(S0SPSR&0x80));
	S0SPDR = (U8)(add/256);					// 读高位地址
		while(0==(S0SPSR&0x80));
	S0SPDR = (U8)(add%256);					// 低位地址
		while(0==(S0SPSR&0x80));
	S0SPDR = 0xff;							// 送8个SCK
		while(0==(S0SPSR&0x80));
	re = S0SPDR;							// 读取数据
	FIO0SET = SS1;
	return(re);
}	

//------------------------------------------
// Function   : FM_ReadSeq
// Description: 从FM25CL64读数据串
//------------------------------------------
void FM_ReadSeq(U16 add, U8 *ptr, U16 num)
{
	U16 i;
	FIO0CLR = SS1;
	S0SPDR = READ;							// 读指令
		while(0==(S0SPSR&0x80));
	S0SPDR = (U8)(add/256);					// 读高位地址
		while(0==(S0SPSR&0x80));
	S0SPDR = (U8)(add%256);					// 低位地址
		while(0==(S0SPSR&0x80));
	for(i=0; i<num; i++){
		S0SPDR = 0xff;						// 送8个SCK
		while(0==(S0SPSR&0x80));
		*(ptr+i) = S0SPDR;					// 读取数据
	}
	FIO0SET = SS1;
}*/
//**************FM25CL64********************

⌨️ 快捷键说明

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