IAP15W4K61S4单片机EEPROM读写程序

devtools/2024/10/19 2:14:42/

/*-------------关闭IAP----------------*/
              void IapIdle()
              {
              IAP_CONTR = 0;                     //关闭IAP功能
              IAP_CMD = 0;                       //清除命令寄存器
              IAP_TRIG = 0;                      //清除触发寄存器
              IAP_ADDRH = 0x80;                  //将地址设置到非IAP区域
              IAP_ADDRL = 0;
              }
/*-----从ISP/IAP/EEPROM区域读取一字节-----*/
              BYTE IapReadByte(WORD addr)
              {
              BYTE dat;                          //数据缓冲区
              IAP_CONTR = ENABLE_IAP;            //使能IAP
              IAP_CMD = CMD_READ;                //设置IAP命令
              IAP_ADDRL = addr;                  //设置IAP低地址
              IAP_ADDRH = addr >> 8;             //设置IAP高地址
              IAP_TRIG = 0x5a;                   //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                   //写触发命令(0xa5)
              _nop_();                           //等待ISP/IAP/EEPROM操作完成
              dat = IAP_DATA;                    //读ISP/IAP/EEPROM数据
              IapIdle();                         //关闭IAP功能
              return dat;                        //返回
              }
/*------写一字节数据到ISP/IAP/EEPROM区域--------*/
              void IapProgramByte(WORD addr, BYTE dat)
              {
              IAP_CONTR = ENABLE_IAP;         //使能IAP
              IAP_CMD = CMD_PROGRAM;          //设置IAP命令
              IAP_ADDRL = addr;               //设置IAP低地址
              IAP_ADDRH = addr >> 8;          //设置IAP高地址
              IAP_DATA = dat;                 //写ISP/IAP/EEPROM数据
               IAP_TRIG = 0x5a;                //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                //写触发命令(0xa5)
              _nop_();                        //等待ISP/IAP/EEPROM操作完成
              IapIdle();
              }
/*---------扇区擦除-----------*/
              void IapEraseSector(WORD addr)
              {
              IAP_CONTR = ENABLE_IAP;         //使能IAP
              IAP_CMD = CMD_ERASE;            //设置IAP命令
              IAP_ADDRL = addr;               //设置IAP低地址
              IAP_ADDRH = addr >> 8;          //设置IAP高地址
              IAP_TRIG = 0x5a;                //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                //写触发命令(0xa5)
              _nop_();                        //等待ISP/IAP/EEPROM操作完成
              IapIdle();
              }
/*************写参数到EEPROM*******************************/
              void Write_EEprom()
              {
               IapEraseSector(IAP_ADDRESS); //扇区擦除
               IapProgramByte(IAP_ADDRESS+1,val1>>8&0XFF);/*A轴速度高八位*/    
               IapProgramByte(IAP_ADDRESS+2,val1&0x00FF); /*A轴速度低八位*/
                                
               IapProgramByte(IAP_ADDRESS+3,val2>>8&0XFF);/*B轴速度高八位*/  
               IapProgramByte(IAP_ADDRESS+4,val2&0x00FF); /*B轴速度低八位*/
                                
               IapProgramByte(IAP_ADDRESS+5,val3>>8&0XFF);/*C轴速度高八位*/  
               IapProgramByte(IAP_ADDRESS+6,val3&0x00FF); /*C轴速度低八位*/

               IapProgramByte(IAP_ADDRESS+7,val4>>8&0XFF);/*D轴速度高八位*/  
               IapProgramByte(IAP_ADDRESS+8,val4&0x00FF); /*D轴速度低八位*/
                                
               IapProgramByte(IAP_ADDRESS+9,val5>>8&0XFF);/*润滑模数高八位*/  
               IapProgramByte(IAP_ADDRESS+10,val5&0x00FF);/*润滑模数低八位*/

               IapProgramByte(IAP_ADDRESS+11,val6>>8&0XFF);/*润滑时间高八位*/  
               IapProgramByte(IAP_ADDRESS+12,val6&0x00FF); /*润滑时间低八位*/

               IapProgramByte(IAP_ADDRESS+13,val7>>8&0XFF);/*吹气时间1高八位*/  
               IapProgramByte(IAP_ADDRESS+14,val7&0x00FF); /*吹气时间1低八位*/
                                
               IapProgramByte(IAP_ADDRESS+15,val8>>8&0XFF);/*吹气时间2高八位*/  
               IapProgramByte(IAP_ADDRESS+16,val8&0x00FF); /*吹气时间2低八位*/

               IapProgramByte(IAP_ADDRESS+17,val9>>8&0XFF);/*打油次数高八位*/  
               IapProgramByte(IAP_ADDRESS+18,val9&0x00FF); /*打油次数低八位*/

               IapProgramByte(IAP_ADDRESS+19,val10>>8&0XFF);/*间隙时间高八位*/  
               IapProgramByte(IAP_ADDRESS+20,val10&0x00FF); /*间隙时间低八位*/

               IapProgramByte(IAP_ADDRESS+21,val11>>8&0XFF);/*攻丝超时高八位*/  
               IapProgramByte(IAP_ADDRESS+22,val11&0x00FF); /*攻丝超时低八位*/

               IapProgramByte(IAP_ADDRESS+23,val12>>8&0XFF);/*旋转超时高八位*/  
               IapProgramByte(IAP_ADDRESS+24,val12&0x00FF); /*旋转超时低八位*/

               IapProgramByte(IAP_ADDRESS+25,val13>>8&0XFF);/*退刀超时高八位*/  
               IapProgramByte(IAP_ADDRESS+26,val13&0x00FF); /*退刀超时低八位*/

               IapProgramByte(IAP_ADDRESS+27,val14>>8&0XFF);/*润滑超时高八位*/  
               IapProgramByte(IAP_ADDRESS+28,val14&0x00FF); /*润滑超时低八位*/
               //val15
               IapProgramByte(IAP_ADDRESS+29,val15>>8&0XFF);/*过桥开时间高八位*/  
               IapProgramByte(IAP_ADDRESS+30,val15&0x00FF); /*过桥开时间低八位*/

               IapProgramByte(IAP_ADDRESS+31,val16>>8&0XFF);/*手动速度高八位*/  
               IapProgramByte(IAP_ADDRESS+32,val16&0x00FF); /*手动速度低八位*/
              }
/***********************************/
              void red_eeprom(void)
              {
              uint m,n;        
              m=IapReadByte(IAP_ADDRESS+1);           //A轴速度高八位
              n=IapReadByte(IAP_ADDRESS+2);           //A轴速度低八位
              val1=(m*256+n)&0X7FFF;                  //A轴速度屏蔽最高负位 111 1111
              m=IapReadByte(IAP_ADDRESS+3);           //B轴速度高八位
              n=IapReadByte(IAP_ADDRESS+4);           //B轴速度低八位
              val2=(m*256+n)&0X7FFF;                  //B轴速度屏蔽最高负位 111 1111
              m=IapReadByte(IAP_ADDRESS+5);           //C轴速度高八位
               n=IapReadByte(IAP_ADDRESS+6);           //C轴速度低八位
              val3=(m*256+n)&0X7FFF;                  //C轴速度屏蔽最高负位 111 1111
              m=IapReadByte(IAP_ADDRESS+7);           //调整时间高八位
              n=IapReadByte(IAP_ADDRESS+8);           //调整时间低八位
              val4=(m*256+n)&0X7FFF;                  //调整时间屏蔽最高负位 111 1111    
              m=IapReadByte(IAP_ADDRESS+9);           //润滑模数高八位
              n=IapReadByte(IAP_ADDRESS+10);          //润滑模数低八位
              val5=(m*256+n)&0X7FFF;                  //润滑模数屏蔽最高负位 111 1111
              m=IapReadByte(IAP_ADDRESS+11);          //润滑时间高八位
              n=IapReadByte(IAP_ADDRESS+12);          //润滑时间低八位
              val6=(m*256+n)&0X7FFF;                  //润滑时间屏蔽最高负位 111 1111    
              m=IapReadByte(IAP_ADDRESS+13);          //吹气时间1高八位
              n=IapReadByte(IAP_ADDRESS+14);          //吹气时间1低八位
              val7=(m*256+n)&0X7FFF;                  //吹气时间1屏蔽最高负位 111 1111    
              m=IapReadByte(IAP_ADDRESS+15);          //吹气时间2高八位
              n=IapReadByte(IAP_ADDRESS+16);          //吹气时间2低八位
              val8=(m*256+n)&0X7FFF;                  //吹气时间2屏蔽最高负位 111 1111
              m=IapReadByte(IAP_ADDRESS+17);          //打油次数高八位
              n=IapReadByte(IAP_ADDRESS+18);          //打油次数低八位
              val9=(m*256+n)&0X7FFF;                  //打油次数屏蔽最高负位 111 1111
              m=IapReadByte(IAP_ADDRESS+19);          //间隙时间高八位
              n=IapReadByte(IAP_ADDRESS+20);          //间隙时间低八位
              val10=(m*256+n)&0X7FFF;                  //间隙时间屏蔽最高负位 111 1111
              m=IapReadByte(IAP_ADDRESS+21);          //攻丝超时高八位
              n=IapReadByte(IAP_ADDRESS+22);          //攻丝超时低八位
              val11=(m*256+n)&0X7FFF;                  //攻丝超时屏蔽最高负位 111 1111
              m=IapReadByte(IAP_ADDRESS+23);          //攻丝超时高八位
              n=IapReadByte(IAP_ADDRESS+24);          //旋转超时低八位
              val12=(m*256+n)&0X7FFF;                  //旋转超时屏蔽最高负位 111 1111
              m=IapReadByte(IAP_ADDRESS+25);          //退刀超时高八位
              n=IapReadByte(IAP_ADDRESS+26);          //退刀超时低八位
              val13=(m*256+n)&0X7FFF;                  //退刀超时屏蔽最高负位 111 1111
              m=IapReadByte(IAP_ADDRESS+27);          //润滑超时高八位
              n=IapReadByte(IAP_ADDRESS+28);          //润滑超时低八位
              val14=(m*256+n)&0X7FFF;                  //润滑超时屏蔽最高负位 111 1111
              m=IapReadByte(IAP_ADDRESS+29);          //过桥开时间高八位
              n=IapReadByte(IAP_ADDRESS+30);          //过桥开时间低八位
              val15=(m*256+n)&0X7FFF;                  //过桥开时间屏蔽最高负位 111 1111
              m=IapReadByte(IAP_ADDRESS+31);          //手动速度高八位
              n=IapReadByte(IAP_ADDRESS+32);          //手动速度低八位
              val16=(m*256+n)&0X7FFF;                  //手动速度屏蔽最高负位 111 1111
              }    
/*************恢复出厂值************/
              void RESET_Data()    
              {
              val1=10;                                  //电机速度
              val2=18000;                              //退丝补偿
              val3=2;                                  //补偿速度
              val4=10;                                  //调整时间
              val5=100;                                  //润滑模数
              val6=20;                                  //润滑时间
              val7=1;                                  //吹气时间1
              val8=1;                                  //吹气时间2
              val9=10;                                  //缺料计时
              val10=2;                                  //间隙时间
              val11=10;                                  //攻丝超时
              val12=10;                                  //旋转超时
              val13=25;                                  //退刀超时
              val14=25;                                  //润滑超时
              val15=5;                                  //过桥开时间
              val16=1;                                  //手动电机速度
              }
/***********************************/
              void Dis_Data(void)
              {
               printf("n0.val=%d\xff\xff\xff",val1);  //电机速度
               printf("n0.val=%d\xff\xff\xff",val1);  //退丝补偿
               printf("n1.val=%d\xff\xff\xff",val2);  //补偿速度
               printf("n2.val=%d\xff\xff\xff",val3);  //C轴速度
               printf("n3.val=%d\xff\xff\xff",val4);  //D轴速度    
               printf("n4.val=%d\xff\xff\xff",val5);  //润滑模数
               printf("n5.val=%d\xff\xff\xff",val6);  //润滑时间
               printf("n6.val=%d\xff\xff\xff",val7);  //吹气时间1
               printf("n7.val=%d\xff\xff\xff",val8);  //吹气时间2
               printf("n9.val=%d\xff\xff\xff",val9);  //打油次数
               printf("n10.val=%d\xff\xff\xff",val10);//间隙时间
               printf("n11.val=%d\xff\xff\xff",val11);//攻丝超时
               printf("n12.val=%d\xff\xff\xff",val12);//旋转超时
               printf("n13.val=%d\xff\xff\xff",val13);//退刀超时
               printf("n14.val=%d\xff\xff\xff",val14);//润滑超时
              }                
/****************刷新显示*******************/                            
              void Renovate(void)
              {
               uint mn;
               mn=0X00;
               printf("n0.val=%d\xff\xff\xff",mn);      //A轴速度
               printf("n0.val=%d\xff\xff\xff",mn);    //A轴速度
               printf("n1.val=%d\xff\xff\xff",mn);      //B轴速度
               printf("n2.val=%d\xff\xff\xff",mn);    //C轴速度    
               printf("n3.val=%d\xff\xff\xff",mn);      //D轴速度    
               printf("n4.val=%d\xff\xff\xff",mn);    //润滑模数
               printf("n5.val=%d\xff\xff\xff",mn);      //润滑时间
               printf("n6.val=%d\xff\xff\xff",mn);    //吹气时间1
               printf("n7.val=%d\xff\xff\xff",mn);      //吹气时间2
               printf("n9.val=%d\xff\xff\xff",mn);    //打油次数    
               printf("n10.val=%d\xff\xff\xff",mn);      //间隙时间
               printf("n11.val=%d\xff\xff\xff",mn);   //攻丝超时
               printf("n12.val=%d\xff\xff\xff",mn);      //旋转超时
               printf("n13.val=%d\xff\xff\xff",mn);   //退刀超时
               printf("n14.val=%d\xff\xff\xff",mn);      //润滑超时
               red_eeprom();
               Dis_Data();
              }        
/******************************************************/                            
              void Data_Set(void )
              {
               if (a[0]==0XD5&&a[1]==0X00)       //A轴速度
               {
               val1=a[3]*256+a[2];               //
               Write_EEprom();
               Renovate();                       //刷新显示
               }
               else if (a[0]==0XD5&&a[1]==0X01)  //B轴速度
               {
               val2=a[3]*256+a[2];               //
               Write_EEprom();
               Renovate();                       //刷新显示
               }
               else if (a[0]==0XD5&&a[1]==0X02)  //C轴速度
               {
               val3=a[3]*256+a[2];               //
               Write_EEprom();
               Renovate();                       //刷新显示
               }
               else if (a[0]==0XD5&&a[1]==0X03)  //D轴速度
               {
               val4=a[3]*256+a[2];               //
               Write_EEprom();
               Renovate();                       //刷新显示
               }
               else if (a[0]==0XD5&&a[1]==0X04)  //比例系数1
               {
               val5=a[3]*256+a[2];               //
               Write_EEprom();
               Renovate();                       //刷新显示
               }
               else if (a[0]==0XD5&&a[1]==0X05)  //比例系数2
               {
               val6=a[3]*256+a[2];               //
               Write_EEprom();
               Renovate();                       //刷新显示
               }
               else if (a[0]==0XD5&&a[1]==0X06)  //吹气时间1
               {
               val7=a[3]*256+a[2];               //
               Write_EEprom();
               Renovate();                       //刷新显示
               }
               else if(a[0]==0XD5&&a[1]==0X07)   //吹气时间2
               {
               val8=a[3]*256+a[2];               //
               Write_EEprom();
               Renovate();                       //刷新显示
               }
               else if(a[0]==0XD5&&a[1]==0X08)   //打油次数
               {
               val9=a[3]*256+a[2];               //
               Write_EEprom();
               Renovate();                       //刷新显示
               }
               else if(a[0]==0XD5&&a[1]==0X09)   //打油计数器
               {
               val10=a[3]*256+a[2];              //
               Write_EEprom();
               Renovate();                       //刷新显示
               }
               else if(a[0]==0XD5&&a[1]==0X0A)   //攻丝超时
               {
               val11=a[3]*256+a[2];              //
               Write_EEprom();
               Renovate();                       //刷新显示
               }
               else if(a[0]==0XD5&&a[1]==0X0B)   //旋转超时
               {
               val12=a[3]*256+a[2];              //
               Write_EEprom();
               Renovate();                       //刷新显示
               }
               else if(a[0]==0XD5&&a[1]==0X0C)   //退刀超时
               {
               val13=a[3]*256+a[2];              //
               Write_EEprom();
               Renovate();                       //刷新显示
               }
               else if(a[0]==0XD5&&a[1]==0X0D)   //润滑超时
               {
               val14=a[3]*256+a[2];              //
               Write_EEprom();
               Renovate();                       //刷新显示
               }
              }  


http://www.ppmy.cn/devtools/37527.html

相关文章

【Redis分布式缓存】分片集群

Redis 分片集群 搭建分片集群 集群结构 分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下: 这里我们会在同一台虚拟机中开启6个redis实例&…

20240507最新 ubuntu20.04安装ros noetic

ubuntu20.04安装ros 主要参考博客 【ROS】在 Ubuntu 20.04 安装 ROS 的详细教程_ubuntu20.04安装ros-CSDN博客 出现问题 1.ubuntu20.04 更换清华源报错 ubuntu20.04 更换清华源报错_gvfs metadata is not supported. fallback to teplme-CSDN博客 ?&#xff1f…

关于RN中Image的style下tintColor使用

React Native中Image组件的style属性下面有个tintColor 文档描述如下: tintColor: color Changes the color of all the non-transparent pixels to the tintColor. 改变不透明像素的颜色 比如一个白色背景页面,黑色icon图标,手机切换到暗黑…

UDP多播

1 、多播的概念 多播,也被称为组播,是一种网络通信模式,其中数据的传输和接收仅在同一组内进行。多播具有以下特点: 多播地址标识一组接口:多播使用特定的多播地址,该地址标识一组接收数据的接口。发送到多…

北京大学-知存科技存算一体联合实验室揭牌,开启知存科技产学研融合战略新升级

5月5日,“北京大学-知存科技存算一体技术联合实验室”在北京大学微纳电子大厦正式揭牌,北京大学集成电路学院院长蔡一茂、北京大学集成电路学院副院长鲁文高及学院相关负责人、知存科技创始人兼CEO王绍迪、知存科技首席科学家郭昕婕博士及企业研发相关负…

Git 仓库基本概念和使用方式

Git 是一种分布式版本控制系统,它用于跟踪和管理软件开发项目中的代码修改。以下是 Git 的基本概念和使用方式。 1. 仓库(Repository):Git 仓库是存储代码的地方,可以是本地仓库(local repository&#xf…

大数据中服役新数据节点和退役旧节点步骤(hive,hadoop)

1- 节点上线操作 当要新上线数据节点的时候 ,需要把数据节点的名字追加在 dfs.hosts (1)关闭新增节点的防火墙 (2)在 NameNode 节点的 hosts 文件中加入新增数据节点的 hostname (3)在每个新…

知道创宇安全服务实习

自我介绍攻防演练讲一下,我讲到了内网利用,用到了frp/nps这种nps直接扫不会有被发现吗?cs搭建在vps,有做什么隐藏吗,(端口或者cdn之类的)域前置了解吗cs上传的木马免杀了吗问了linux怎么查看进程…