FM25CL64程序(C51版)

 FM25CL64芯片手冊:https://wenku.baidu.com/view/dabf5e71168884868762d6aa.html

#ifndef FW25CL64_H
#define FW25CL64_H

#include "reg51.h"
#include "intrins.h"

#define WREN  0X06							//寫使能操作碼
#define WRDI  0X04							//寫禁止
#define RDSR  0X05							//讀狀態寄存器
#define WRSR  0X01 						    //寫狀態寄存器
#define READ  0X03							//讀存儲器數據
#define WRITE 0X02						    //寫存儲器數據

//**** FM25CL64 *****************
//sbit SI  = P1^7;							//芯片串行輸入腳
//sbit SO  = P1^6;							//芯片串行輸出腳
//sbit SCK = P1^5;							//時鐘線
//sbit CS  = P1^4;							//片選

sbit SCK = P2^5;						//鐵電的時鐘線
sbit SIO = P2^6;						//鐵電的數據線
sbit CS  = P2^7;						//鐵電的片選


void SPI_write_FM25CL64(unsigned char *arr_to_send, unsigned int address,unsigned char arr_num);
void SPI_read_FM25CL64( unsigned char *arr_to_read, unsigned int address,unsigned char arr_read_num);

#endif
#include "fw25cl64.h"

#define uchar unsigned char
#define uint  unsigned int

uchar FW25[8] = {0};    //輸入輸出數組
uint  Address = 0;      //輸入輸出地址

//*********************
//FM25CL64的寫子程序
//
//**********************
static void send_data(uchar w_data)
{
	uchar i = 0;
	
	SCK = 0;											//上升沿數據移到芯片的SI腳
	CS = 0;
	for(i=0; i<8; i++)						//數據的8位從高位到低位進行發送
	{
		SCK = 0;
		if((w_data<<i)&0X80)				
		{
			SIO = 1;
		}
		else
		{
			SIO = 0;
		}
		_nop_();
		_nop_();
		SCK = 1;											//上升沿數據移到了芯片中
		_nop_();
		_nop_();
	}
//	CS = 1;
}

//********************
//FM25CL64的讀子程序
//
//********************
static uchar read_data(void)
{
	uchar i = 0, read = 0;
	
	CS = 0;
	SCK = 1;												//下降沿從芯片讀取一位數據
	for(i=0; i<8; i++)
	{
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		SCK = 0;
		if(SIO == 1)
		{
			read = (read << 1) + 1;
		}
		else
		{
			read = read << 1;
		}
		SCK = 1;
	}
//	CS = 1;
	
	return read;
}

//**********************
//FM25CL64的寫一個字節程序
//data_to_send:是要寫進去的數據
//address: 要寫數據進去的地址
//**********************
void SPI_write(uchar data_to_send, uint address)
{
	volatile uchar addr_tempH = 0,addr_tempL = 0;
	
	addr_tempH = (uchar)((address&0xff00)>>8);				//獲取高8位地址
	addr_tempL = (uchar)(address&0x00ff);							//獲取低8位地址

	CS = 0;
	_nop_();
	send_data(WREN);																	//先發寫允許信號
	_nop_();
	CS = 1;
	_nop_();
	CS = 0;
	_nop_();
	send_data(WRITE);																	//發送寫存儲器指令
	send_data(addr_tempH);														//發送高8位地址
	send_data(addr_tempL);														//發送低8位地址
	send_data(data_to_send);													//發送一個字節的數據到SPI芯片
	CS = 1;
}

//***********************
//FM25CL64的讀一個字節的程序
//address:要讀的地址
//返回值是讀到的數據
//***********************
uchar SPI_read(uint address)
{
	volatile uchar data_temp = 0, addr_tempH = 0,addr_tempL = 0;
	
	addr_tempH = (uchar)((address&0xff00)>>8);				//獲取高8位地址
	addr_tempL = (uchar)(address&0x00ff);							//獲取低8位地址
	CS = 1;
	_nop_();
	CS = 0;
	send_data(READ);																	//發送讀存儲器指令
	send_data(addr_tempH);														//發送高8位地址
	send_data(addr_tempL);														//發送低8位地址
	data_temp = read_data();													//接收一個字節的數據
	CS = 1;
	
	return data_temp;
}

//***********************
//FM25CL64的寫多個字節程序
//arr_to_send:是要寫進去的數據數組的地址
//address: 要寫數據進去的地址
//arr_num: 要寫進去的字節數
//***********************
void SPI_write_FM25CL64(uchar *arr_to_send, uint address,uchar arr_num)
{
	volatile uchar i = 0;
	volatile uchar addr_tempH = 0,addr_tempL = 0;
	
	addr_tempH = (uchar)((address&0xff00)>>8);				//獲取高8位地址
	addr_tempL = (uchar)(address&0x00ff);							//獲取低8位地址
	CS = 0;
	_nop_();
	send_data(WREN);																	//先發寫允許信號
	_nop_();
	CS = 1;
	_nop_();
	CS = 0;
	send_data(WRITE);																	//發送寫存儲器指令
	send_data(addr_tempH);														//發送高8位地址
	send_data(addr_tempL);														//發送低8位地址
	for(i=0; i<arr_num; i++)
	{
		send_data(arr_to_send[i]);											//發送一個字節的數據到SPI芯片
	}
	CS = 1;
}

//***********************
//FM25CL64的讀多個字節的程序
//arr_to_read:是讀出數據存放的數組地址
//address:要讀的地址
//arr_read_num: 要讀的字節數
//***********************
void SPI_read_FM25CL64(uchar *arr_to_read,uint address,uchar arr_read_num)
{
	volatile uchar i = 0;
	volatile uchar addr_tempH = 0,addr_tempL = 0;
	
	addr_tempH = (uchar)((address&0xff00)>>8);				//獲取高8位地址
	addr_tempL = (uchar)(address&0x00ff);							//獲取低8位地址
	CS = 0;
	send_data(READ);																	//發送讀存儲器指令
	send_data(addr_tempH);														//發送高8位地址
	send_data(addr_tempL);														//發送低8位地址
	for(i=0; i<arr_read_num; i++)
	{
		arr_to_read[i] = read_data();										//接收一個字節的數據
	}
	CS = 1;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章