233|0

3190

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

读写25LC040的问题 [复制链接]

proteus仿真图:

程序:
#include <reg51.h> // ??8051?????  
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int
	
sbit SCK=P2^0;
sbit SI=P2^1;
sbit SO=P2^2;
sbit CS=P2^3;
// ???SPI??????  
void SPI_Init(void); // SPI???  
void SPI_SendByte(unsigned char byte); // SPI??????  
unsigned char SPI_ReceiveByte(void); // SPI??????  
void SPI_CS_Low(void); // ??????  
void SPI_CS_High(void); // ??????  
 
unsigned char readData,readData1,readData2;
// 25LC040???  
#define READ_INSTRUCTION  0x03 // ???(??25LC040,????????????)  
#define WRITE_INSTRUCTION 0x02 // ???(??,??????????)  
#define WREN_INSTRUCTION  0x06 // ?????  
  
// ????  
void EEPROM_WriteByte(unsigned char address, unsigned char date) {  
    SPI_CS_Low(); // ??????  
    SPI_SendByte(WREN_INSTRUCTION); // ???????  
    SPI_CS_High(); // ??????,???????(??????)  
      
    SPI_CS_Low(); // ????????  
    SPI_SendByte(WRITE_INSTRUCTION); // ?????  
    //SPI_SendByte((address >> 8) & 0xFF); // ???????(??25LC040,?????)  
    SPI_SendByte(address); // ???????  
    SPI_SendByte(date); // ????  
    SPI_CS_High(); // ??????,?????  
      
    // ???????????,?????EEPROM????  
}  
  
unsigned char EEPROM_ReadByte(unsigned char address) {  
    unsigned char date;  
      
    SPI_CS_Low(); // ??????  
    SPI_SendByte(READ_INSTRUCTION); // ?????  
    //SPI_SendByte((address >> 8) & 0xFF); // ???????(??25LC040,?????)  
    SPI_SendByte(address ); // ???????  
    date = SPI_ReceiveByte(); // ????  
    SPI_CS_High(); // ??????,?????  
      
    return date;  
}  

void EEPROM_ReadByte1(unsigned char address) {  
    unsigned char date;  
      
    SPI_CS_Low(); // ??????  
    SPI_SendByte(READ_INSTRUCTION); // ?????  
    //SPI_SendByte((address >> 8) & 0xFF); // ???????(??25LC040,?????)  
    SPI_SendByte(address ); // ???????  
    readData = SPI_ReceiveByte(); // ????
		readData1 = SPI_ReceiveByte();
	 readData2 = SPI_ReceiveByte();
    SPI_CS_High(); // ??????,?????  
      
   // return date;  
}  
  
void main(void) { 
		uint i;
		
    SPI_Init(); // ???SPI??  
      
    // ??:?????EEPROM  
    EEPROM_WriteByte(0x00, 0xAB); // ???0x0000??0xAB
		for(i=0;i<10000;i++);
    EEPROM_WriteByte(0x01, 0x55); // ???0x0000??0xAB
		for(i=0;i<10000;i++);
		EEPROM_WriteByte(0x02, 0x66); // ???0x0000??0xAB
		for(i=0;i<10000;i++);
    // ??:?EEPROM????  
    EEPROM_ReadByte1(0); // ???0x0000????  
    P1=  readData;
	_nop_();
			_nop_();
		//readData1 = EEPROM_ReadByte(0x01); // ???0x0000????  
    P3=  readData1;
	_nop_();
			_nop_();
		//readData2 = EEPROM_ReadByte(0x02); // ???0x0000????  
    P0=  readData2;
    // ?????????????????  
      
    while (1) {  
        // ???  
    }  
}  
  
// ????????SPI???????  
void SPI_Init(void) {  
    // ???SPI??,????????  
}  
  
void SPI_SendByte(unsigned char byte) {  
    // ??SPI??????
		uchar i;
		for(i=0;i<8;i++)
		{
			SCK=0;
			_nop_();
			_nop_();
			if((byte&0x80)==0x80)
				SI=1;
			else
				SI=0;
			_nop_();
			_nop_();
			byte<<=1;
			SCK=1;
			_nop_();
			_nop_();
		}
}  
  
unsigned char SPI_ReceiveByte(void) {  
    // ??SPI??????  
		uchar i,dat=0;
	for(i;i<8;i++)
	{
		dat<<=1;
		SCK=1;			//第一位
		_nop_();
			_nop_();
	SCK=0;
		_nop_();
			_nop_();
		SO=1;
		if(SO)
			dat|=1;
		
		_nop_();
			_nop_();
		
	}
		
		
    return dat; // ??????????????  
}  
  
void SPI_CS_Low(void) {  
    // ???????  
    CS = 0; // ?????????P1.0??  
}  
  
void SPI_CS_High(void) {  
    // ???????  
    CS = 1; // ?????????P1.0??  
}

只有第一次读的是对的。

请问高手,哪里错了?谢谢

 

此帖出自51单片机论坛
点赞 关注
个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
2009年全国大学生电子设计竞赛G题低频功率放大器题解分享

本帖最后由 paulhyde 于 2014-9-15 04:15 编辑 2009年全国大学生电子设计竞赛G题是一个设计功率放大器的题,主要考核学生模拟电 ...

把STM32F746-Disco做AppleⅡ

本帖最后由 dcexpert 于 2016-1-4 11:25 编辑 今天是2016年的第一天,来一个有重量的帖子,在STM32F746-Disco上跑Basic。就是 ...

你是怎么写 (底层)读键程序的(最多可有150个芯币奉送)

我在发上一个帖子的时候 底层读键 的 两种简单思路 的 空间 时间 开销 简单测试 https://bbs.eeworld.com.cn/thread-487709- ...

移植MicroPython到SensorTile的过程

本帖最后由 dcexpert 于 2017-1-20 00:41 编辑 两周前就应该写这一篇,但是因为各种原因耽误下来。今天晚上,终于抽出时间, ...

高功率GaN模型库的器件和PA电路级验证

Modelithics和Qorvo正合作扩展用于GaN功率晶体管最新的高精度模型,供设计人员免费使用。现有和开发中的GaN模型库支持基于仿真的 ...

那个“深圳小花”怎么还不被就地正法?

  明显是来调戏论坛的,和曾经那个"EEW2018"同出一辙还变本加厉。居然还能吸引人气?论坛变成水坛了吗?上论坛来看帖子的 ...

电容的两种等效电路

最近在学习去耦的过程中两,看到了种电容的等效电路,虽然都是从其结构,材料和生产工艺入手,但是两种模型还是有一点点区别。 ...

关于MicroPython mpremote工具 的一些用例,闲聊

# 关于MicroPython mpremote工具 的一些用例,闲聊 我尝试了很多不同的第三方micropython工具,有些是Windows应用程序,有些 ...

运动控制器 直接读取 绝对值编码器信号

请问有没有大佬采用运动控制器 直接读取 绝对值编码器信号,比如海德汉的绝对值编码器,如附件 运动控制器是在 linux 基础上 ...

动手学深度学习(PyTorch版)- 【读书活动-心得分享】环境安装

深度学习环境的安装 1- 本地安装, 无GPU 安装Anoconda brew install anaconda 创建基于本书的环境(先删除, ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表