C8051F02x第八章

  • 格式:pdf
  • 大小:368.94 KB
  • 文档页数:61

4作从前一次读写操作地址单元的下一个地址单 元中读取数据。操作时先发送设备地址,然后FLASH返回读 元中读取数据。操作时先发送设备地址,然后 返回读 出的数据,主设备发送 表示读取操作完成, 出的数据,主设备发送NO ACK表示读取操作完成,并发送 表示读取操作完成 结束标志。 结束标志。 10
7
8
3.页写入操作 页写入操作
AT24C128芯片可以对一个页(64个字节)中的数据进行连 芯片可以对一个页( 个字节 个字节) 芯片可以对一个页 续写操作,写操作时序如图8-5所示 所示。 续写操作,写操作时序如图 所示。由图可知其操作过程 和字节写类似,在写完一个字节, 应答ACK后,接 和字节写类似,在写完一个字节,FLASH应答 应答 后 着发送下一个字节数据。 着发送下一个字节数据。 9
5.随机读操作 随机读操作
如果想读取用户指定单元的内容,即进行随机读操作, 如果想读取用户指定单元的内容,即进行随机读操作,必须 先进行一次虚写操作,即向指定单元进行写操作, 先进行一次虚写操作,即向指定单元进行写操作,但不发送 要写入的数据,而是重新产生开始条件, 要写入的数据,而是重新产生开始条件,启动一次当前地址 读操作。 读操作。 11
•开始条件:在SCL为高的条件下,SDA从高电平变为低电平,表示开始 开始条件: 为高的条件下, 从高电平变为低电平, 开始条件 为高的条件下 从高电平变为低电平 传送。每个命令发送前必须产生一个开始条件。 传送。每个命令发送前必须产生一个开始条件。 •停止条件:在SCL为高的条件下,SDA从低电平变为高电平,表示停止 停止条件: 为高的条件下, 从低电平变为高电平, 停止条件 为高的条件下 从低电平变为高电平 条件。一般在 读写操作完成后发送, 条件。一般在FLASH读写操作完成后发送,结束当前操作。 读写操作完成后发送 结束当前操作。 •应答:所有的数据都以串行方式传送的,每次传送8位,在第 个时钟 应答:所有的数据都以串行方式传送的,每次传送 位 在第9个时钟 应答 时,接收方应对接收的数据进行应答。 接收方应对接收的数据进行应答。
MSB
1 0 1 0 0 A1 A2
LSB
R/W
其中LSB位表示操作的类型,当进行读操作时LSB位置为 ,进行写操 位表示操作的类型,当进行读操作时 位置为1, 其中 位表示操作的类型 位置为 作时LSB位置为 。 位置为0。 作时 位置为
6
2.字节写 字节写
•首先主设备(host)发送开始标志。 首先主设备( 首先主设备 )发送开始标志。 •然后主设备发送设备地址,此时的R/W位为 ,表示写操作。FLASH(从 然后主设备发送设备地址,此时的 位为0,表示写操作。 然后主设备发送设备地址 位为 ( 设备target)收到地址后,发送 设备 )收到地址后,发送ACK(即二进制 )进行应答,表示接收 (即二进制0)进行应答, 成功。 成功。 •接着主设备将存储单元的地址发送给从设备。AT24C128芯片是 接着主设备将存储单元的地址发送给从设备。 芯片是128K位 接着主设备将存储单元的地址发送给从设备 芯片是 位 芯片, 个字节单元, 的FLASH芯片,共有 芯片 共有16K个字节单元,即存储单元的地址可用 位表示 个字节单元 即存储单元的地址可用14位表示 即可。由于每次发送必须发送8位 因此将14位地址扩充为 位地址扩充为16位 即可。由于每次发送必须发送 位,因此将 位地址扩充为 位,分两次 发送,先发送高地址,后发送低地址。高地址的最高2位为扩展位 位为扩展位, 发送,先发送高地址,后发送低地址。高地址的最高 位为扩展位,可为 任意值。 收到高、 任意值。FLASH收到高、低地址信息后,分别应答 收到高 低地址信息后,分别应答ACK,表示接收成功。 ,表示接收成功。 •主设备将所要写入的数据发送给 主设备将所要写入的数据发送给FLASH,FLASH应答 应答ACK,表示接收成 主设备将所要写入的数据发送给 , 应答 , 功。 •主设备发送停止条件,结束本次操作。 主设备发送停止条件,结束本次操作。 主设备发送停止条件
void main (void) {
unsigned char check; WDTCN = 0xde; WDTCN = 0xad; OSCICN |= 0x03; XBR0 = 0x01; XBR2 = 0x40; SMB0CN = 0x44; SMB0CR = -80; EIE1 |= 2; EA = 1; SM_BUSY = 0; // 用于测试目的 // 禁止看门狗定时器 // 设置内部振荡器为最高频率 设置内部振荡器为最高频率(16 MHz) // 通过交叉开关将 通过交叉开关将SMBus连到通用 引脚 连到通用I/O引脚 连到通用 // 允许交叉开关和弱上拉 // 允许 允许SMBus在应答周期发送 在应答周期发送ACK 在应答周期发送 // SMBus时钟频率 = 100kHz. 时钟频率 // SMBus中断允许 中断允许 // 全局中断允许 // 为第一次传输释放 为第一次传输释放SMBus
2
16M位(2M*8)的FLASH芯片 位 ) 芯片
M29F016D的引脚图
3
其中A1、 用来设定芯片的地址 用来设定芯片的地址, 其中 、A0用来设定芯片的地址,VCC和 和 GND为供电引脚,SCL为串行时钟,SDA为 为供电引脚, 为串行时钟, 为 为供电引脚 为串行时钟 为写保护控制。 串行数据, 串行数据,WP为写保护控制。 为写保护控制
5
1.设备地址 设备地址 在工作时,可以将多个串行 接在相同的SDA和SCL连线上,为 连线上, 在工作时,可以将多个串行FLASH接在相同的 接在相同的 和 连线上 了对指定的FLASH芯片进行操作,必须为每个芯片分配一个独立的设 芯片进行操作, 了对指定的 芯片进行操作 备地址,设备地址由芯片的地址脚进行配置。 备地址,设备地址由芯片的地址脚进行配置。 在进行读写操作前必须先发送所要操作设备的地址,格式如下: 在进行读写操作前必须先发送所要操作设备的地址,格式如下:
•并行 并行FLASH的地址和数据信号是并行输入 输出的,芯片的引脚数较多。 的地址和数据信号是并行输入/输出的 并行 的地址和数据信号是并行输入 输出的,芯片的引脚数较多。 一般容量比较大,速度比较快。 一般容量比较大,速度比较快。 •串行 串行Flash的地址和数据信号是串行输入 输出的,芯片的引脚数较少,芯 的地址和数据信号是串行输入/输出的 串行 的地址和数据信号是串行输入 输出的,芯片的引脚数较少, 片尺寸小,功耗低。 片尺寸小,功耗低。
第8章 应用举例
8.1 用 SMBus 实现串行 实现串行FLASH芯片的读写 芯片的读写 8.2 日历时钟与键盘显示 8.3 用过采样和求均值提高 用过采样和求均值提高ADC分辨率 分辨率 8.4 电压谐波监测
1
8.1 用 SMBus 实现串行FLASH芯片的读写
8.1.1FLASH芯片概述 芯片概述 快速擦写存储器( 公司于20世纪 快速擦写存储器(FLASH Memory)是Intel公司于 世纪 ) 公司于 世纪80 年代后期推出的新型存储器。它是在 工艺的基础上, 年代后期推出的新型存储器。它是在EPROM工艺的基础上,增 工艺的基础上 强了芯片在线电擦除和可再编程功能, 强了芯片在线电擦除和可再编程功能,是性能价格比和可靠性最 高的可读写非易失存储器, 高的可读写非易失存储器,因而在嵌入式系统中得到了广泛的应 用。 FLASH根据读写的方式可分为并行 根据读写的方式可分为并行FLASH和串行 和串行FLASH。 根据读写的方式可分为并行 和串行 。
SM_Send(CHIP_A, 0x0088, 0x53); //发送数据 发送数据0x53到CHIP_A的0x88地址 发送数据 到 的 地址 check = SM_Receive(CHIP_A, 0x0088); // 读CHIP_A的地址 的地址0x88 的地址
} 14
void SM_Send (char chip_select, unsigned int byte_address, char out_byte) { while (SM_BUSY); // 等待 等待SMBus空闲 空闲 SM_BUSY = 1; // 占用SMBus设置为忙 占用 设置为忙 SMB0CN = 0x44; // SMBus允许应答周期发 允许应答周期发ACK 允许应答周期发 BYTE_NUMBER = 2; // 2地址字节 地址字节 COMMAND = (chip_select | WRITE); // 芯片地址 WRITE 芯片地址+ HIGH_ADD = ((byte_address >> 8) & 0x00FF); // 高8位地址 位地址 LOW_ADD = (byte_address & 0x00FF); // 低8位地址 位地址 WORD = out_byte; // 待写数据 STA = 1; // 启动传输过程 }
6.顺序读操作 顺序读操作
采用当前地址读或随机读操作时, 采用当前地址读或随机读操作时,如果每次读取完成后应答 ACK,而不是 ,而不是NACK,将会启到顺序读操作,FLASH将会 ,将会启到顺序读操作, 将会 把下一单元的内容发送给主机,直到收到 应答为止。 把下一单元的内容发送给主机,直到收到NACK应答为止。 应答为止 12
//在SMBus中断服务程序中用于保存从地址和 R/W位 在 中断服务程序中用于保存从地址和 位 char COMMAND; // 保持 保持SMBus要发送的数据字节或刚收到的数据 要发送的数据字节或刚收到的数据 char WORD; //用于检查发送的是高地址、低地址还是数据字节 用于检查发送的是高地址、 用于检查发送的是高地址 char BYTE_NUMBER; // EEPROM存储器地址的高、低字节 存储器地址的高、 存储器地址的高 unsigned char HIGH_ADD, LOW_ADD; //该位在发送或接收开始时被置 ,操作结束后由中断服务程序清 该位在发送或接收开始时被置1, 该位在发送或接收开始时被置 0 bit SM_BUSY; 13