FM25CL64程序(C51版)

news/2024/11/30 20:32:40/

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

 


http://www.ppmy.cn/news/706224.html

相关文章

移动机器人的运动学模型:差速传动移动机器人

差速传动移动机器人运动学模型 问题 如何根据差速传动机器人左右两边轮子的速度&#xff0c;计算出机器人当前的状态。或者想要以一定速度到达某处&#xff0c;需要给出差速两边轮子的速度指令。 当然大多数时候&#xff0c;购买的机器人底盘能够直接帮助我们执行发送给机器人…

c语言中执行cl exe时出错,执行cl.exe时出错怎么办

执行cl.exe时出错的解决办法:首先打开vc界面;然后依次点击【“TOOLS”-“Option”-“Directories”】;最后重新设置“Excutable Fils、Include Files...”的路径或者修改环境变量即可。 具体问题: 为什么老是“执行 cl.exe 时出错”#include main() {float a = 12.3,b; dou…

课程学习(Curriculum Learning, CL)

原文链接&#xff1a; https://zhuanlan.zhihu.com/p/362351969 A Survey on Curriculum Learning TPAMI 2021 文章目录 问题定义有效性分析1. 模型优化角度数据分布角度 方法总结Predefined CLAutomatic CL 未来研究方向 全文内容导图汇总&#xff1a; 导图&#xff1a; http…

VS报错-- “CL.exe以退出,代码为5“ 解决办法

报错&#xff1a;CL.exe以退出&#xff0c;代码为5 解决办法&#xff1a; 项目属性–VC目录–可执行文件目录 把从父级或项目默认设置继承勾选上 然后在运行就没有问题了

CL-200A串口通信

一.进入串口模式 1.cl-200a关机,开关拨向“O”端 2.hold on键弹出 3.同时按下SET/CALL/CF,并且开关拨向“I”端,这时候会进入USB模式 二.CL-200A通信命令 模式 命令 PC connect02 30 30 35 34 31 20 20 20 03 31 33 0D 0ASet Hold02 39 39 35 35 31 20 20 30 03 30 32 0D…

STM32驱动FM24CL16

根据小苗开发板例程&#xff0c;修改得好用的读写FM24CL16的2K bytes代码&#xff0c;分享给大家。 小苗开发板的程序有点问题&#xff0c;I2C_Read()里最后产生stop条件时间不对&#xff1b;另外FM24CL16是11位地址的&#xff0c;在I2C_Write()里也应体现出来。 先贴代码&am…

bulk interface驱动_USB驱动程序(较详细)三

(本部分的一些示例源码来自drivers/usb/usb-skeleton.c,它是Linux内核为我们提供的最基础的USB驱动程序,USB骨架程序) 驱动程序把驱动对象注册到 USB 子系统中,之后使用供应商(idVendor)和设备(idProduct)标识来判断对应的硬件是否已经安装. 驱动的设备支持列表 struct usb_…

西铁城s621c打印机调试说明,西铁城CL-S621CII驱动

软件标签&#xff1a; 西铁城Citizen CL-S621CII打印机驱动是西铁城官方针对该型号打印机推出的驱动程序&#xff0c;主要是为了能够解决打印机与电脑连接异常或者无法打印等问题&#xff0c;安装驱动后&#xff0c;打印机就可以进行正常的打印工作了&#xff0c;小编提供了驱动…