IIC总线、EEPROM读取
2017-09-25 20:03:35 2 举报
EEPROM的读取,IIC总线的原理
作者其他创作
大纲/内容
从机被激活等待接收页地址与读写选择信号
IIC_EEPROM_send_byte(word_add);
EEPROM_scl = 1; _nop_; while(EEPROM_sda); 当收到应答,既sda为0时退出循环 EEPROM_scl = 0; _nop_;
产生结束信号函数
IIC_EEPROM_send_ACK(1);
接收到非应答信号结束发送
接收到8位地址,激活对应的字节区域完成后发送应答信号
向从机发送页地址与读取信号(1)等待从机应答应答
EEPROM_sda = 1; _nop_; EEPROM_scl = 1; _nop_; EEPROM_sda = 0; _nop_; 在scl为高的时候,sda发生负跳变 EEPROM_scl = 0; _nop_;
接收数据完成后发送非应答信号(1)
产生结束信号返回读到的数据
向从机发送字地址等待从机的应答信号
产生开始信号函数
再次产生开始信号
产生应答信号函数
接收到主机的指令,激活对应的页储存器进入读/写模式完成后发送应答信号
EEPROM读取一个字节流程
从机接收到开始信号等待接收页信号与读写选择信号
IIC_EEPROM_send_byte(dev_add+1);
IIC_EEPROM_start();
接收到页地址与读取信号开始字节的传送完成后发送应答信号
主机产生START信号
数据发送函数
EEPROM_sda = 0; _nop_; EEPROM_scl = 1; _nop_; EEPROM_sda = 1; _nop_; 在scl为高时,sda发生正跳变
return(dat);
应答检测函数
dat = IIC_EEPROM_receive_byte();
数据接收函数
IIC_EEPROM_send_byte(dev_add);
IIC_EEPROM_stop();
temp为要发送的字节 for(index=0; index8; index++) 一个字节为八位二进制数,要写八次 { EEPROM_sda = temp & 0x80; _nop_; 将temp的最高位传给sda EEPROM_scl = 1; _nop_5; 先将scl置高,产生正跳变,完成写入 EEPROM_scl = 0; _nop_5; 再将scl置低 temp = 1; temp右移,次高位移至最高位 } IIC_EEPROM_check_ACK(); 应答检测函数
EEPROM_sda = ACK;\t _nop_; 若ACK为1,则表示非应答信号 EEPROM_scl = 1; _nop_; SCK产生正跳变,完成写入 EEPROM_scl = 0; _nop_;
temp为临时变量,用于保存接受到的数据 EEPROM_sda = 1; _nop_; 设置数据线为接收状态 for(index=0; index8; index++) 8次 { EEPROM_scl = 1; _nop_5; scl置高产生正跳变,sda更新 temp = (temp1) | EEPROM_sda; 取出sda位的值给temp最低位 EEPROM_scl = 0; _nop_5; scl置低 } return temp; 返回temp
向从机发送器件地址(0XA0)与写信号(0)等待从机的应答信号
SCK SDA
收藏
收藏
0 条评论
回复 删除
下一页