《MSP430 EEPROM-24C512使用总结及代码说明》由会员分享,可在线阅读,更多相关《MSP430 EEPROM-24C512使用总结及代码说明(27页珍藏版)》请在金锄头文库上搜索。
1、EEPROM AT24C512 24C512是Atmel公司生产的64KB串行电可擦除可编程存储器 EEPROM 24C512内部有512K位 bit 共64K字节 分为512页 Page 每页128字节 地址为16位 范围为0000 FFFFH 采用8引脚DIP封装 通过2个地址引脚可以 在总线上并联4片24C512 编号编号引脚引脚功能功能 1A0地址输入 用来区分芯片 一般接地 即可 悬空为地址0 2A1 3NC未使用 4GND电源地 5SDA串行数据输入输出 6SCL串行时钟输入 7WP写保护 高电平写保护 悬空接地 8VCC可接5v 2 7v 1 8v三种电压 24C512典型连接方
2、式 A0 A1接地 地址为0 多片24C512需要通过高低电平设置不同的地址 WP接地为可读写 当然 WP也可以通过跳线或软件控 VCC为5 0v 2 7v 1 8v三种之一 芯片自适应 电压越高 工作频率越高 SCL SDA一般接单片机I O口 由于SDA是漏极开路的 需要接上拉电阻 当然你的I O带上拉就不用接了 24C512的驱动方式 一 24C512使用I2C总线驱动方式 因此 它遵守I2C的协议规范 I2C中有7种基本操 作 1 发送起始信号 2 发送结束信号 3 发送应答信号 4 总线无应答 5 接收并检测应答信号 6 发送1字节数据 7 接收1字节数据 关于I2C的具体原理及说明
3、详见 I2C总结 以下是每种I2C操作的具体代码 I2C c 0 1 准备工作 包含头文件和数据类型定义 ifndef msp430 x14x 包含msp430 x14x h include msp430 x14x h endif define i2c 文件标志符 define I2C DIR P5DIR I2C芯片的输入输出切换 这里使用P5端口 用户可根据具体实际情况修改端口寄存器即可 define I2C OUT P5OUT I2C芯片的输出 define I2C IN P5IN I2C芯片的输入 define SDA BIT1 数据位 P5 1 define SCL BIT2 时钟位
4、P5 2 ifndef uchar 定义数据类型 define uchar unsigned char uchar endif ifndef uint uint define uint unsigned int endif void I2C init void 设置端口方向和初始电平 I2C DIR SCL SCL设置为输出 I2C DIR SDA设置为输入 I2C OUT SCL 0 占用总线 I2C delay I2C stop I2C stop 函数释放总线 void I2C delay void NOP 本函数在MSP430F149 8MHz 8分频主频下通过验证 NOP 用户可以根据
5、所用430单片机具体的性能适当调整延迟时长 毫秒级延迟 stop信号后的长延迟 void I2C delay ms uint ms uint i j for i 0 i ms i for j 0 j 8000 j 0 3 准备工作 初始化I2C 0 2 准备工作 延迟函数 void I2C start void I2C DIR SDA SDA设置为输出 I2C OUT SDA SDA 1 I2C delay I2C OUT SCL SCL 1 I2C delay I2C OUT SDA 0 SDA完成负跳 启动I2C I2C delay I2C OUT SCL 0 SCL钳位在0上 持续占用总
6、线 I2C delay 2 stop信号 释放I2C 1 start信号 启动I2C void I2C stop void I2C DIR SDA SDA设置为输出 I2C OUT SCL 0 I2C delay I2C OUT SDA 0 I2C delay I2C OUT SCL SCL 1 I2C delay I2C OUT SDA SDA 1 SDA完成正跳 释放I2C总线 I2C delay void I2C ack void I2C DIR SDA SDA设置为输出 I2C OUT SDA 0 正确应答 I2C delay I2C OUT SCL SCL 1 发送应答信号 I2C
7、delay I2C OUT SCL 0 SCL拉回低电平 防止误操作 I2C delay I2C OUT SDA SDA 1 SDA拉回高电平 防止误操作 I2C delay 4 NoAck信号 发送 无应答 信号 3 ack信号 发送 应答 信号 void I2C NoAck void I2C DIR SDA SDA设置为输出 I2C OUT SDA SDA 1 错误或无应答标志 I2C delay I2C OUT SCL SCL 1 发送无应答信号 I2C delay I2C OUT SCL 0 SCL拉回低电平 防止误操作 I2C delay uchar I2C TestAck void
8、 uchar ack 保存接收到的ACK信号 I2C OUT SCL SCL 1 I2C delay I2C DIR SDA设置为输入 ack I2C IN 获取ACK信号 I2C delay I2C OUT SCL 0 I2C delay if ack 0 x00 应答有效返回0 应答无效返回1 return 0 else return 1 单片机每发送1个字节的数据 指令或地址 都要检测应答 5 接收并检测ACK信号 void I2C SendByte uchar data uchar i temp temp 用于保存临时数据 I2C DIR SDA SDA设置为输出 for i 0 i
9、8 i 从最高位开始 一位一位发送 temp data if temp 0 x80 I2C OUT SDA SDA 1 发送位 1 else I2C OUT SDA 0 发送位 0 I2C delay I2C OUT SCL SCL 1 把SDA送到I2C总线上 I2C delay I2C OUT SCL 0 拉回SCL I2C delay data data 1 准备下一位数据 使用进位标志位CY来取data 的每一位数据也可以 而且效率还高一些 6 发送1个字节 uchar I2C ReceiveByte void uchar i temp temp 用于保存临时数据 uchar data
10、 0 x00 data 用于保存接收数据 I2C DIR SDA设置为输入 for i 0 i 8 i I2C OUT SCL SCL 1 I2C delay data data 1 从最高位开始接收 temp I2C IN 接收数据 if temp SDA data data 0 x01 I2C delay I2C OUT SCL 0 I2C delay return data 返回接收到的数据 7 接收1个字节 以上内容可参见附录1 I2C c文件 24C512的驱动方式 二 24C512的操作时序 单片机对24C512的操作无非两种 写入和读取 根据读写地址和数据量又可细分 为 单个字节
11、写入 页写入 读当前地址数据 读任意地址数据 连续读取 连续读取当前地址 连续读取任意地址 下面配合函数逐一介绍 0 准备工作 24C512的指令格式 1 0 1 0 0 A0A1R W 01 76543210 器件类型码 24C系列都为A0h 器件地址操作类型 无论读还是写 操作24C512的第一个部分 都是指令 而且24C512只有这么一条指令 1 写入单个字节 时序 start信号写操作指令高8位地址低8位地址1字节数据stop信号 ACK 应答 ACK 应答 ACK 应答 ACK 应答 发送发送发送发送 指令部分 如果器件地址为0 则该值为A0h 地址部分 16位 数据部分 操作开始
12、单片机需要发送start信号来占用I2C总线 随后发送写操作指令A0h 判断应答信号为有效后再分2次发送写入地址 每次发送完事都要判断24C512返回的应答信号 数据跟在地址后面发送给器件 同样 也要判断ACK应答 最后发送stop信号来释放I2C总线 uchar 24C Send 1B uchar data uint addr 写入单个字节 I2C start 启动总线 I2C SendByte 24C CMD W 发送写操作指令 if I2C TestAck 1 return 1 检测ACK 失败返回错误代码 I2C SendByte uchar addr 0 x100 发送写高8位地址
13、if I2C TestAck 1 return 2 检测ACK I2C SendByte uchar addr 0 x100 发送写低8位地址 if I2C TestAck 1 return 3 检测ACK I2C SendByte data 发送数据 if I2C TestAck 1 return 4 检测ACK I2C stop 释放总线 I2C delay ms 10 return 0 2 页写入 时序 start信号写操作指令高8位地址低8位地址数据1stop信号ACK 发送 指令部分 如果器件地址为0 则该值为A0h 地址部分 16位 数据部分 24C512可以进行每次长达128个字
14、节的页写入操作 页写入时 直到写入完第一个字节前 所有的操作过程都与字节写入完全 一样 不同的是单片机不会在写入第一个字节后发送STOP信号 而是继续写入 最多可以再写入127个字节 算上第1次写入的 总共不超过128个字节 在写入全部数据后 单片机必须通过发送STOP信号来停止页写入操作 页写入时 写入地址的低7位会在接收字节后自动加1 但高9位不会 一共16位地址 因此一次页写入最多只能写128个字节 27 128 如果一次写入的数据超过128字节 则会发生地址发生溢出 低7位地址会归零 后续写入的字节回覆盖最前边的数据 ACKACK数据128ACKACK 发送发送发送发送 1514131
15、211109876543210 高8位地址低8位地址 不可变动的高9位地址可自动加1的低7位地址 页的起始位置是任意的 但最好设置为128的整数倍 这样可以避免数据覆盖 uchar 24C Send 128B uchar data uint addr uchar i 0 I2C start 启动总线 I2C SendByte 24C CMD W 发送写芯片指令 if I2C TestAck 1 return 1 检验应答 失败返回错误代码 I2C SendByte uchar addr 0 x100 发送写高8位地址 if I2C TestAck 1 return 2 I2C SendByte
16、 uchar addr 0 x100 发送写低8位地址 if I2C TestAck 1 return 3 while i 128 data i 0 x00 循环写入数据 可以少于128字节但不能超过128字节 I2C SendByte data i 发送数据 if I2C TestAck 1 return 4 i I2C stop 释放总线 I2C delay ms 10 return 0 页写入函数 3 从当前地址读取1个字节 时序 start信号读操作指令数据stop信号ACK 指令部分 如果器件地址为0 则该值为A1h 数据部分 24C512中有一个地址计数器 读写操作会改变指针的值 读当前地址的数据 指令的地址就是最后一次读写操作的地址值 作为数据接收方的单片机在读取完数据后直接发送STOP信号 不回复ACK信号 由于当前地址是不确定的 所以这个操作读取的数据也不确定是哪个地址上的数据 NO ACK 接收发送 uchar 24C ReceiveCurrent 1B uchar p p 0 x00 I2C start 启动总线 I2C SendByte 24C CMD R 发送