AT24C256
来源:互联网 发布:match sql语句 编辑:程序博客网 时间:2024/04/30 01:12
at24c256与at24c02的区别在于以2个字节来控制地址 其中首字节最高位忽略,其余7位和下一字节的高2位 构成9位的页地址,共512页,低字节的剩余6位为页内地址,共64BYTE。 另外要注意的是整片写数据时在翻页时需要给一定的延时,不然会造成翻页失败,导致下一页写操作失败。读取数据时可不用延时。最后一点,读取数据的时候如果对速度要求比较高,可以省略掉延时的部分,可能不太妥当,但是IIC的速度就是没有办法和SDHC卡比。整片的存储大小也就32K,512(page)*64(byte)。
需要说明的是在当前页内,不论是读取还是写入,操作完成后要主动接收或者发送ACK。这样做的目的是告知芯片信息已经收到,芯片会自动将当前字节地址+1,如果已是最后一字节,则地址指针会自动回滚当前页第0字节,重新写入或者读取。如果是写入页的最后一个字节,在ACK后要发送END信号。如果是接收当前页的最后一字节,接收完后不发送ACK直接发送END信号。
/****************************************************************************函数名称:AT24C256_DataCopy功 能:将单片机上的长数组写入AT24C256芯片中入口参数:pbuf:指向返回数据指针返 回 值:最大页号备 注:只完成了基本功能,漏洞还是有的,比如存入任意大小的字符串时, 对最后一页不够64字节的数据存储还不太精确。*****************************************************************************/unsigned char AT24C256_DataCopy(unsigned char *pbuf, unsigned int BufLength){unsigned int PageCnt = 0x0000; //页计数 2bytesunsigned int Cnt = 0; //字节计数unsigned int i;unsigned char addr[2] = {0x00,0x00}; //PageCnt进行地址运算结果while(1){addr[0] = 0x7f&(PageCnt >> 2);//at24c256页地址计算 XPPP,PPPP,PPBB,BBBB X不关心,P页地址,B字节地址addr[1] = PageCnt & 0x0003;addr[1] = addr[1] << 6;AT24C02_Start(); //起始信号 AT24C02_SendByte(AT24C02_ADD_WR); //发送设备地址+写信号 AT24C02_SendByte(addr[0]); //发送存储单元地址2bytes 与PageCntAT24C02_SendByte(addr[1]);if((BufLength - Cnt) > 64){ for (i=0; i<PAGE_SIZE; i++)//写入一页的数据 { AT24C02_SendByte(pbuf[Cnt]);Cnt++; }}else{for (i=0; i<(BufLength - Cnt); i++)//写入不到一页的数据 { AT24C02_SendByte(pbuf[Cnt]);Cnt++; } return PageCnt;} AT24C02_Stop(); //停止信号Delay_ms(20);//非常重要的延时,不然造成下一页来不及转换,写数据失败PageCnt++;//页地址加1if(PageCnt >= 512){PageCnt = 0;Cnt = 0;return 1;}}}/******************************************************************************函数名称:AT24C256_AllDataOut功 能:将所有的数据输出给串口入口参数:pbuf:指向返回数据指针,数据的长度返 回 值:无备 注:原理大致相同*******************************************************************************/void AT24C256_AllDataOut(unsigned char *pbuf, unsigned int BufLength){unsigned int PageCnt = 0x0000; //页计数 2bytesunsigned int Cnt = 0; //字节计数unsigned int i;unsigned char addr[2] = {0x00,0x00}; //PageCnt进行地址运算结果while(1){addr[0] = PageCnt >> 2; //at24c256页地址计算 XPPP,PPPP,PPBB,BBBB X不关心,P页地址,B字节地址addr[1] = PageCnt & 0x0003;addr[1] = addr[1] << 6;AT24C02_Start(); //起始信号 AT24C02_SendByte(AT24C02_ADD_WR); //发送设备地址+写信号 AT24C02_SendByte(addr[0]); //发送存储单元地址2bytesAT24C02_SendByte(addr[1]); AT24C02_Start(); //起始信号 AT24C02_SendByte(AT24C02_ADD_RD); //发送设备地址+读信号if((BufLength - Cnt) > 64){ for (i=0; i<PAGE_SIZE; i++)//读取一页数据 { pbuf[i] = AT24C02_RecvByte(); if (i == (PAGE_SIZE-1)) { AT24C02_SendACK(NOACK); //最后一个数据需要NAK } else { AT24C02_SendACK(ACK); //回应ACK }uart_send_char(pbuf[i]);//发送到串口查看Cnt++; }}else{for (i=0; i<(BufLength - Cnt); i++)//读取一页数据 { pbuf[i] = AT24C02_RecvByte(); if (i == (BufLength - Cnt-1)) { AT24C02_SendACK(NOACK); //最后一个数据需要NAK } else { AT24C02_SendACK(ACK); //回应ACK }uart_send_char(pbuf[i]);//发送到串口查看Cnt++; }break;} AT24C02_Stop(); //停止信号PageCnt++;//页地址加1if(PageCnt >= 512){PageCnt = 0;Cnt = 0;break;}}}
0 0
- AT24C256
- AT24C256中文资料
- EEPROM at24c256读写
- I2C和AT24C256的应用
- AT24C01-AT24C256通用源程序(C51)
- 单片机之IIC--AT24C256的读写程序
- at24c02系列和at24c256系列的比较
- 再跟大家分享一下AT24C01~AT24C256的读写程序
- 单片机之IIC--AT24C256 多页读写关键程序段
- IIC读取AT24C256数据出现的问题及解析
- 利用AVR(MEGA16)片内IIC 实现AT24C256 的连续写(页写)与连续读程序
- 理工大学ACM平台题答案关于C语言 1014 A+B for Input-Output Practice (V)
- 设置Linux shell超时自动退出
- JMS
- 【Unity Shaders】Diffuse Shading——漫反射光照改善技巧
- 关于word删不掉的虚线横线
- AT24C256
- LeetCode First Missing Positive
- adb 环境变量设定
- HDU 2053 Switch Game(基础题)
- 蓝桥杯 c 天干地支计年法转换
- 今天说点什么呢
- ovs-ofctl 官方手册翻译(1)OpenFlow Switch Management Commands
- 我的2013
- 安卓UDP通信