eeprom一定需要上拉电阻原理图吗

FPGA 能和EEPROM直接连接吗?_百度知道
FPGA 能和EEPROM直接连接吗?
现在想做板子你好;O口连接就可以了,我写了一个I2C的读写主控器?SCL和SDA是不是只要和FPGA的I&#47,该怎么连接?FPGA和EEPROM能直接连接吗
提问者采纳
以,没问题,否则就在FPGA内部IO上设置pullup!但建议你最好SCL和SDA都上拉电阻
你好,谢谢你的回答。FPGA上得IO口能悬空吗?
可以,但最好参考datasheet,个别IO悬空会引起内部干扰(尤其是SerDes),这些IO最好接地。
其他类似问题
为您推荐:
您可能关注的推广
eeprom的相关知识
其他3条回答
IO悬空会引起内部干扰(尤其是SerDes),这些IO最好接地
可以直接相连,网上有很多的FPGA开发板图纸,你可以参考下。
可以的没有问题,我正在做一个为参加Xlinx与MaximDIY设计大赛的项目,就是这样做的。楼主也可以考虑来参加美信DIY设计大赛。
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁关于单片机EEPROM存储器使用问题_百度知道
关于单片机EEPROM存储器使用问题
比如接24C01?讲个方法就行了,存储数据用MOV指令?还有就是,该怎么接线我想用51单片机外接一个EEPROM存储器!先谢谢?回答详细的给分,存储数据到24C01中?大概怎样编程,怎么判断24C01存储数据已满.还有?用到SBUF吗,并且选用方式0,SCL接TXD?是不是SDA接RXD
在存取数据方面能给出参考程序就最好了(我要汇编的)
提问者采纳
主器件发送从器件地址和它想读取的字节数据的地址执行一个伪写操作;从器件地址位是000:MOV
SDA.;I2C_READ。I2C_RECEIVE8BIT。I2C_SEND8BIT;*------------------------------------------------------读一个字节
Address地址
Data读出的数据------------------------------------------------------*/**************************************;SDA为1跳转,#0AAH
P0;&#47,#60H
A***************************************//&#47:I2C_WRITE_A;*******************************************************&#47。
I2C_SEND8BIT
I2C_READ_A :
CLR SCLRET/主器件接收从器件指定地址的8位数据。MOV
A,表示无确认;&#47.随便找两个io口,#55H
A.;/&#47。 C为1转移,并且对从器件进行写操作;*******************************************************&#47:
/&#47,再次发送:DJNZ
R5;写入数据;=1,Address
I2C_SEND8BIT
A;不要有所疑问为什么这么操作;I2C_WRITE;/&#47:
SDA;调用I2C总线的起始信号的程序,#10DEL3,并且对从器件进行读操作端口 自己改一下接法。因为这是一个选择性读的操作.1Address
08HI2CData
09HORG 0040HLJMP START,A
I2C_STOPRET&#47,SDA
B;***************************************&#47.24c01满了,#00H
I2CDATA;&#47,表示无确认.START,并且对从器件进行写操作:
SP.还要什么时候满SDA
P2;**********************************.这个东西都是固定地址:MOV
R5,I2C_ACK0 &#47,I2CDATA
,再次发送,A
.上拉5-10k电阻就好了,I2CDATA
START&#47,#08H
SDAI2C_RECEIVE8IT_A,#B /I2C总线的起始信号的程序,DEL1RET&#47,DEL3DJNZ
R6;发送接收确认信号I2C_ACk,C
B;读出数据。
A;*******************************************************&#47,#00H
I2CD/*******************************************************;*************************************;//&#47,#0FFHDEL1;C=1转移;***********************************;/发送结束信号I2C_STOP;从器件地址位是000,#08HI2C_SEND8BIT_A.,#B &#47,Address
I2C_SEND8BIT
I2C_READ_B:
B,I2C_SEND8BIT_ARET/主器件送从器件8位数据:
I2C_RECEIVE8BIT
A;/************************************&#47,表示无确认;*******************************************/从器件地址位是000。
/&#47,DEL2DJNZ
R7。I2C_START:
I2C_READ_A;**************************************//&#47.0SCL EQU
P2;***************************************delay。
I2C_SEND8BIT
I2C_READ_B
I2C_ACK_END
I2C_ACK0。
I2C_SEND8BIT
I2C_WRITE_A
C;&#47,I2C_RECEIVE8IT_ARET/送八位数据&#47:
CLR SCLRET&#47.24c01总共就只有128字节而且写入的时候都知道忘那里写你自己自然清楚什么时候:
SDARET//转入主程序:
I2C_ACK_END,I2CDATA
A=1,再次发送
C为1转移;发送开始信号&#47.
P0,I2CData
I2C_SEND8BIT
I2C_STOPRET//&#47,#B /***********************************/接收八位数据//*------------------------------------------------------写一个字节
Address地址
I2CDatata写入的数据------------------------------------------------------*&#47:MOV
R7,#0FFHDEL2.又不是硬盘这种
提问者评价
你们的回答我都很满意,但是这个对我更有帮助.感谢各位!
其他类似问题
为您推荐:
其他3条回答
24C01是I2C接口的,但标准51是不带I2C接口的,串口方式0是不行的,需要用IO模拟,所以随便接两个IO都可以,而且都要接上拉电阻,大概几K就行了,因为不是总线方式,所以不能用MOV指令,也不能用SBUF,要判断是否为满,可以在程序里设个变量。
这是测试过的程序,也可以参考别的,反正这方面的资料很多,自己搜搜
/*******************************************************************************
A_SDA BIT P1.1
A_SCL BIT P1.0
A_ADDR EQU 55H
A_DATA EQU 77H
;***************************************************************
; /*写数据到指定的地址中*/
;***************************************************************
A_WRITE: SETB A_SCL
SETB A_SDA
CLR A_SDA开始信号,启动AT24C01
MOV A,#0A0H送控制字:写
CALL A_SEND调用发送字节子程序
MOV A,#A_ADDR送片内字节地址
CALL A_SEND
MOV A,#A_DATA送数据
CALL A_SEND
CLR A_SDA停止信号
SETB A_SCL
SETB A_SDA
CALL DELAY
;***************************************************************
; /*从指定的地址中读出数据*/
;**********...
1、24C01是I2C接口的,一般的51单片机是没有I2C接口的,需要模拟I2C,其实就是时序问题。除非是增强型51内核的单片机。这样的单片机可以用单片机自带的IIC接口,当让同样也可以模拟IIC.2、存储数据用MOV指令?用到SBUF吗?是不能用这些指令的,3、判断数据是否满,你的程序自己检查,例如你可以在24C01写入一个字节数据,也可以连续写入8个字节的数据,但是前提是你要指定写入的地址。你自己算算就知道了。
您可能关注的推广
eeprom的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁查看: 20396|回复: 227
事无巨细,IIC协议与EEPROM 24C02
在前面的一系列文章中,我们从最简单的开发环境开始到上一节的片外DAC的使用为止,算是AVR单片机中比较简单但是绝对是比较全面的内容了。如果你能够独立掌握了前面的这些内容,我们现在可以开始进入CEPARK AVR开发板上最后的三个最难的内容:存储芯片AT24C02的IIC总线协议,时钟芯片DS1302的SPI总线协议,还有温度传感器DS18B20的单总线协议。
今天我们来讲存储芯片AT24C02的IIC总线协议。(也称I^2 C总线协议)
IIC的概念:
IIC,英文全称为Inter-Integrated Circuit,即内置集成电路。所以IIC总线协议,就是指内置集成电路总线协议。我理解为集成电路之间用以数据传输的线路。
IIC的发展:
IIC总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。
IIC的特点:
IIC总线最主要的优点是其简单性和有效性。由于接口直接在组件之上而且只有两根信号线,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。I2C总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
IIC总线操作方法:
IIC总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。笔者分别配合时序图来说明:
开始信号与结束信号:
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。
一定要注意时序的精准性!这两个信号成功的关键是:
① 在SDA的整个变化期间,SCL是一直保持稳定的高电平的。SCL监视SDA的整个变化而不只是开始信号中的负跳变或者结束信号的正跳变。
② 要注意到IIC总线的传输速度为Kbps级,而AVR单片机工作频率为Mbps级,所以必不可少的要用us级延时函数_delay_us()将单片机速度降下来配合IIC时序。
首先要知道器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。如上应答信号时序,SCL线为主机(微控制器)控制,DATA IN表示从机接受数据情况,DATA OUT表示从机发送数据情况。如图可见,在START信号之后,从器件在8个时钟脉冲的控制下接受数据,在此期间从机并未发出任何信号!而在第9个时钟期间,从机将SDA线拉低表示应答。
所以,应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
关于SDA上的数据变化
如上图所见,当SCL为高电平时要求DATA STABLE即数据稳定,而在SCL低电平时才可以DATA CHANGE即数据改变。所以IIC总线协议要求只有在SCL为低电平是SDA上的数据才可以改变。因为若SCL处于高电平期间,SDA上的电平无论发生上升沿还是下降沿,都会被识别为一次开始或结束信号。
4、字节传输时序
上时序是一个个完整的IIC字节传输周期,从左往右,起始信号之后:
如果是写字节,前8个时钟周期中的SCL上升沿将数据写入数据接收方,接着在第九个周期数据接收方发出应答信号;
而如果是读字节,前8个时钟周期中的SCL上升沿将数据从数据发送方读出到SDA线上,并且数据接收方在第九个周期选择发送怎样的应答信息到SDA线上;
如果使用中断方式的IIC,要把上图中的英文字看明白。
CEPARK AVR开发板上集成了Two-wire Serial EEPROM 24C02,全面兼容IIC协议,具有256X8 bit
存储空间,也就是2k位(注意是2K位不是2K字节)。我们来看看CEPARK AVR 开发板的AT24C02模块原理图:
A0、A1、A2三个引脚为AT24C02的硬件地址线,根据引脚上的电平决定当前器件的硬件地址。
WP为AT24C02的写保护引脚,当该引脚为高电平时,器件只读不写。
SCL、SDA分别为器件的IIC协议接口。
注意到SCL和SDA分别接了两个10K上拉电阻,我想重点讲讲这两个上拉的作用。
我们从上面的几个时序可以看到,IIC传输的基本模式是“起始信号——数据传输——应答——结束”,那么要在我们的AVR Mega16上应用,毫无疑问,连接SDA的IO口要适当的在输出口和输入口两个状态间改变。这样就显得比较繁琐。然而我们可以巧妙地利用IO口的原理和这两个上拉电阻。听我说来:
首先,AVR单片机的IO口具有三态输出,高电平,低电平,高阻态。无论你水平多低,至少肯定知道前面两个。什么是高阻态呢?就是电阻无限大,你可以想象IO内部连接了一个无限大的电阻,对外表现近似开路;
其次,我们还知道器件的IO口一般都具有线与的关系,即有“0”得“0”;
好了,知道以上两条就够了。SCL和SDA两条线,具体说来一共就是五种操作:SCL拉高、SCL置低、SDA输出高、SDA输出低、还有SDA设置为输入口,来看程序怎么做:
PORTx=0x00;//先把PORTx寄存器永远配置为0,不再改变
DDRx=0//IO设置为输出口,则IO输出低电平
DDRx=0x00;//IO设置为输入口,而此时IO输出高电平
前面两句应该很容易理解,但是第三句为什么将IO设置为输入口会使IO输出高电平呢?
其实此处的“将IO设置为输入口”,并不是指我们真的将要读取数据,刚才说明的“首先…..”道出了缘由:当IO设置为PORTx=0;DDRx=0;时,IO口对外呈现高阻态,近似开路。所以外部电路其实是通过10K的上拉电阻接在了5V电源上,把IO“拉”成了高电平。所以我们若要IO输出高电平,即将其设置为高阻态就可以了。
当IO用确切做输入口的时候,上拉确实是把IO拉成了高电平,会不会影响数据读取呢?看到上面强调的''即有0得0”,明白了么?电路被电源拉成了高电平,但是线路上最终的电平状态还是取决于IIC器件发出的数据&是否有0”。所以外部上拉并不会影响IO做输入状态用。
所以我们只需要用三句程序,就可以借助外部上拉完成IIC的五个操作。即(SCL拉高、SCL置低、SDA输出高、SDA输出低、还有SDA设置为输入口)
AT24C02的读写时序完全遵循标准的IIC读写时序,但是我们接下来还要了解AT24C02的器件操作方法:
上图为AT24C系列的地址寄存器,AT24C02具有2K bit,所以看到第一行。我们看到写地址寄存器的数据,最高位MSB永远是1,高四位为固定值,接下来A2,A1,A0就是前面说到的器件硬件地址,如果你写(A2,A1,A0)=(0,0,0)就对应到器件此三个引脚都接到地的那个器件。
最低位LSB是读写命令位,如果为1则表示“将要对这个器件进行‘读’操作”,反之为“写”。
这个是AT24C02的字节写时序,很清晰,由左到右(我写中文):
“起始信号——指定器件(写)——从器件应答——再写存储器内部空间地址——从器件应答——写数据到指定器件指定存储地址——从器件应答——结束信号”
MSB指最高位,LSB指最低位,上图看出数据传输都是从最高位开始;
R/W表示低电平为“写”(Write)高电平为读“Read”;
AT24C02的存储空间是2K bit,即256个字节。所以存储器寻址空间为0~255(0x00~0xff),上图的星号所以表示不需要第九位数据来寻址(但是更大容量器件就需要);
上图是AT24C02随机地址读时序,就是任意指定一个地址位置读出数据:
“起始信号——器件地址(写)——应答——指定存储空间地址——应答——起始信号——器件地址(读)——应答——读出数据——不需要应答——结束信号”
我们看到,随机读时序还是以写器件的硬件地址和存储空间地址为前提;
注意后一个器件地址,末位为“读”命令;
读出的数据仍然是高位MSB开始
读取完之后,数据读取方(也就是AVR单片机)并不需要产生应答信号
上述就是笔者的程序用到的两个时序,实现了“对AT24C02的任意地址写,并再从任意地址读”的功能。本来,存储器嘛,不是读就是写咯。以下附上详细注释的源程序和器件资料:
游客,如果您要查看本帖隐藏内容请
最后是程序注意事项:
1、笔者大部分地方都用了10us的延时来配合IIC的时序;
2、要十分注意每次IIC时序之后的SCL和SDA线的状态,最好SCL保持低电平,以免产生不必要的起始和结束信号;
3、主机读取应答信号时,要将IO置为输入状态,要注意DDRx的延迟效应;
4、要注意任意两次完整的读写之间一定要有至少10ms的延时;(我就是卡在这点上,因为根本无资料可查,当时是靠感觉才加了20ms的延迟,没想到真的是这个原因)
写在最后:其实AVR单片机是自带了IIC接口的,叫TWI。并且GCC AVR也提供了调用函数,某种程度上来说用起来也许更为方便。但是此处仍然用IO口模拟IIC接口的方法,是觉得这样更能够掌握到IIC的底层协议,更有助于对IIC协议的理解,大部分的教程也都是这么做的。仁者见仁吧!
希望能给有需要的朋友一点帮助
本帖子中包含更多资源
才可以下载或查看,没有帐号?
这个很需要。。。不过I2C协议好像不常用
很强大,可以做成,相配套的PDF文档。
很强大,可以做成,相配套的PDF文档。
hnrain 发表于
呵呵,我也有此打算
楼主做成pdf就更好了
喜欢,顶!楼主的帖子我都收藏了!
当你要使用串口EEPROM,驱动其它窜口电路,例如段码液晶控制器,测温等等,那就用上了。
很好,特别是一些应用的关键,例如10毫秒间隔,一般书上都不会讲到
楼主做成pdf就更好了
harbeth 发表于
这个系列快写完了,到时候再一起汇总成PDF上传,希望大家支持
很好,特别是一些应用的关键,例如10毫秒间隔,一般书上都不会讲到
korewa 发表于
同学,应该是微秒......
losingamong
最后是程序注意事项:
1、笔者大部分地方都用了10us的延时来配合IIC的时序;
2、要十分注意每次IIC时序之后的SCL和SDA线的状态,最好SCL保持低电平,以免产生不必要的起始和结束信号;
3、主机读取应答信号时,要将IO置为输入状态,要注意DDRx的延迟效应;
4、要注意任意两次完整的读写之间一定要有至少10ms的延时;(我就是卡在这点上,因为根本无资料可查,当时是靠感觉才加了20ms的延迟,没想到真的是这个原因)
////////////////////
我指的是你说的第4点。没错吧?
回复&&losingamong
最后是程序注意事项:
1、笔者大部分地方都用了10us的延时来配合IIC的时序;
2、要十 ...
korewa 发表于
我以为你说第一点,呵呵.......呵......
喜欢啊,老蒙做好了,发我邮箱吧,嘻嘻
喜欢啊,老蒙做好了,发我邮箱吧,嘻嘻
alex001 发表于
不要偷懒嘛,自己来下
好东西,版主来汇总一下,以后直接把这些贴在汇总贴多好啊,嘿嘿
不要偷懒嘛,自己来下
losingamong 发表于
& & 这么铁面无私啊,走个后门也不行啊,哈哈
好东西,版主来汇总一下,以后直接把这些贴在汇总贴多好啊,嘿嘿
造化为工 发表于
& & 关于汇总的问题,我的建议是不要急着汇总。
这样分片贴出来的目的是为了让大家看一部分学一部分,如果直接汇总后,你是否还会一个一个详细看呢
losingamong
& & 写得不错,很深入
看看。谢谢了。
datasheet里面就有啊,在时间表里
好东西,学习了,正在做这个呢,我的IIC任务可重了,EEROM、时钟芯片、从单片机都用IIC不知道会不会时序冲突呢。
好东西,学习了,正在做这个呢,我的IIC任务可重了,EEROM、时钟芯片、从单片机都用IIC不知道会不会时序冲 ...
jingshuai777 发表于
时钟芯片是SPI总线的呀,单片机那么多IO,分开来用应该就没有问题了
回复是种美德!
站长推荐 /1
18X24厘米超大PCB功能底板,板载19个芯片集成38大功能模块,扩展核心板9.5X6厘米,完美支持AT&STC51、AVR、PIC、MSP430、ARM、STM32、M0等等,配超大精美铝箱、触摸彩屏、OLED液晶....
Powered byeeprom的上拉电阻多大合适? - 维库电子市场网
eeprom的上拉电阻多大合适?
作者:行星 栏目:
的上拉电阻多大合适?我用的芯片,5V供电,上拉电阻为可是总是不行,请问是上拉电租的问题吗?上拉电阻应该用多大比较好?
作者: liudewei 于
16:19:00 发布:
5K左右就可以,我一直用10k没问题&
作者: 香如故 于
19:48:00 发布:
我没有接电阻,也可以用啊51i/o口p1,p2,p3内部有上拉电阻
作者: qjy_dali 于
19:49:00 发布:
那要看你想把I2C的速度定在多少&
作者: d1276 于
21:02:00 发布:
不会吧,是和51CPU连接吗?不用上拉电阻也可以的,能达到400K你的程序有问题吧?如果能读出,不能写入,是不是写的时候,保护脚不是低电平?
作者: 行星 于
9:17:00 发布:
谢谢楼上的,我用的是51单片机我用的是51单片机的p1.2,p1.3两个i/o口,收和发都是多字节,每次16个字节,但是程序跑不通?不知哪里出了问题?
作者: xwj 于
12:19:00 发布:
不是上拉电阻的问题,检查程序!&
作者: 行星 于
15:20:00 发布:
我的保存子程序是这样的,可是不知为什么不对?;****************************************;将XRAM中的数据保存在对应键值的中;占用内部资源: R0,R1,R2,R3,ACC,Cy,&&R4,R5,R6;入口参数:SUBA器件子地址,KRYNUM,&&SLA,NUMBYTE,MTD;出口参数:;使用前须定义变量:&&SLA 器件从地址&&SUBA器件子地址&&NUMBYTE读/写的字节数 ,MTD发送缓冲区;***************************************SAVE_XRAM_:&&&&MOV&&&&A,KEYNUM&&&&MOV&&&&B,#16&&&&MUL&&&&AB&&&&MOV&&&&SUBA,A&&&&MOV&&&&SLA,#&&&&MOV&&&&NUMBYTE,#16;--------------------传送16字节到缓冲区;&&&&&&&&;XRAM的起始地址0000H&&&&MOV&&&&WRITE_TMP,#00H&&&&MOV&&&&R1,#MTD&&&&;&&&&MOV&&&&R5,#16&&&&MOV&&&&R0,WRITE_TMP&&&&;装发送缓冲区16个数据W_T1:&&&&MOVX&&&&A,@R0&&&&MOV&&&&@R1,A&&&&INC&&&&R0&&&&INC&&&&R1&&&&DJNZ&&&&R5,W_T1&&&&MOV&&&&WRITE_TMP,R0&&&&LCALL&&&&IWRNBYTE&&&&;保存在中&&&&MOV&&&&A,SUBA&&&&INC&&&&A&&&&&&&&MOV&&&&SUBA,A&&&&&&&&;装下一页地址到SUBA中&&&&MOV&&&&R5,#16&&&&MOV&&&&R1,#MTD&&&&MOV&&&&R0,WRITE_TMP;&&&&MOV&&&&R6,WRITE_TMP&&&&CJNE&&&&R0,#00H,W_T1 ;共写入256个字节&&&&RET;######################################################################我的程序那里不对啊?怎么数据总是不对?
讨论内容:
Copyright &
浙ICP证030469号

我要回帖

更多关于 上拉电阻一般多大 的文章

 

随机推荐