链接发不了,给你粘贴在这里吧
- 下面是一个完整的MC9S12DG128 EEPROM读写程序,程序来源于网络,反馈于网络,对大家肯定有用!下面仅贴出部分主文件和主函数,完整工程可以下载附件,开发板用户可以直接操作演示程序。
- /********************************************************
- 龙丘MC9S12DG128 多功能开发板
- Designed by Chiu Sir
- E-mail:chiusir@163.com
- 软件版本:V1.2
- 最后更新:2009年8月25日
- ------------------------------------
- Code Warrior 5.0
- Target : MC9S12dg128b
- Crystal: 16.000Mhz
- busclock:16.000MHz
- pllclock:32.000MHz
- ------------------------------------
- 【程序使用说明】:
- 【重要修改】
- 在Start12.c文件最前面加入:#define _HCS12_SERIALMON
- 在Project.prm中:
- 添加下面的代码:
- EEPROM = READ_ONLY 0x0800 TO 0x0FFB;
- 修改下面的代码:
- RAM = READ_WRITE 0x2000 TO 0x3FFF;
-
- 【串口波特率】:9600,n,8,1
- 【按UP】 修改欲写入的数据
- 【按OK】 对块的读操作
- 【按ESC】 对块的重新写入数据
- 【使用步骤】:
- 1.插上电源和串口线,并打开串口调试工具
- 2.按ESC读取原始数据
- 3.按UP/DOWN修改欲写入的数据
- 4.按OK写入新数据
- 5.复位单片机然后按ESC读取上次写入的数据,比对保存结果.
- *****************************************************************************************/
- #i nclude <hidef.h>
- #i nclude "derivative.h"
- #i nclude "LQprintp.h"
- #i nclude "LQEEPROM.h"
- volatile word testnumber=0;
- /**************************************************
- 复杂测试操作:
- 1.按ESC读取原始数据
- 2.按UP/DOWN修改欲写入的数据
- 3.按OK写入新数据
- 4.复位单片机然后按ESC读取上次写入的数据,比对保存结果.
- ***************************************************/
- void Test_EE_WriteRead(void)
- {
- word cnt;
-
- if(PTIH_PTIH7==0) //OK
- {
- printp("write and read data:\n");
- for(cnt=0;cnt<10;cnt+=2)
- {
- EEP_Wt_Word(EEPROM_ADDR_BASE+cnt,0xffff,EEP_Word_Erase);
- EEP_Wt_Word(EEPROM_ADDR_BASE+cnt ,0x1200+cnt+testnumber ,EEP_Word_Prog);
- EEP_Wt_Word(EEPROM_ADDR_BASE+cnt+1,0x1200+cnt+testnumber+1,EEP_Word_Prog);
- u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt);
- printp("%04x,",u16tmData);
- u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt+1);
- printp("%04x,",u16tmData);
- }
- printp("\n");
- }
- else if(PTIH_PTIH6==0) //ESC
- {
- printp("read data:\n");
- for(cnt=0;cnt<10;cnt+=2)
- {
- u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt);
- printp("%04x,",u16tmData);
- u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt+1);
- printp("%04x,",u16tmData);
- }
- printp("\n");
- }
- else if(PTIH_PTIH2==0) //UP
- {
- printp("cnt:%04x \n",++testnumber);
- }
- else if(PTIH_PTIH5==0) //DOWN
- {
- printp("cnt:%04x \n",--testnumber);
- }
- }
- /**************************************************
- 总线时钟初始化函数:16MHz=晶振频率
- 编写:龙丘
- 最后修改:2009.11.18
- ***************************************************/
- static void Set_Bus_16M(void)
- {
- CLKSEL=0X00; //disengage PLL to system
- PLLCTL_PLLON=1; //turn on PLL
- SYNR=1;
- REFDV=1; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
- _asm(nop); //BUS CLOCK=16M
- _asm(nop);
- while(!(CRG**_LOCK==1)); //when pll is steady ,then use it;
- CLKSEL_PLLSEL =1; //engage PLL to system;
- }
- /**************************************************
- main()
- 编写:龙丘
- 最后修改:2009.11.18
- ***************************************************/
- void main(void)
- {
- Set_Bus_16M();
- SCI_Init();
- printp("started!\n");
- DDRB =0xff;
- PORTB=0x00;
- EEPROM_init();
- DisableInterrupts;
- PORTB=0xFF;
- for(;;)
- {
- //Simple_Test();
- Test_EE_WriteRead();
- Dly_ms(500);
- PORTB_BIT0=~ PORTB_BIT0;
- } /* wait forever */
- /* please make sure that you never leave this */
- }
-
- /**************************************************
- 延时函数:ms个毫秒
- 编写:龙丘
- 最后修改:2009.11.18
- ***************************************************/
- void Dly_ms(int ms) //x取值1~65536;
- {
- int ii,jj;
- if (ms<1) ms=1;
- for(ii=0;ii<ms;ii++)
- for(jj=0;jj<1335;jj++); //16MHz--1ms
- }
- /**************************************************
- 延时函数:ms个毫秒
- 编写:龙丘
- 最后修改:2009.11.18
- ***************************************************/
- void Dly_10us(int ms) //x取值1~65536;
- {
- int ii,jj;
- if (ms<1) ms=1;
- for(ii=0;ii<ms;ii++)
- for(jj=0;jj<13;jj++); //16MHz--10us
- }
- /*************************************************
- EEPROM模块初始化程序
- 编写:龙丘
- 最后修改:2009.11.18
- *************************************************/
- void EEPROM_init(void)
- {
- ECLKDIV=0x4A; // 采用8分频,因为OSCLK=16M,又为了使ECLK
- // 达到190KHZ,所以EDIV=21,即ECLK=16M/8/11=190.5KHZ
- ECNFG=0x00; // 禁止EEPROM相关操作的中断
- while(ECLKDIV_EDIVLD == 0); // 等待时钟设置成功
- EPROT_EPOPEN=1; // EEPROM没有保护,可以进行编程与擦除
- EPROT_EPDIS=1; // EEPROM保护禁止
- }
- /*************************************************
- 写EEPROM程序
- Addr: 要操作的EEPROM偏移地址
- Data: 要操作的EEPROM数据
- OpType:操作命令类型
- 编写:龙丘
- *************************************************/
- void EEP_Wt_Word(word * Addr,word Data,byte OpType)
- {
- DisableInterrupts;
- while(ESTAT_CBEIF == 0); // 等待EEPROM命令缓冲区为空
- *Addr=Data; // 设置EEPROM的偏移地址
- ECMD=OpType; // 指令的类型
- ESTAT |= 0x80; // 清命令缓冲标志,开始执行命令
- while(ESTAT_CCIF == 0); // 等待命令完成
- EnableInterrupts;
- }
- /*************************************************
- 读EEPROM程序
- Addr: 要操作的EEPROM偏移地址
- 返回值:读到的结果数据
- 编写:龙丘
- 最后修改:2009.11.18
- *************************************************/
- word EEP_Rd_Word(word * Addr)
- {
- word TempData;
- DisableInterrupts;
- TempData=*Addr; // 读EEPROM的偏移地址的数据
- return(TempData);
- }
- /*************************************************
- 简单测试操作
- 编写:龙丘
- 最后修改:2009.11.18
- *************************************************/
- void Simple_Test(void)
- {
- word cnt;
-
- printp("write and read data:\n");
- for(cnt=0;cnt<1024;cnt+=2)
- {
- EEP_Wt_Word(EEPROM_ADDR_BASE+cnt,0xffff,EEP_Word_Erase);
- EEP_Wt_Word(EEPROM_ADDR_BASE+cnt ,0x1200+cnt,EEP_Word_Prog);
- EEP_Wt_Word(EEPROM_ADDR_BASE+cnt+1,0x1200+cnt+1,EEP_Word_Prog);
- u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt);
- printp("%04x,",u16tmData);
- u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt+1);
- printp("%04x,",u16tmData);
- if(cnt%16==0) printp("\n");
- } }
|