当前位置: 首页 > news >正文

京东网站建设的策划书网站搭建设计合同

京东网站建设的策划书,网站搭建设计合同,化妆品备案,新乡网站关键词优化1、24C02简介24C02是一个2Kbit的串行EEPROM存储芯片#xff0c;可存储256个字节数据。工作电压范围为1.8V到6.0V#xff0c;具有低功耗CMOS技术#xff0c;自定时擦写周期#xff0c;1000000次编程/擦除周期#xff0c;可保存数据100年。24C02有一个16字节的页写缓冲器和一…1、24C02简介24C02是一个2Kbit的串行EEPROM存储芯片可存储256个字节数据。工作电压范围为1.8V到6.0V具有低功耗CMOS技术自定时擦写周期1000000次编程/擦除周期可保存数据100年。24C02有一个16字节的页写缓冲器和一个写保护功能。通过I2C总线通讯读写芯片数据通讯时钟频率可达400KHz。可以通过存储IC的型号来计算芯片的存储容量是多大比如24C02后面的02表示的是可存储2Kbit的数据转换为字节的存储量为2*1024/8 256byte有比如24C04后面的04表示的是可存储4Kbit的数据转换为字节的储存量为2*1024/8 512byte;以此来类推其它型号的存储空间。24C02的管脚图如下VCC和VSS是芯片的电源和地电压的工作范围为1.8V~6.0V。A0、A1、A2是IC的地址选择脚。WP是写保护使能脚。SCL是I2C通讯时钟引脚。SDA是I2C通讯数据引脚。2、24C02的设备地址和写保护功能I2C主机在与24C02通讯时需要发送一个设备地址进行寻址在I2C总线上每一个从机设备的地址都是唯一的。24C02的设备地址包含两部分第一部分是bit7~bit4是固定的“1010”第二部分bit3~bit1位由A2、A1、A0组成。主机在与24C02进行通讯时除了发送设备地址还需要发送数据的读写方向位R/W24C02的是设备地址与R/W位组成了一个字节的数据。如下图上图列出了几个存储IC的设备地址与R/W位组成的字节。由图中可以看到存储IC地址的bit7~bit4位固定为“1010”bit3~bit1位由A2、A1、A0引脚的电平状态决定如果Ax接的是电源(高电平)那么Ax1如果Ax接的是地那么Ax0,即由A2、A1、A0可以组合成8种设备地址也就是说在同一个I2C总线上可以同时挂载8个24C02芯片。一般如果I2C总线上只有一片24C02芯片的话A2、A1、A0引脚都接到地。由于24C02只有256个字节的存储空间所以只需要1个字节就可以寻址完24C02的存储空间但是无法寻址完更大容量的存储IC比如24C04的存储容量是512字节需要9个bit的地址位才能寻址完。由上图可以看到24C04的设备地址内是没有A0参数的被a8代替了这个a8就是24C04的第9个bit的地址位也就是说24C04的A0引脚是不起作用的这样也就造成了在I2C总线上只能同时挂载4个24C04芯片。其它存储器如24C08、24C16也可以这么类推。24C02的WP引脚是写保护引脚当WP引脚接高电平的时24C02只能进行读取操作不能进行写操作。只有当WP引脚悬空或接低电平时24C02才能进行写操作。3、24C02数据读取操作在这里只是对24C02的读写进行一些说明和一些注意的实现不会涉及具体的程序代码只是进行代码概述工程代码已经上传到个人GitHub中感兴趣的可以去GitHub中下载查看GitHub代码地址如下MCU通过使用I2C读取24C02任意存储空间地址内的数据代码如下1 uint8_t AT24CXX_READ_ONE_BYTE(uint16_t address)2 {3 uint8_t dat;45 I2C_START();6 AT24CXX_ERR I2C_WRITE_BYTE(AT24CXX_WIRTE_CMD);7 if(AT24CXX_ERR ! 0)//没有响应直接退出8 {9 AT24CXX_ERR I2C_WRITE_BYTE(address 0xFF);10 if(AT24CXX_ERR ! 0)11 {12 I2C_START();1314 AT24CXX_ERR I2C_WRITE_BYTE(AT24CXX_READ_CMD);15 if(AT24CXX_ERR ! 0)16 {17 dat I2C_READ_BYTE(0);18 I2C_STOP();19 }20 }21 }2223 returndat;24 }第5行主机产生一个I2C起始信号第6行发送设备地址和写数据位给24C02第9行是发送需要读取的地址给24C02第12行主机产生一个重复起始信号第14行设备地址和读数据位给24C02第17行是读取24C02相应地址存储的数据。第18行是主机产生I2C结束信号。在上面的程序代码中AT24CXX_ERR是用来获取24C02的应答信号如果主机与24C02的通讯正常主机每发送一个字节给24C0224C02都会反馈一个应答信号给主机如果24C02没有反馈应答信号那么说明24C02正在进行其它操作或者通讯异常导致无法通讯主机会产生一个结束信号来结束操作。在I2C_WRITE_BYTE()函数内部有一个等待应答信号的操作如果没有收到应答信号在I2C_WRITE_BYTE()函数内会产生一个停止信号来结束当前操作。AT24CXX_ERR用来判断接下来的操作是否执行如果AT24CXX_ERR0说明没有收到应答信号直接退本次读取操作如果AT24CXX_ERR!0说明有收到应答信号继续读取操作。24C02内部有一个地址计数器主机发送要读写的存储空间地址给24C02就相当于改变24C02的内部地址计数器的值主机每读写一个字节24C02之后它内部地址计数器的值就会自动加1。也就是说如果当前地址是N那么主机读取完一个字节的数据之后再次读的话就变为了读取N1地址的数据。这里需要注意的一点是24C02的内部地址计数器的地址只能从0~255之间递增这是因为24C02的存储控制只有256个字节地址计数器只能在0~255(共256个地址)内变化。如果连续读取使得地址计数器超过255那么地址计数器就会从0地址开始循环。比如说当前内部计数器地址为255主机在读取一个字节数据之后会导致内部计数器地址变为0那么主机再次读取数据的时候读取得到的是24C02地址0的数据。MCU使用I2C连续读取24C02内多个存储空间地址数数的代码如下1 void AT24CXX_READ_BUFF(uint16_t address,uint8_t *buffer,uint16_t Len)2 {3 uint16_t i;45 I2C_START();6 AT24CXX_ERR I2C_WRITE_BYTE(AT24CXX_WIRTE_CMD);7 if(AT24CXX_ERR ! 0)//没有响应直接退出8 {9 AT24CXX_ERR I2C_WRITE_BYTE(address 0xFF);10 if(AT24CXX_ERR ! 0)11 {12 I2C_START();13 AT24CXX_ERR I2C_WRITE_BYTE(AT24CXX_READ_CMD);14 if(AT24CXX_ERR ! 0)15 {16 for(i0;i22 if(AT24CXX_ERR ! 0)23 {24 I2C_STOP();25 }26 }27 }28 }上面的代码大部分跟读取一个字节的程序代码是一样的不一样的是第16~19行这里用一个for循环来连续读取24C02内的数据这里并没有对超范围读取数据进行限制所以在使用的时候需要注意不要连续读取超过24C02的存储空间就算超过也不会有问题只是会重新开始从0地址读取。4、24C02数据写入操作MCU使用I2C写入一个字节数据到24C02任意存储空间地址内的代码如下1 voidAT24CXX_WRITE_ONE_BYTE(uint16_t address,uint8_t dat)2 {3 I2C_START();4 AT24CXX_ERR I2C_WRITE_BYTE(AT24CXX_WIRTE_CMD);5 if(AT24CXX_ERR ! 0)//没有响应直接退出6 {7 AT24CXX_ERR I2C_WRITE_BYTE(address 0xFF);8 if(AT24CXX_ERR ! 0)9 {10 AT24CXX_ERR I2C_WRITE_BYTE(dat);11 if(AT24CXX_ERR ! 0)12 {13 I2C_STOP();14 }15 }16 }17 }第3行主机产生一个I2C起始信号第4行发送设备地址和写数据位给24C02第7行是发送需要写入数据的地址给24C02第10行是将要写入的数据发送给24C02。第18行是主机产生I2C结束信号。上面大部分操作跟读取是一样的不一样的只是最后将读取操作改为了写入操作。如果需要连续写入数据可以如下1 for(i 0;i 256;i )2 {3 AT24C02_BUFF[i] i;4 AT24CXX_WRITE_ONE_BYTE(i,AT24C02_BUFF[i]);5 }但是在实际使用的过程中发现只有一部分AT24C02_BUFF[]数组里面的数据被写入到了24C02当中有一些数据没有写进24C02。这是因为24C02擦写数据没有那么快需要一定的时间在24C02正在擦写数据的过程中是不会应答主机的通讯的所以如果主机在写入一个数据之后又立马写入另一个数据就会导致24C02跟不上主机的通讯速度从而导致无法写入数据。需要注意的是24C02并不是在主机发送数据给24C02之后就立马擦写数据的24C02是在主机产停止信号之后才开始擦写数据的并且在擦写数据完成之前不会响应主机的其它操作。可以通过一定的延时函数来等待24C02擦写完成代码如下for(i 0;i 256;i ){AT24C02_BUFF[i]i;AT24CXX_WRITE_ONE_BYTE(i,AT24C02_BUFF[i]);HAL_Delay(1);}通过调用HAL_Delay()函数进行延时具体的延时时间可以通过调试来决定这里使用1ms的延时时间具体24C02擦写数据需要多久并不清楚。除了通过延时函数进行等待24C02擦写完成也可以通过发送设备地址给24C02然后查询是否有应答信号返回来判断24C02是否擦写完成。24C02在擦写数据时是不会反馈应答信号给主机的这样就可以通过不断的发送数据给24C02然后查询应答信号来判断24C02是否擦写完成一旦擦写完成就可以进行下一个数据的写入。代码如下1 void Wait_AT24CXX_WRITE_OK(void)2 {3 uint8_t Wait_Cnt;45 Wait_Cnt 50;6 do7 {8 I2C_START();9 AT24CXX_ERR I2C_WRITE_BYTE(AT24CXX_WIRTE_CMD);10 if(AT24CXX_ERR ! 0)11 {12 I2C_STOP();//接收到响应信号退出13 break;14 }1516 }while(Wait_Cnt--);1718 }Wait_Cnt是一个次数限制变量不能无限的在里面等待不然遇到异常就有可能造成程序卡死。程序通过发送起始信号、发送设备地址和写数据方向给24C02如果24C02反馈了一个应答信号给主机主机就产生一个停止信号然后退出当前循环。应用代码如下1 for(i 0;i 256;i )2 {3 AT24C02_BUFF[i] i;4 AT24CXX_WRITE_ONE_BYTE(i,AT24C02_BUFF[i]);5 Wait_AT24CXX_WRITE_OK();//可以通过发送设备地址给从机通过从机反馈的响应信号来判断从机是否可以正常通讯6 }5、24C02页写入24C02有一个页写入功能可以连续写入16个字节的数据。24C02可以以页来划分存储空间每16个字节组成一个页24C02的存储空间大小为256个字节所以24C02总共有16个页。如页0地址从0x00~0x0F页1地址从0x10~0x1F......页15地址从0xF0~0xFF24C02可以在一个页内连续的写入数据但是需要注意的是如果写入的数据超过页大小那么就会覆盖页初始地址的值比如说连续写入3个数据第1个数据写入到地址0x0F当中第2个数据由于溢出页的限制会被写入到地址0x00当中第3个数据会被写入到地址0x01当中。以个人的理解24C02内部有一个16byte的数据缓存器在上面的介绍中知道主机在发送数据给24C02的时候24C02是不会擦写数据的只有当主机发送停止信号之后24C02才会擦写数据。那么当主机发送数据给24C02时只是将数据写入到了24C02内部的缓存器中只有当主机发送结束信号之后24C02才将缓存器内的数据写入到内部存储空间。由24C02的数据缓存器只有16个byte(每个型号的存储IC的页大小是不一样的也就是缓存器大小是不不一样的)。所以如果写入的数据超过缓存器的大小就会覆盖之前写入的数据。使用页写入连续将数据写入24C02的代码如下1 void AT24CXX_WRITE_BUFF(uint16_t address,uint8_t *Buffer,uint16_t Len)2 {3 uint8_t i;4 uint16_t re_main;56 if(address 256)//对输入的地址进行限制24C02只有256个字节的存储空间其它型号的存储器IC可以通过查资料7 {8 return;9 }1011 re_main 256 - address;//计算出还有多少存储空间1213 if(Len re_main)//如果要写入的数据量超过剩余存储空间则只写入剩余存储空间数量的数据14 {15 Len re_main;16 }1718 re_main 16 - address%16;//计算当前页还可以写入多少个数据1920 if(Len re_main)//如果要写入的数据小于等于当前页剩余的存储空间则只写入Len个字节数据就好不需要跨页操作21 {22 re_main Len;23 }2425 do26 {27 I2C_START();28 AT24CXX_ERR I2C_WRITE_BYTE(AT24CXX_WIRTE_CMD);29 if(AT24CXX_ERR 0)//没有响应直接退出30 {31 break;32 }3334 I2C_WRITE_BYTE(address 0xFF);35 for(i 0;i re_main;i )//最多连续写入一个页数据的大小36 {37 AT24CXX_ERR I2C_WRITE_BYTE(Buffer[i]);38 }3940 I2C_STOP();41 Wait_AT24CXX_WRITE_OK();//等待24C02完成擦写数据动作4243 if(re_main !Len)44 {45 address re_main;//已经写入re_main个数据46 Buffer re_main;47 Len -re_main;4849 re_main 16;//写一个页的的大小也是16个字节5051 if(Len re_main)52 {53 re_main Len;54 }55 }56 else57 {58 break;//数据写入完成退出59 }60 }61 while(1);62 }AT24CXX_WRITE_BUFF()函数的思路如下首先判断输入的地址是否超过存储IC的存储空间如果超过则退出如第6~9行。计算出输入的地址到存储器存储的结束地址剩余多少空间如果要写入的数据比剩余空间还多那么剩余多少空间就写入多少空间需要写入的多余部分就去掉如第11~16行。计算当前页还可以写入多少数据如果当前页剩余的空间比Len要写入的数据长度还大那么只要写入当前页就足够了不需要再跨页写入数据。如第18~23行。通过一个while(1)循环连续写入数据到24C02中。第27~41行是将re_main个数据写入到24C02当中由于是在一个页内操作所以可以连续写入写完之后在产生一个结束信号然后等待24C02擦写完成。如果不需要跨页写入就已经将数据全部写完那么就可以直接break退出while循环如第58行。如果需要跨页写入数据还需要将地址、buffer、Len减去已经写入的数据量然后下一个页可以写入整个页的数据量也就是16个字节通过比较判断一个页的剩余空间是否能够写完剩余的Len数据如果不行就重复循环操作如果可以写完在写完之后就退出while循环。
http://www.zqtcl.cn/news/863673/

相关文章:

  • 做什么软件做网站效率最好网站公司建设都招聘那些职位
  • 缙云建设局网站深圳营销型网站设计
  • 企业网站制作价格成都高端网站建设公司哪家好
  • wordpress+做仿站网站建设费用属于业务宣传费吗
  • 昆明企业网站制作wordpress移动端插件menu
  • 长沙网站设计培训学校南宁建设网站哪里好
  • 提高基层治理效能全国seo搜索排名优化公司
  • 如何建设网站简介WordPress集成tipask
  • 青海网站开发公司建筑公司的愿景怎么写
  • 建设银行集团网站首页优化科技
  • dede 汽车网站网站上的彩票走势图是怎么做的
  • 网站内容营销呼市推广网站
  • 南宁网站建设价格医院有关页面设计模板
  • 城乡住房和城乡建设厅网站湖州公司网站建设
  • h5响应式的网站建站空间哪个好
  • 徐州网站建设与推广公众号开发技术风险
  • 男女做差差事的视频网站自己做一个小程序要多少钱
  • 临沂网站建设哪家好重庆建设招标造价信息网站
  • 筑巢网络官方网站深圳网站开发设计公司排名
  • 镇江市网站制作网页的代码实例
  • 吉林省网站制作公司有哪些唐山设计网站公司
  • 浙江国泰建设集团有限公司网站ps软件下载电脑版免费怎么下载
  • 昆明网站建设价格自力教育
  • 黄冈网站推广软件视频下载孝感做网站xgsh
  • 用jsp做一网站的流程图互联网博客网站
  • 南宁一站网 给网站做营销微网站和网站同步像素
  • 如何建设一个视频小网站软件做网站
  • 小企业网站建设公司哪家好网站怎样设计网页
  • 那个网站做搬家推广比较好wordpress twenty eleven
  • 微站图片临淄信息网招聘最新信息