历史上的今天
今天是:2025年01月22日(星期三)
2018年01月22日 | 51读写串行EEPROM芯片at2402程序(C)
2018-01-22 来源:eefocus
/* Name:AT24C02存储器的读写程序,用到I2C总线,含相对独立的I2C总线读写函数 */
#include
#include
#include
#define DELAY_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱*/
#define TRUE 1
#define FALSE 0
sbit SCL=P1^7;/*假设由P1.7和P1.6控制*/
sbit SDA=P1^6;
/********** Function Definition 函数定义 ************/
void DELAY(unsigned int t) /*延时函数*/
{
while(t!=0)
t--;
}
void I2C_Start(void)
{
/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
SDA=1;
SCL=1;
DELAY(DELAY_TIME);
SDA=0;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
void I2C_Stop(void)
{
/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
SDA=0;
SCL=1;
DELAY(DELAY_TIME);
SDA=1;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
void SEND_0(void) /* SEND ACK */
{
/*发送0,在SCL为高电平时使SDA信号为低*/
SDA=0;
SCL=1;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
void SEND_1(void)
{
/*发送1,在SCL为高电平时使SDA信号为高*/
SDA=1;
SCL=1;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
bit Check_AcknowLEDge(void)
{
/*发送完一个字节后检验设备的应答信号*/
SDA=1;
SCL=1;
DELAY(DELAY_TIME/2);
F0=SDA;
DELAY(DELAY_TIME/2);
SCL=0;
DELAY(DELAY_TIME);
if(F0==1)
return FALSE;
return TRUE;
}
void WriteI2CByte(char b)reentrant
{
/*向I2C总线写一个字节*/
char i;
for(i=0;i<8;i++)
if((b< else
SEND_0();
}
char ReadI2CByte(void)reentrant
{
/*从I2C总线读一个字节*/
char b=0,i;
for(i=0;i<8;i++)
{
SDA=1; /*释放总线*/
SCL=1; /*接受数据*/
DELAY(10);
F0=SDA;
DELAY(10);
SCL=0;
if(F0==1)
{
b=b<<1;
b=b|0x01;
}
else
b=b<<1;
}
return b;
}
/**********以下为读写24c02的函数**********/
void Write_One_Byte(char addr,char thEDAta)
{
bit acktemp=1;
/*write a byte to mem*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
WriteI2CByte(thedata);/*thedata*/
acktemp=Check_Acknowledge();
I2C_Stop();
}
void Write_A_Page(char *buffer,char addr)
{
bit acktemp=1;
bit wrtmp;
int i;
/*write a page to at24c02*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
for(i=0;i<7;i++)
{
WriteI2CByte(buffer[i]);
if(!Check_Acknowledge())
{
I2C_Stop();
}
}
I2C_Stop();
}
char Read_One_Byte(char addr)
{ bit acktemp=1;
char mydata;
/*read a byte from mem*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_Acknowledge();
mydata=ReadI2CByte();
acktemp=Check_Acknowledge();
return mydata;
I2C_Stop();
}
void Read_N_Bytes(char *buffer,char n,char addr)
{
bit acktemp=1;
int i=0;
/*read 8 bytes from mem*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_Acknowledge();
for(i=0;i
if(i!=n-1)
SEND_0(); /*发送应答*/
else
SEND_1(); /*发送非应答*/
}
I2C_Stop();
}
void main()
{
int i;
char mybyte;
char myarray[8];
char myarray2[8];
char rdarray[16];
for(i=0;i<8;i++)
{
myarray[i]=i;
myarray2[i]=i+0x08;
}
Write_One_Byte(0x20,0x28);
Write_A_Page(myarray,0x10);
Write_A_Page(myarray2,0x18);
mybyte=Read_One_Byte(0x20);
Read_N_Bytes(rdarray,16,0x10);
}
史海拾趣
|
爱特梅尔公司 (Atmel® Corporation) 宣布推出触摸控制器IC 产品AT42QT2160,在单个器件中结合了触摸按键和触摸滑动功能。AT42QT2160能够控制多达16个单独的触摸按键,以及由2至8个触摸按键通道构成的滑块。此外,该芯片还可通过PWM的输出功能控 ...… 查看全部问答> |
|
[qq]371263995[/qq]我们知道,在MSP430单片机中,有很多模块,比如复位模块,时钟模块,I/O口模块,Timer A定时器模块,ADC模块等等。每个模块都有其结构图,比图下图所示。我们或许能粗略不用弄懂它们进行简单程序的编写。但是如果想要写出好的高 ...… 查看全部问答> |
|
6410的板子,想在SDRAM运行系统镜像,写NK.nb0的时候 Checksum is being calculated.... (If you want to skip, press \'x\' key) Checksum O.K. ...… 查看全部问答> |
|
各位大虾: 辛苦了一段时间,终于可以在wince4.2中把剩下的norflash做成了文件系统,从而可以存放数据,但是!!,同样的代码和注册表移植到wince500系统下时,发现系统起来了,在存储管理器中没有出现Norflash磁盘,做了N次试验, ...… 查看全部问答> |
|
电脑配置: cpu: intel e2160(双核) 1.80GHz 主板:技嘉 GA-945GCM 内存:1G 硬盘:160G 显卡:集成 光驱:PHILIPUS : SPD2212P 电源:长城 我电脑是去年10月组装的,不知道这种 ...… 查看全部问答> |
|
本设计基于DE0开发板,使用了ADDA扩展板,完成了AM调制电台的设计,发射频率为1MHZ,可用常用AM广播接收。verilog hdl 编程。初来乍到,赚点金币,呵呵~~~ [ 本帖最后由 happysheep224 于 2011-7-14 15:00 编辑 ]… 查看全部问答> |




