at24c02写多少次,cat24wc02和at24c02
来源:整理 编辑:亚灵电子网 2023-11-12 21:54:21
1,cat24wc02和at24c02
cat24wc02是一种I2C总线上的EEPROM,它具有256字节的存储空间,可以支持多达100万次的写入操作。at24c02是一种2K位的I2C EEPROM,具有256个字节的存储空间,可以支持多达1亿次的写入操作。

2,24C02芯片能擦写多少次啊FM24C02有人说能擦10亿次
同一个区域可以擦写10万次左右。擦写多了以后会损坏。做个运动控制 ,每执行一次前都需要采集上次运动完的数据,需要下电后自动记忆,寿命至少在千万次以上WT588d语音芯片是可外挂FLASH,可重复擦写的一款语音芯片,WT588D音质较好,控制灵活的特点,更增加了可播放MIDI和弦功能,性能更好。WT588D是一款具有单片机内核的语音芯片,因此,可以冠名为WT588D系列语音单片机。WT588D系列语音单片机是广州唯创电子有限公司联合台湾华邦共同研发出来的集单片机和语音电路于一体的可编辑语音芯片。功能多音质好应用范围广性能稳定是WT588D系列语音单片机的特长,弥补了以往各类语音芯片应用领域狭小的缺陷,MP3控制模式、按键控制模式、按键组合控制模式、并口控制模式、一线串口控制模式、三线串口控制模式以及三线串口控制控制端口扩展输出模式,让应用人员能将产品投放在几乎可以想象得到的场所。作为一款以语音为基础的芯片,对音质的追求当然也是精益求精的,完全支持6K~22KHz采样率的音频加载,芯片的独到之处便是将加载的音频音质几乎完整无损的展现出来。WT588D系列语音单片机能通过配套软件WT588D voiceChip轻而易举的做到语音组合播放、插入完美的陶冶静音。静音的时长控制得绝无丝毫误差!可控制的语音地址位能达到220个!每个地址位里能加载可组合语音为128段语音!WT588D系列语音单片机模块内置SPI-FLASH存储器,WT588D系列语音单片机芯片可根据实际用法外置SPI-FLASH存储器,众多的控制模式、语音组合只需更换SPI-FLASH的内容,即可完全实现操作方式的切换。WT588D系列语音单片机支内容在线下载,这是一个应用人员不可或缺的优势持SPI-FLASH!WT588D语音单片机的推出,非常的具有语音市场的前瞻性和革命性,势必会在语音芯片的应用方面卷起一股旋风。

3,AT24C02使用详解
这篇文章是写给一个学弟看的,关于IIC,关于24C02的单字节写入\读取..页写入和读取,,学弟总是害怕协议,,,我总是对人家说,本来就这样的,协议就是人家这样规定的,,,如果你早生几十年你也可能规定个IIC协议......我的单片机和24C02通信,,,我的单片机就叫主机,,,24C02叫从机 先看IIC IIC协议规定开始传输数据的时候要先发一个起始信号,,,目的应该是告诉从机要开始通信了,准备准备 终止信号就是拜拜啦,再见! 起始信号就是 在SCL在高电平期间SDA来一个下降沿,,终止信号就是在SCL在高电平期间SDA来一个上升沿(所以协议上才会说,在正常传输数据的时候,只有在SCL为低电平的时候,数据线SDA的高低电平状态才允许改变,要不然岂不是和起始信号或者终止信号冲突了)/******************************************************************* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. ********************************************************************/voidStart_I2c() SDA=1;/*发送起始条件的数据信号*/_Nop(); SCL=1; _Nop();/*起始条件建立时间大于4.7us,延时*/_Nop(); _Nop(); _Nop(); _Nop(); SDA=0;/*发送起始信号*/_Nop();/*起始条件锁定时间大于4μs*/_Nop(); _Nop(); _Nop(); _Nop(); SCL=0;/*钳住I2C总线,准备发送或接收数据*/_Nop(); _Nop(); }voidStop_I2c() SDA=0;/*发送结束条件的数据信号*/_Nop();/*发送结束条件的时钟信号*/SCL=1;/*结束条件建立时间大于4μs*/_Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1;/*发送I2C总线结束信号*/_Nop(); _Nop(); _Nop(); _Nop(); }发送完起始信号就能传输数据了 下面是程序voidSendByte(unsignedcharc) unsignedcharBitCnt;//SCL=0; 起始信号最后是SCL=0;所以不用写了for(BitCnt=0;BitCnt<8;BitCnt++)/*要传送的数据长度为8位*/ SDA=1; }else SDA=0; } _Nop(); SCL=1;/*置时钟线为高,通知被控器开始接收数据位*/_Nop(); _Nop();/*保证时钟高电平周期大于4μs*/_Nop(); _Nop(); _Nop(); SCL=0; } _Nop(); _Nop(); SDA=1;/*8位发送完后释放数据线,准备接收应答位*/_Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop();if(SDA==1)/*判断是否接收到应答信号*/ack=0;//没有接收到应答信号elseack=1;//接收到应答信号SCL=0; _Nop(); _Nop(); }现在说一下接收,,,假设上面发送完0xaa以后,从机就返回给我们数据(11001100, 0xcc),当然SCL为低电平的时候模块准备数据,,SCL为高电平的时候,从机就把数据放在了SDA上,这样循环8次,一个8位数据就过来了 整体上应该是 Start_I2c();起始信号程序 SendByte(0xaa); 判断下ack是不是等于1,应答了(是继续执行还是停止看自己了) Data = RcvByte();//接收数据 Ack_I2c(1);//发送非应答,就是SDA=1;,这个程序在下面 Stop_I2c();发送停止信号 接收程序如下unsignedcharRcvByte() unsignedcharretc; unsignedcharBitCnt; retc=0; SDA=1;/*置数据线为输入方式*/for(BitCnt=0;BitCnt<8;BitCnt++) _Nop(); SCL=0;/*置时钟线为低,准备接收数据位*/_Nop(); _Nop();/*时钟低电平周期大于4.7μs*/_Nop(); _Nop(); _Nop(); SCL=1;/*置时钟线为高使数据线上数据有效*/_Nop(); _Nop(); retc=retc<<1;if(SDA==1)retc=retc+1;/*读数据位,接收的数据位放入retc中*/_Nop(); _Nop(); } SCL=0; _Nop(); _Nop();return(retc); }应答或者非应答程序如下/******************************************************************** 应答子函数 函数原型: void Ack_I2c(bit a); 功能: 主控器进行应答信号(可以是应答0或非应答1信号,由位参数a决定) ********************************************************************/voidAck_I2c(bit a) _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop();/*时钟低电平周期大于4μs*/_Nop(); _Nop(); _Nop(); SCL=0;/*清时钟线,钳住I2C总线以便继续接收*/_Nop(); _Nop(); }IIC其实就这样了,主要看支持IIC通信的芯片的资料了,写好这些就是IIC通用的了 资料链接 https://wenku.baidu.com/view/3fc8558002d276a200292ef9.html 现在看芯片资料如何写进去一个字节 关于器件的地址 写就是0xa0;;;;读就是0xa1 所以写函数就是/** * @brief 向24C02写数据 * @param Data--数据 * @param Address--地址 * @param None * @retval None * @example **/unsignedcharWriteData(unsignedcharData,unsignedcharAddress) Start_I2c(); SendByte(0xa0);//最后一位为0写入if(ack==0)return(0); SendByte(Address);//发送地址if(ack==0)return(0); SendByte(Data);//发送数据if(ack==0)return(0); Stop_I2c();//结束总线return(1); }关于应答哈我的SendByte(unsigned char c)函数里面发送完8位数据后就写了应答,然后把应答标志给ack,,后面直接判断的ack 现在想想为什么叫应答...直接说判断从机正没正确接收到数据就完了呗,就是把SDA拉高,然后把SCL拉高,等一会然后判断SDA引脚有没有被从机拉低,拉低了就说明好了......没拉低从机可能接收的数据不正确 _Nop(); _Nop(); SDA=1; /*8位发送完后释放数据线,准备接收应答位*/ _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA==1)/*判断是否接收到应答信号*/ ack=0;//没有接收到应答信号 else ack=1;//接收到应答信号 SCL=0; _Nop(); _Nop(); } 再看从任意地址读一个数据 注意哈第一个发送的器件地址是0xa0,后面的是0xa1 所以程序如下/** * @brief 从24C02读出数据 * @param None * @param Address--地址 * @param None * @retval 读到的数据 * @example **/unsignedcharReadData(unsignedcharAddress) unsignedcharData =0; Start_I2c(); SendByte(0xa0);//最后一位为0if(ack==0)return(0); SendByte(Address);//发送地址if(ack==0)return(0); Start_I2c(); SendByte(0xa1);//最后一位为1if(ack==0)return(0); Data=RcvByte(); Ack_I2c(1);//发送非就答位Stop_I2c();//结束总线return(Data); }现在看页写 把程序先放上,对了写的时候的开始地址最好是0,8,16,24,32,40,68,,,,8的倍数,要不然数据可能有错误,当然我用的芯片页写最多一次能写入8个字节.....感觉有点少哈......可以在现在的基础上再做一个函数实现哈,,或者用写单字节的for循环下..../** * @brief 向24C02写数据----页写,,,最多一次写入8个字节,多了会覆盖前面的 * @param Data--数据 * @param StartAddress--开始的地址--最大255 * @param None * @retval None * @example **/unsignedcharPageWrite(unsignedchar*Data,unsignedcharAddress,unsignedcharcnt) Start_I2c(); SendByte(0xa0);//最后一位为0写入if(ack==0)return(0); SendByte(Address);//发送地址if(ack==0)return(0);while(cnt--) SendByte(*Data++);//发送数据if(ack==0)return(0); DelayMs(10); } Stop_I2c();//结束总线return(1); }现在看页读 看程序/** * @brief 从24C02读出数据----页读 * @param Data--数据指针 * @param StartAddress--开始的地址--最大255 * @param None * @retval None * @example **/unsignedcharPageRead(unsignedchar*Data,unsignedcharAddress,unsignedcharcnt) Start_I2c(); SendByte(0xa0);//最后一位为0if(ack==0)return(0); SendByte(Address);//发送要读的地址if(ack==0)return(0); Start_I2c(); SendByte(0xa1);//最后一位为1if(ack==0)return(0);while(cnt--) Data++; Ack_I2c(0);//发送应答位DelayMs(10); } Ack_I2c(1);//发送非应答位Stop_I2c();//结束总线return(1); }说一下读的时候最好开始读取的地址是8的倍数,读取的数据个数也是8的倍数,,,我测试的如果不是这样有时候,第二次页读的时候就会读错........ 这芯片和8干上了............ 还有一个立即读,,,看明白就行,就是立即返回当前读地址加1后的那个数据 源码链接 链接: http://pan.baidu.com/s/1i4M7BId%20 密码:r9ov

文章TAG:
at24c02at24c02写多少次 cat24wc02和at24c02