外部EEPROM,IIC总线和EEPROM通信技术
来源:互联网 发布:在access数据库中 表是 编辑:程序博客网 时间:2024/06/05 22:40
#include "STC/STC15F2K60S2.h"
#include <intrins.h> //包含NOP空指令函数_nop_();
#define AddWr 0xa0 //写数据地址,需要参考24c02芯片文档
#define AddRd 0xa1 //读数据地址
#define FALSE 0
#define TURE 1
sbit SDA=P2^1; //定义总线连接端口
sbit SCL=P2^0 ;
void delayus()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay(unsigned int j)
{
unsigned int i;
for(;j>0;j--)
for(i=0;i<100;i++)
;
}
void Start() //启动iic总线
{
SCL = 1;
delayus();
SDA = 1;
delayus();
SDA = 0;
delayus();
}
void Stop() //停止iic总线
{
SCL = 1;
delayus();
SDA = 1;
delayus();
SCL = 0;
delayus();
}
void Ack() // 应答IIC总线
{
SCL = 0;
SDA = 1;
delayus();
SDA = 0;
delayus();
SCL = 1;
delayus();
_nop_();
SCL = 0;
_nop_();
_nop_();
}
void NoAck() //非应答IIC总线
{
SDA = 1;
delayus();
SCL = 1;
delayus();
_nop_();
SCL = 0;
_nop_();
_nop_();
}
/*
bit Ack()
{
bit flag;
SDA=1;
SCL=1;
delayus();
flag=SDA;
delayus();
SCL=0;
delayus();
if(flag == 1)
return FALSE; //非应答
else
return TURE;
}*/
void Send(unsigned char dat)
{
unsigned char i;
for(i = 0;i<8;i++)
{
dat=dat<<1;
SCL = 0;
delayus();
SDA = CY;//PSW为中的进位标识,左移后最高位移入CY
delayus();
SCL = 1;//高电平,数据平稳
delayus();
}
SCL = 0;
delayus();
SDA = 1;//总线释放
delayus();
}
unsigned char read() //读一个字节
{
unsigned char count;
unsigned char dat;
//SDA = 1;
SCL = 0;
delayus();
SDA = 1;
delayus();
for(count = 0;count < 8;count++)
{
SCL = 1;
delayus();
dat = (dat << 1)|(unsigned char)SDA;//dat左移一位,最低位为0,此时与SDA按位或运算
SCL = 0; //读到最低为
delayus();
}
return dat;
}
/*写入数据*/
void WriteToROM(unsigned char Address,unsigned char Data)
{
Start();
Send(AddWr); //写入芯片地址
Ack();
Send(Address);//写入存储地址
Ack();
Send(Data);//写数据
Ack();
Stop();
//delay(20);
}
/* 读出数据 */
unsigned char ReadFromROM(unsigned char Address)
{
unsigned char PData = 0;
Start(); //写入芯片地址
Send(AddWr);
Ack();
Send(Address);//写入存储地址
Ack();
Start();
Send(AddRd); //读入地址
Ack();
PData = read();//读数据
Stop();
NoAck();
return PData;
}
void main()
{
while(1)
{
SDA = 1; //初始化
delayus();
SCL = 1;
delayus();
WriteToROM(25,0xaa);
delay(20);
P0 = ReadFromROM(25);
//P0 = 1 ;
}
}
#include <intrins.h> //包含NOP空指令函数_nop_();
#define AddWr 0xa0 //写数据地址,需要参考24c02芯片文档
#define AddRd 0xa1 //读数据地址
#define FALSE 0
#define TURE 1
sbit SDA=P2^1; //定义总线连接端口
sbit SCL=P2^0 ;
void delayus()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay(unsigned int j)
{
unsigned int i;
for(;j>0;j--)
for(i=0;i<100;i++)
;
}
void Start() //启动iic总线
{
SCL = 1;
delayus();
SDA = 1;
delayus();
SDA = 0;
delayus();
}
void Stop() //停止iic总线
{
SCL = 1;
delayus();
SDA = 1;
delayus();
SCL = 0;
delayus();
}
void Ack() // 应答IIC总线
{
SCL = 0;
SDA = 1;
delayus();
SDA = 0;
delayus();
SCL = 1;
delayus();
_nop_();
SCL = 0;
_nop_();
_nop_();
}
void NoAck() //非应答IIC总线
{
SDA = 1;
delayus();
SCL = 1;
delayus();
_nop_();
SCL = 0;
_nop_();
_nop_();
}
/*
bit Ack()
{
bit flag;
SDA=1;
SCL=1;
delayus();
flag=SDA;
delayus();
SCL=0;
delayus();
if(flag == 1)
return FALSE; //非应答
else
return TURE;
}*/
void Send(unsigned char dat)
{
unsigned char i;
for(i = 0;i<8;i++)
{
dat=dat<<1;
SCL = 0;
delayus();
SDA = CY;//PSW为中的进位标识,左移后最高位移入CY
delayus();
SCL = 1;//高电平,数据平稳
delayus();
}
SCL = 0;
delayus();
SDA = 1;//总线释放
delayus();
}
unsigned char read() //读一个字节
{
unsigned char count;
unsigned char dat;
//SDA = 1;
SCL = 0;
delayus();
SDA = 1;
delayus();
for(count = 0;count < 8;count++)
{
SCL = 1;
delayus();
dat = (dat << 1)|(unsigned char)SDA;//dat左移一位,最低位为0,此时与SDA按位或运算
SCL = 0; //读到最低为
delayus();
}
return dat;
}
/*写入数据*/
void WriteToROM(unsigned char Address,unsigned char Data)
{
Start();
Send(AddWr); //写入芯片地址
Ack();
Send(Address);//写入存储地址
Ack();
Send(Data);//写数据
Ack();
Stop();
//delay(20);
}
/* 读出数据 */
unsigned char ReadFromROM(unsigned char Address)
{
unsigned char PData = 0;
Start(); //写入芯片地址
Send(AddWr);
Ack();
Send(Address);//写入存储地址
Ack();
Start();
Send(AddRd); //读入地址
Ack();
PData = read();//读数据
Stop();
NoAck();
return PData;
}
void main()
{
while(1)
{
SDA = 1; //初始化
delayus();
SCL = 1;
delayus();
WriteToROM(25,0xaa);
delay(20);
P0 = ReadFromROM(25);
//P0 = 1 ;
}
}
0 0
- 外部EEPROM,IIC总线和EEPROM通信技术
- 单片机模拟 IIC 总线与 EEPROM(AT24C02)通信
- IIC&EEPROM
- EEPROM IIC
- 基于FPGA EEPROM读写实现及IIC总线协议和时序分析
- 单片机: EEPROM和串口通信
- S3C2410 IIC EEPROM 总结
- s3c2440 iic eeprom
- IIC&EEPROM总结
- STM32 IIC EEPROM
- EEPROM
- EEPROM
- eeprom
- EEPROM
- eeprom
- EEPROM
- EEPROM
- I2C总线EEPROM实现
- SecureCRT 常用命令
- Session Bean
- BPM助企业提升执行力
- Spring3+mybatis3上传图片保存至Sqlserver中和图片显示在网页
- OpenCV基础篇之读取显示图片
- 外部EEPROM,IIC总线和EEPROM通信技术
- C++简易list
- 工作日志
- OpenCV基础篇之像素操作对比度调节
- Junit4,Spring集成测试配置
- hdu1290:献给杭电五十周年校庆的礼物
- LeetCode 46 Permutations II
- ubuntu 12.04 LTS 安装配置JDK1.8.0
- Lua性能优化