摘要: 详细说明了如何将MAX7651/MAX7652 12位数据采集接口连接到24co2 2线串行EEPROM。
本文介绍了将MAX7651和MAX7652 12位数据采集系统连接到24co2 2线串行EEPROM所需的具体硬件描述和软件例程。提供了详细的软件代码。由于MAX7651/52基于标准8051处理器核心,因此这里提供的信息对任何基于标准8051的设计都很有用。
24Cxx系列2线串行eeprom广泛应用于8051微处理器系统。虽然MAX7651/MAX7652闪存可编程12位数据采集系统具有16K的内部闪存,但有许多“传统”产品使用小型且廉价的外部存储器。
这个应用笔记提供了基本的2线写和读软件子程序。它们可以很容易地修改,以解决eeprom的附加功能,如内存保护和银行寻址。
24co2串行EEPROM有许多衍生产品,其中包括额外的内存和页面寻址。24co2被广泛使用,是本例中使用的部件。其他派生部分可以使用此代码,只需稍作修改。
24Cxx系列使用两条I/O线进行接口:SCL(串行时钟)和SDA(串行数据)。SCL边有不同的功能,这取决于一个设备是被读取还是被写入。当时钟数据进入设备时,时钟的正边锁存数据。负时钟将时钟数据移出设备。
SDA信号是双向的,并且物理上是一个开漏,因此多个eeprom或其他设备可以共享引脚。SCL和SDA都必须在外部拉高。
EEPROM使用的协议部分基于EEPROM发送的ACK(确认)位,如果发送给它的数据已被接收。所有的地址和数据都是用8位字发送的。EEPROM在第9个时钟周期内以低位周期发送ACK。EEPROM在SCL和SDA引脚上寻找特定的转换以符合READ和WRITE的要求。
SDA引脚上的数据可能只在SCL低的时候改变。在SCL高周期内的数据变化指示启动或停止条件。START条件是SDA随SCL高从高到低的转换。所有数据传输必须以START条件开始。
停止条件是SDA低到高的转换,SCL高。所有数据传输必须以STOP条件结束。READ后,STOP将EEPROM置于备用电源模式。有关启动和停止条件,请参见图1。
图1所示。启动和停止条件。
24co2有3个物理引脚,指定为A2, A1和A0,它们绑定到逻辑1或0电平。这允许8个唯一的硬件地址,因此多达8个24c02可以共享SCL和SDA线而不会发生冲突。有一个内部地址比较器,查找主控制器发送的地址与24co2唯一的7位地址之间的匹配,该地址部分由A2、A1和A0确定。参见下面的表1。
最高有效位 | LSB | ||||||
1 | 0 | 1 | 0 | A2 | A1 | A0 | R / W ~ |
设备地址在START条件之后立即发送。前四位是序列“1010”,这是一个简单的“噪声滤波器”,可以防止线路上的随机噪声突发进入设备。发送的最后一位是1表示READ, 0表示WRITE。下面的代码示例用于随机READ/WRITE操作。该部件还可以通过稍微修改代码来执行页面写入/顺序读取。更多信息请参见24co2数据表。
字节写入序列如图2所示。在接收到START条件和设备地址后,如果设备地址与它自己的唯一地址匹配,EEPROM发送ACK。MAX7651等待ACK,如果ACK不存在,则终止通信。接下来,发送一个8位字节地址,然后是另一个ACK。然后MAX7651发送8位数据字节,等待第三次ACK,并发送一个STOP条件。
图2 写操作。
重要的是要注意,在收到STOP条件后,EEPROM内部等待将数据存储到其内部存储器阵列中。这可能需要长达10毫秒的时间。当内部EEPROM被编程时,24co2将忽略尝试访问。可以轮询该部件以完成内部写周期。这包括发送另一个START条件(也称为repeat START),后面跟着设备地址字节。注意,在这种情况下,没有发送STOP条件。如果内部编程周期完成,EEPROM将发送ACK。MAX7651也可以被编程为在继续之前等待10ms。
从随机地址的24co2 EEPROM中读取一个字节需要在READ之前执行一个虚拟的WRITE操作。参见图3。
顺序为:
开始的条件
用R/~W = 0 'dummy WRITE'命令发送设备地址
等待ACK
发送字节存储器地址
等待ACK
发送重复启动条件
发送R/~W = 1的设备地址(读取命令)
等待ACK
首先将8个数据位读入MAX7651, MSB
没有应答
停止条件
这个序列相当复杂!READ所需的SCL转换总数是38。
图3 读操作。
下面的汇编语言代码示例假设在设备0H处寻址一个24co2 EEPROM(即A2 = A1 = A0 = ground)。MAX7651使用两个未使用的通用I/O端口引脚对串行时钟(SCL)和双向数据线(SDA)进行位bang。需要两个内部RAM位置:EE_ADDR存储字节地址,EE_DATA存储数据。
;EEPROM例程为24C02,具有A2 = A1 = A0 = 0
, | , | , | |
EE_WRITE: | 调用 | EE_START | ;发送一个起始标志到eeprom |
MOV | # 0 a0h | ;指定一个写eeprom @地址0h | |
调用 | 喊 | ;移出设备地址 | |
JC | WR_ABORT | ;如果没有从eeprom返回,则中止 | |
MOV | , EE_ADDR | ;获取eeprom内存地址 | |
调用 | 喊 | ;移出内存地址 | |
JC | WR_ABORT | ;如果没有从eeprom返回,则中止 | |
MOV | , EE_DATA | ;获取要写入的数据 | |
调用 | 喊 | ;移出数据 | |
JC | WR_ABORT | ; | |
CLR | C | ; | |
WR_ABORT: | 调用 | EE_STOP | ;将停止条件发送到eeprom |
;等待24co2 {10ms}的写入时间
;EEPROM需要10ms来内部存储数据。你可以选择
;将微控制器置于等待状态,或继续执行;
;记住EEPROM数据不是存储10ms的!
受潮湿腐烂 | ;回到主程序 |
;读取eeprom数据-首先执行' dummy write '
EE_READ: | MOV | EE_DATA # 00 h | ;清理旧数据 |
调用 | EE_START | ;发送一个起始标志到eeprom | |
MOV | # 0 a0h | ;指定写入eeprom @地址0h | |
调用 | 喊 | ;执行“虚拟写入” | |
JC | RD_ABORT | ;没有返回则中止 | |
MOV | , EE_ADDR | ;加载eeprom存储器位置 | |
;从中阅读 | |||
调用 | 喊 | ;写入eeprom存储器位置 | |
JC | RD_ABORT | ;没有返回则中止 |
;现在读取数据!
EE_WRITE: | 调用 | EE_START | ;发送一个开始标志 |
MOV | # 0 a1h | ;指定从eeprom读取 | |
调用 | 喊 | ;移出eeprom地址 | |
JC | RD_ABORT | ;没有返回则中止 | |
调用 | 胫骨 | ;从eeprom移入数据 | |
MOV | EE_DATA, | ;存储数据 | |
调用 | 钠钾共晶合金 | ;发送一个nak(不承认)到 | |
;eepm | |||
CLR | C | ;清除错误标志 | |
RD_ABORT: | 调用 | EE_STOP | ;全部完成 |
受潮湿腐烂 | ; |
;Ee_start位bang表示从开始序列到eeprom(从高到低sda)的转换
;SCL高)。
EE_START: | SETB | SDA | |
SETB | sci | ;设置两个位 | |
NOP | ;延迟 | ||
CLR | SDA | ;开始的条件;从高到低的过渡 | |
NOP | |||
NOP | ;Eeprom访问延时 | ||
CLR | sci | ||
CLR | C | ;清除错误标志 | |
受潮湿腐烂 | ;全部完成 |
;Ee_stop发送一个停止序列到eeprom(低到高sda转换)
;SCL高)。
EE_STOP: | CLR | SDA | |
NOP | |||
NOP | |||
SETB | sci | ||
NOP | |||
NOP | ;设置时间延迟 | ||
SETB | SDA | ;发送一个停止条件 | |
受潮湿腐烂 |
;大喊将数据移出到eeprom
喊: | 推 | B | |
MOV | B, # 8 | ;保存b并加载位计数 | |
EEOUT: | RLC | 一个 | ;左移位(rlc =左旋转) |
;携带) | |||
MOV | SDA C | ;从进位中获取数据位 | |
NOP | |||
SETB | sci | ;1位时钟 | |
NOP | ;时钟高时间 | ||
CLR | sci | ;时钟现在很低 | |
DJNZ | B, EEOUT | ;做8次 | |
SETB | SDA | ;释放sda | |
NOP | |||
NOP | |||
SETB | sci | ;ACK时钟 | |
NOP | |||
MOV | C, SDA | ;得到回报 | |
CLR | sci | ;清除时钟钻头 | |
流行 | B | ;还原b的值 | |
受潮湿腐烂 |
;将数据从eeprom移入
心: | SETB | SDA | ;将sda作为输入 |
推 | B | ||
MOV | B, # 8 | ;保存b并设置位计数器 | |
EEIN: | NOP | ||
SETB | sci | ;设置时钟 | |
NOP | |||
NOP | ;Eeprom存取时间 | ||
SETB | SDA | ;Set = 1作为输入 | |
MOV | C, SDA | ;读1比特 | |
RLC | 一个 | ;左移位 | |
CLR | sci | ;清零时钟位 | |
DJNZ | B, EEIN | ;如果读取少于8位,则获取下一位 | |
流行 | B | ||
受潮湿腐烂 |
;Ack发送一个eeprom确认
应答: | CLR | SDA | |
NOP | |||
NOP | |||
SETB | sci | ;时钟时钟 | |
NOP | |||
CLR | sci | ;把时钟调低 | |
受潮湿腐烂 |
;Nak发送一个no acknowledgement
否定: | SETB | SDA | |
NOP | |||
NOP | |||
SETB | sci | ;给闹钟计时 | |
NOP | |||
CLR | sci | ;把时钟调低 | |
受潮湿腐烂 |
社群二维码
关注“华强商城“微信公众号
Copyright 2010-2023 hqbuy.com,Inc.All right reserved. 服务热线:400-830-6691 粤ICP备05106676号 经营许可证:粤B2-20210308