IIC总线的使用EEPROM芯片的读写程序
I2C读写EEPROM文档说明

通过I2C通讯协议对EEPROM进行读写操作发送串口进行通讯一.描述I2CI2C协议有启动,终止,应答,非应答四种信号,有按位发送数据,按位接收数据,有读操作和写操作。
1.启动I2C程序如下,保持SCL为高电平,SDA为高电平,当检测到SDA下降沿时,启动传送,如果2个信号没有被高则返回0。
程序启动成功返回1。
uint8 I2C_Start(void){CyDelayUs(10);SDA_Write(1);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);if ( SDA_Read() == 0) return 0;if ( SCL_Read() == 0) return 0;SDA_Write(0);CyDelayUs(10);SCL_Write(0);CyDelayUs(10);return 1;}上面是模仿I2C启动时序2.终止传送程序如下SDA保持低电平SCL保持高电平而后拉高SDA,系统检测到SDA上升沿则终止传送。
void I2C_Stop(void){CyDelayUs(10);SDA_Write(0);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);SDA_Write(1);CyDelayUs(10);}3.模拟应答信号,让SDA的低电平时间大于SCL的高电平时间,即可应答;也就是SDAvoid I2C_Ack(void){CyDelayUs(10);SDA_Write(0);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);SCL_Write(0);CyDelayUs(10);}4.模拟非应答信号,让SDA的高电平时间大于SCL高电平时间,就是非应答void I2C_Nack(void){CyDelayUs(10);SDA_Write(1);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);SCL_Write(0);CyDelayUs(10);}5.按位发送数据,按位发送数据的要求是数据位高电平的时间大于SCL,SCL高电平时不允许数据位电平变化,只有SCL低电平时才可以任意变换。
IO口模拟I2C总线读写EEPROM

SDA = 1;
}
void I2cSendNack()
{
SDA_DIR = 0;
SDA = 1;
I2c_delay();
SCL = 0;
I2c_delay();
SCL = 1;
I2c_delay();
SCLபைடு நூலகம்= 0;
}
INT8U I2cCheckAck()
void WriteOneByte(INT8U cData);
INT8U ReadOneByte();
INT8U WriteI2cData(INT16U addr, INT8U cData);
INT8U ReadI2cData(INT16U addr);
void I2c_delay()
{
return 0;
}
cTemp = L_BYTE(addr);
WriteOneByte(cTemp);
if(I2cCheckAck() == 0)
{
return 0;
}
WriteOneByte(cData);
if(I2cCheckAck() == 0)
#define H_BYTE(wVal) *( (unsigned char*)&wVal+1)
#define L_BYTE(wVal) *( (unsigned char*)&wVal )
#define NOP() asm("nop")
#define INT8U unsigned char
if(I2cCheckAck() == 0)
基于STM32的IIC_EEPROM案例说明

基于STM32的IIC_EEPROM案例说明STM32是一系列由STMicroelectronics开发的32位ARM Cortex-M处理器的微控制器。
它具有高性能、低功耗和丰富的外设。
其中一个外设是I2C接口,可以用于连接外部器件,如EEPROM。
EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种非易失性存储器,可以通过电量抹除并重新编程。
本文将说明如何在STM32微控制器上使用I2C接口来读取和写入EEPROM的数据。
以下是一个I2CEEPROM案例的步骤:1.硬件连接:找到适当的引脚连接STM32和EEPROM。
根据STM32型号和EEPROM的规格书,将SCL引脚连接到STM32的相应引脚,将SDA引脚连接到STM32的相应引脚。
确保EEPROM上的地址引脚正确连接到STM32的引脚,以选择EEPROM的地址。
另外,确保STM32的引脚配置正确。
2.初始化I2C外设:在STM32的代码中,首先需要初始化I2C外设。
这可以通过配置I2C控制器的寄存器来完成。
这些寄存器包含有关时钟速度、地址模式和使能I2C控制器的设置选项。
3.选择EEPROM地址:通过向I2C总线发送一个特定的命令字节,可以选择EEPROM的地址。
这个命令字节包含I2C总线上的设备地址和寻址模式。
4.读取EEPROM数据:为了从EEPROM读取数据,STM32将发送一个读取命令字节,将该命令字节传送到EEPROM,然后从EEPROM读取数据。
在读取数据之前,需要设置读取数据的长度和目标缓冲区。
5.写入EEPROM数据:为了向EEPROM写入数据,STM32将发送一个写入命令字节,将该命令字节传送到EEPROM,然后将数据写入EEPROM。
在写入数据之前,需要设置写入数据的长度和源缓冲区。
6.处理错误和超时:在进行I2CEEPROM读取和写入操作时,可能会出现错误和超时。
二线制I2C CMOS 串行EEPROM 读写操作

reg[10:0]main_state;//主状态寄存器
reg[7:0]data_from_rm;//EEPROM读寄存器
reglink_sda;//SDA数据输入EEPROM开关
reglink_read;//EEPROM读寄存器开关
reglink_head;//启动信号开关
sh8in_bit6= 10'b0000000100,
sh8in_bit5= 10'b0000001000,
sh8in_bit4= 10'b0000010000,
sh8in_bit3= 10'b0000100000,
sh8in_bit2= 10'b0001000000,
sh8in_bit1= 10'b0010000000,
sh8out_end= 9'b100000000;
////////////串行数据并行输出状态定义///////////////////////////////////////////////////
parameter
sh8in_begin= 10'b0000000001,
sh8in_bit7= 10'b0000000010,
// //synthesis parallel_case //case语句综合为并行多路选择器
// //synthesis full_case //case语句分支项完备
// //synthesis translate_on //开始综合以下内容
// //synthesis translate_off //停止综合以下内容,以下内容仅供仿真
main_state<= READ_START;
IIC总线读写EEPROM(深度诠释)

/*----------------------------------------------------------------------------------------------------------IIC总线读写EEPROM(串行扩展eeprom,24c02)(STC12C系列单片机自带eeprom,且有另外的eeprom操作方式)作者:Allen.H(帮同学修改的一个程序)时间:2010.11.5----------------------------------------------------------------------------------------------------------*/#include <reg52.h>#include <intrins.h>//是用括号还是双引号看情况,本地头文件用双引号,系统头文件用括号//这里使用了_nop_()函数,所以调用此头文件#define TRUE 1/*define宏定义一般用大写,宏定义并不会减少最终代码空间define多行语句时,每一行末尾写上\,最后一行可以不写,有时比较短的语句写成一个子函数会牺牲更多的时间,因为函数调用耗时比较多,这个时候用一个define语句更好*/#define FALSE 0typedef unsigned char uchar;//良好的程序风格,不应该用#define//#define uchar unsigned charsbit sda=P2^0; //---------你把sda和scl引脚可能定反了,我换过来了-------------------------------sbit scl=P2^1;//等号对其,变量名长短不一时,注意,且测试等于号"=="或者其他双目关系运算符两边都空一格//-----------------------------------------------------------------void delay(uchar z)//带参数很好{//大括号所在行不要写代码uchar i,j;//局部变量中用来自加自减可以用i,j之类的定义,计数建议不要用i,j//局部变量不占内存,函数调用时生成堆栈,不应该定义局部变量时作初始化//----局部变量命名后空一格,写正式代码for(i=z;i>0;i--)for(j=100;j>0;j--);//注明多少时间,在调试模式下,看窗口左边的SEC值}//函数与函数之间空一格void delay_7nop()//子程序命名最好顾名思义,比如delay_1ms(),这里考虑都是使用7nop,不带参数{/*程序代码每进一层逻辑就缩进一格TAB键,TAB设置为3,4格,在keil的view->options里面设置,不要使用几个空格来缩进,统一使用TAB键*/_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//这里0-1000多个_nop_都可以}//delay函数都放在一起,函数顺序不要乱放,相关的放一起,//--------------------------------------------------------------------void init(){sda=1;delay_7nop();scl=1;delay_7nop();}//---SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;//SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
基于IIC总线的EEPROM读写驱动

/****************************************************************************** * 对基于IIC总线的EEPROM进行读写C文件** file: eeprom_device.c* name: zhzhchang* time: 2010.3.17* V1.0* blogs: /zhzht19861011* Nots: 本文件基于at24c02,仅寻址一个字节地址,若是使用大容量eeprom器件,只需增加相应地址即可******************************************************************************* **/#include<reg52.h>#include"eeprom_device.h"//模拟IIC总线延时程序,对不同的CPU应根据相应的主频改变此处的延时时间//at24c512B: t(LOW)=0.4um,t(HIGH)=0.4us,t(WR)=5msvoid delay(void){unsigned char i;for(i=0;i<5;i++);}void mDelay(unsigned char j)//A normal delay{unsigned int i;for(;j>0;j--){for(i=0;i<125;i++){;}}}//启动IIC总线//时钟线保持高电平期间,数据线电平从高到低的跳变作为I2C 总线的起始信号void Start(void){Sda=1;delay();Scl=1;delay();delay();Scl=0;}//停止IIC总线//时钟线保持高电平期间,数据线电平从低到高的跳变作为I2C 总线的停止信号void Stop(void){Sda=0;delay();Scl=1;delay();Sda=1;delay();Scl=0;}//应答IIC总线void Ack(void){Sda=0;delay();Scl=1;delay();Scl=0;delay();}//非应答IIC总线void NoAck(void){Sda=1;delay();Scl=1;delay();Scl=0;delay();}/*发送完一个字节后检验设备的应答信号*/bit Check_Ack (void){bit q;Sda=1;Scl=1;delay();q=Sda;delay();Scl=0;delay();if (q==1)return 0;elsereturn 1;}//发送一个字节void Send(unsigned char Data){unsigned char BitCounter=8;unsigned char temp;do{temp=Data;Scl=0;delay();if((temp&0x80)==0x80)Sda=1;elseSda=0;Scl=1;temp=Data<<1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;}//读一个字节并返回变量unsigned char Read(void){unsigned char temp=0;unsigned char temp1=0;unsigned char BitCounter=8;Sda=1;do{Scl=0;delay();Scl=1;delay();if(Sda)temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1){temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}//write to ROM,循环写入,每循环一次写一个字节void WrToROM(unsigned char Data[],unsigned char Address,unsigned char Num) {unsigned char i;for(i=0;i<Num;i++){Start();Send(AddWr);//Write AddressAck();Send(Address+i);//Write sub AddressAck();Send(*(Data+i));//Write DataAck();Stop();mDelay(20);}}//读一个字节void RdFromROM(unsigned char Data[],unsigned char Address){bit ack;Start();Send(AddWr);//Write Addressack=Check_Ack();Send(Address);//Write sub Addressack=Check_Ack();Start();Send(AddRd);//Read Addressack=Check_Ack();*(Data)=Read();//Read DataScl=0;NoAck();Stop();}//a按页写//一次可以写一页,一页的大小根据芯片而定.//比如at24c02,每页8个字节,可以一次写入地址00H~07H共8个字节数据,当然,也可以从04H连续写4个字节数据//但是若从04H写入6个字节的数据时,写入数据的最后两个数据会写入00H,01H内,即超过一页地址的数据会在本页内循环写void WrToROMPage(unsigned char Data[],unsigned char Address,unsigned char Num){unsigned char i;bit ack=1;Start();Send(AddWr);//Write Addressack=Check_Ack();Send(Address);//Write sub Addressack=Check_Ack();for(i=0;i<Num;i++){Send(*(Data+i));//Write Dataif(!Check_Ack())Stop();}Stop();mDelay(20);}//连续读void RdFromRomNByte(unsigned char Data[],unsigned char Address,unsigned char Num) {unsigned char i;bit ack=1;Start();Send(AddWr);//Write Addressack=Check_Ack();Send(Address);//Write sub Addressack=Check_Ack();Start();Send(AddRd);//Read Addressack=Check_Ack();for(i=0;i<Num;i++){*(Data+i)=Read();//Read DataScl=0;if(i!=Num-1){Ack();}elseNoAck();}Stop();}头文件:/****************************************************************************** * 对基于IIC总线的EEPROM进行读写头文件** file: eeprom_device.h* name: zhzhchang* time: 2010.3.17* blogs: /zhzht19861011* V1.0******************************************************************************* **/#define AddWr 0xae //Write Address//8 位从器件地址的高4 位固定为1010,接下来的3位A2 A1 A0 为器件的地址位用来定义哪个器件//以及器件的哪个部分被主器件访问,8位地址的最低位作为读写控制位'1' 表示对从器件进行读操作,'0' 表示对从器件进行写操作.#define AddRd 0xaf //Read Address//全局变量sbit Sda=P1^2; //定义总线连接端口sbit Scl=P1^1; //定义时钟线sbit WP=P1^0; //写保护管脚void mDelay(unsigned char j);//A normal delay//write to ROMvoid WrToROM(unsigned char Data[],unsigned char Address,unsigned char Num);//任意读一个字节void RdFromROM(unsigned char Data[],unsigned char Address);//按页写void WrToROMPage(unsigned char Data[],unsigned char Address,unsigned char Num);//连续读void RdFromRomNByte(unsigned char Data[],unsigned char Address,unsigned charNum);。
ds2431读写方法

ds2431读写方法DS2431是一种基于I2C总线的1K位EEPROM芯片,具有读写功能。
以下是DS2431的读写方法的详细描述。
读取数据:DS2431芯片是通过I2C总线进行数据读取的,以下是DS2431的读取数据的步骤:1.启动I2C总线:首先,需要启动I2C总线,将总线拉低一个周期。
2.发送设备地址:然后,发送DS2431的设备地址,以确定要与DS2431通信。
3.发送读命令:发送读命令给DS2431,以告知芯片需要读取数据。
4.接收数据:然后,等待DS2431芯片发送要读取的数据。
在接收数据期间,主设备必须提供时钟信号。
5.停止I2C总线:最后,主设备向DS2431芯片发送停止信号,以结束I2C通信。
写入数据:DS2431芯片也可以通过I2C总线进行数据写入。
以下是DS2431的写入数据的步骤:1.启动I2C总线:首先,需要启动I2C总线,将总线拉低一个周期。
2.发送设备地址:然后,发送DS2431的设备地址,以确定要与DS2431通信。
3.发送写命令:发送写命令给DS2431,以告知芯片需要写入数据。
4.发送数据:接下来,发送要写入的数据到DS2431芯片。
在发送数据期间,主设备必须提供时钟信号。
5.停止I2C总线:最后,主设备向DS2431芯片发送停止信号,以结束I2C通信。
以上是DS2431读写数据的基本步骤,以下是一些注意事项和建议:1.DS2431芯片的设备地址是固定的,为0x18、在与DS2431通信之前,需要确保该地址正确。
2.读取和写入数据时,需要提供适当的时钟信号,以确保数据的顺利传输。
3.在读取数据之前,需要确保已经正确初始化I2C总线。
通常,需要设置I2C的时钟速度和选择适当的模式。
4.在写入数据之前,需要确保已经正确初始化I2C总线,并验证写入数据的有效性。
5.在进行连续读写操作时,需要留出适当的延迟时间,以确保DS2431正确响应所有操作。
总而言之,DS2431是一种功能强大的EEPROM芯片,通过I2C总线进行数据的读写。
STM32F4利用I2C向EEPROM写入、读取数据步骤

STM32F4利⽤I2C向EEPROM写⼊、读取数据步骤
写⼊⼀个字节:
第⼀步:使⽤库函数I2C_GenerateSTART()产⽣I2C起始信号,调⽤库函数I2C_CheckEvent()检测事件,若检测到下⼀事件,则进⼊通讯下⼀阶段
第⼆步:调⽤库函数I2C_Send7bitAddress()发送EEPROM的设备地址,并把数据传输⽅向设置为I2C_Direction_Transmitter(即发送⽅向),发送地址后以同样的⽅式检测相应的事件。
第三步:调⽤库函数I2C_SendData向EEPROM发送要写⼊的地址,发送完后等待EV8事件的产⽣。
第四步:继续调⽤库函数I2C_SendData向EEPROM发送要写⼊的数据,然后等待EV8事件的产⽣。
第五步:通讯结束,调⽤I2C_GenerateSTOP发送停⽌信号。
读取⼀字节的数据:
第⼀步:通过库函数I2C_GETFlagStatus()查询库函数是否处于忙碌状态,若不忙碌,则进⼊下⼀状态。
第⼆步:使⽤库函数I2C_GenerateSTART()产⽣起始信号,调⽤库函数I2C_CheckEvent()检测Event1,若检测成功则进⼊下⼀阶段。
第三步:发送EEPROM的设备地址,⽅向为I2C_Direction_Transmitter(即写⽅向),检测事件6
第四步:利⽤库函数I2C_Cmd重新使能I2C外设
第五步:利⽤库函数I2C_Senddata()发送要读取的EEPROM的内部地址,检测Event8事件的产⽣
第六步:产⽣第⼆次I2C起始信号,并检测相关事件
第七步:发送I2C设备地址
第⼋步:读取数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机第二十二课IIC总线的使用EEPROM芯片的读写
所属类别:课程代码发布日期:2011-03-05 点击量:341 #include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P2^1;
sbit scl=P2^0;
unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x00};
unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};
void start(void);
void stop(void);
void ack(void);
void noack(void);
void iicwr_byte(uchar dat);
uchar iicre_byte(void);
void delay (void);
void init(void);
void delay1(void);
void write_byte(uchar add,uchar dat);
uchar read_byte(uchar add);
///////////////////////////////////
void delay1(void)
{
uint a=30000;
while(a--);
}
void delay (void)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
void start(void)
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop(void)
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void ack(void)
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<200))i++; scl=0;
delay();
}
void noack(void)
{
sda=1;
delay();
scl=1;
delay();
scl=0;
delay();
}
void init(void)
{
sda=1;
scl=1;
}
void iicwr_byte(uchar dat) {
uchar i;
scl=0;
for(i=0;i<8;i++)
{
if(dat&0x80)
{
sda=1;
}
else
{
sda=0;
}
dat=dat<<1;
delay();
scl=1;
delay();
scl=0;
delay();
}
sda=1;
delay();
}
uchar iicre_byte(void) {
uchar i;
uchar dat;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
dat=dat<<1;
if(sda)
{
dat++;//
}
scl=0;
delay();
}
return dat;
}
void main()
{
/* init();
start();
iicwr_byte(0xa0); ack();
iicwr_byte(10); ack();
iicwr_byte(0x55); ack();
stop();
delay1();
////////////////////
////////////////////
init();
start();
iicwr_byte(0xa0); ack();
iicwr_byte(10); ack();
start();
iicwr_byte(0xa1); ack();
P0=iicre_byte(); noack();
stop(); */
uchar k;
k=read_byte(7); k=k%10;
P1=smg_du[k]; k++;
write_byte(7,k);
while(1);
}
void write_byte(uchar add,uchar dat) {
init();
start();
iicwr_byte(0xa0);
ack();
iicwr_byte(add);
ack();
iicwr_byte(dat);
ack();
stop();
}
uchar read_byte(uchar add)
{
uchar a;
init();
start();
iicwr_byte(0xa0);
ack();
iicwr_byte(add);
ack();
start();
iicwr_byte(0xa1);
ack();
a=iicre_byte();
noack();
stop();
return a;
}。