- 1、本文档共86页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章 应用举例 8.1 用 SMBus 实现串行FLASH芯片的读写 8.2 日历时钟与键盘显示 8.3 用过采样和求均值提高ADC分辨率 8.4 电压谐波监测 8.5 液晶显示程序 8.6 GPRS与SMS的应用 8.7 μCosII在C8051F单片机上的移植 8.1 用 SMBus 实现串行FLASH芯片的读写 8.1.1FLASH芯片概述 快速擦写存储器(FLASH Memory)是Intel公司于20世纪80年代后期推出的新型存储器。它是在EEPROM工艺的基础上,增强了芯片在线电擦除和可再编程功能,是性能价格比和可靠性最高的可读写非易失存储器,因而在嵌入式系统中得到了广泛的应用。 FLASH根据读写的方式可分为并行FLASH和串行FLASH: 并行FLASH的地址和数据信号是并行输入/输出的,芯片的引脚数较多。一般容量比较大,速度比较快。 串行Flash的地址和数据信号是串行输入/输出的,芯片的引脚数较少,芯片尺寸小,功耗低。 8.1.2串行FLASH芯片的通讯协议 串行FLASH的读写是通过对SDA(串行数据)和SCL(串行时钟)引脚进行控制来实现的。SDA一般仅在SCL信号为低电平时发生改变表示传送的数值,SDA信号在SCL信号为高电平时发生改变时表示开始和停止条件。 开始条件:在SCL为高的条件下,SDA从高电平变为低电平,表示开始传送。每个命令发送前必须产生一个开始条件。 停止条件:在SCL为高的条件下,SDA从低电平变为高电平,表示停止条件。一般在FLASH读写操作完成后发送,结束当前操作。 应答:所有的数据都以串行方式传送的,每次传送8位,在第9个时钟时,接收方应对接收的数据进行应答。 1.设备地址 在工作时,可以将多个串行FLASH接在相同的SDA和SCL连线上,为了对指定的FLASH芯片进行操作,必须为每个芯片分配一个独立的设备地址,设备地址由芯片的地址脚进行配置。 在进行读写操作前必须先发送所要操作设备的地址,格式如下: 其中LSB位表示操作的类型,当进行读操作时LSB位置为1,进行写操作时LSB位置为0。 2.字节写 首先主设备(host)发送开始标志。 然后主设备发送设备地址,此时的R/W位为0,表示写操作。FLASH(从设备target)收到地址后,发送ACK(即二进制0)进行应答,表示接收成功。 接着主设备将存储单元的地址发送给从设备。AT24C128芯片是128K位的FLASH芯片,共有16K个字节单元,即存储单元的地址可用14位表示即可。由于每次发送必须发送8位,因此将14位地址扩充为16位,分两次发送,先发送高地址,后发送低地址。高地址的最高2位为扩展位,可为任意值。FLASH收到高、低地址信息后,分别应答ACK,表示接收成功。 主设备将需写入的数据发送给FLASH,FLASH应答ACK,表示接收成功。 主设备发送停止条件,结束本次操作。 3.页写入操作 AT24C128芯片可以对一个页(64个字节)中的数据进行连续写操作,写操作时序如图8-5所示。由图可知其操作过程和字节写类似,在写完一个字节,FLASH应答ACK后,接着发送下一个字节数据。 4.当前地址读操作 当前地址读操作从前一次读写操作地址单元的下一个地址单元中读取数据。操作时先发送设备地址,然后FLASH返回读出的数据,主设备发送NO ACK表示读取操作完成,并发送结束标志。 5.随机读操作 如果想读取用户指定单元的内容,即进行随机读操作,必须先进行一次虚写操作,即向指定单元进行写操作,但不发送要写入的数据,而是重新产生开始条件,启动一次当前地址读操作。 6.顺序读操作 采用当前地址读或随机读操作时,如果每次读取完成后应答ACK,而不是NACK,将会启到顺序读操作,FLASH将会把下一单元的内容发送给主机,直到收到NACK应答为止。 //在SMBus中断服务程序中用于保存从地址和 R/W位 char COMMAND; // 保持SMBus要发送的数据字节或刚收到的数据 char WORD; //用于检查发送的是高地址、低地址还是数据字节 char BYTE_NUMBER; // EEPROM存储器地址的高、低字节 unsigned char HIGH_ADD, LOW_ADD; //该位在发送或接收开始时被置1,操作结束后由中断服务程序清0 bit SM_BUSY; void main (void) { unsigned char check; // 用于测试目的 WDTCN = 0xde; // 禁止看门狗定时器 WDTCN = 0xad; OSCICN |= 0x03; // 设置内部振荡器为最高频率(1
文档评论(0)