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;
}