[资料分享与下载] 飞思卡尔单片机DZ60---EEPROM读写

[复制链接]
niuyaliang 发表于 2015-2-27 19:53 | 显示全部楼层 |阅读模式
  1. [cpp] view plaincopy
  2. //向EEPROM中写入数据,然后读出数据,赋值给PORTD,点亮相应的LED灯  
  3.   
  4. #include <hidef.h> /* for EnableInterrupts macro */  
  5. #include "derivative.h" /* include peripheral declarations */  
  6.   
  7.   
  8. #define uint unsigned int  
  9. #define uchar unsigned char  
  10.   
  11.   
  12. #define LED     PTDD  
  13. #define LED_DIR PTDDD  
  14.   
  15. #define LED_OFF 0XFF  
  16.   
  17.   
  18. void Read_EEPROM(uint start_addr, uchar *pReadbuf, uchar length);  
  19. void Write_EEPROM(uint start_addr, uchar *pData, uchar length);  
  20.   
  21. //uchar Data[6] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};  
  22. //uchar Readbuf[6] = {0};  
  23.   
  24. uchar Data[6] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF};  
  25. uchar Readbuf[6] = {0XFF};  
  26.   
  27. uchar i = 0;  
  28. uint j = 60000;  
  29.   
  30.   
  31. /*************************************************************/  
  32. /*                  初始化总线时钟PEE模式                    */  
  33. /*              外部晶振频率为4MHz,总线频率16MHz            */  
  34. /*************************************************************/  
  35. void INIT_MCG(void)   
  36. {  
  37.   MCGC2=0x36;         
  38.   while(!MCGSC_OSCINIT);      
  39.   MCGC1=0xb8;  
  40.   while(MCGSC_IREFST);  
  41.   while(MCGSC_CLKST!=0b10);  
  42.   MCGC2_LP = 1;  
  43.   MCGC1 = 0x90;  
  44.   MCGC3 = 0x48;      
  45.   MCGC2_LP = 0;  
  46.   while(!MCGSC_PLLST);  
  47.   while(!MCGSC_LOCK);  
  48.   MCGC1 = 0x10;  
  49.   while(MCGSC_CLKST!=0b11);  
  50. }  
  51.   
  52.   
  53. void main(void) {  
  54.   
  55.   DisableInterrupts;  
  56.   SOPT1 = 0;  
  57.   INIT_MCG();  
  58.    
  59.   LED_DIR = 0XFF;  
  60.   LED = LED_OFF;  
  61.    
  62.    
  63.   EnableInterrupts; /* enable interrupts */  
  64.   /* include your code here */  
  65.    
  66.   
  67.    
  68.   FCDIV = 73;//设置分频,16MHZ/8/(9+!)在150k到200khz之间  
  69.    
  70.   //EEPROM整个空间为2*1024BYTES,地址为0x1400到0x17FF  
  71.    
  72.   //写入数据部分  
  73.   Write_EEPROM(0X1400, Data, 6);  
  74.    
  75.   //读出数据部分  
  76.   Read_EEPROM(0X1400, Readbuf, 6);  
  77.   
  78.   while(1)   
  79.   {  
  80.       for(i = 0; i < 6; i++)   
  81.       {  
  82.         LED = Readbuf[i];  
  83.         while(j--);  
  84.       
  85.       }  
  86.   }  
  87.   
  88.    
  89.    
  90.    
  91.   
  92.   
  93.   for(;;) {  
  94.     __RESET_WATCHDOG(); /* feeds the dog */  
  95.   } /* loop forever */  
  96.   /* please make sure that you never leave main */  
  97. }  
  98.   
  99.   
  100. void Write_EEPROM(uint start_addr, uchar *pData, uchar length)   
  101. {  
  102.   uchar i;  
  103.   uchar *pAddr;  
  104.    
  105.   if(FSTAT_FACCERR == 1)  
  106.     FSTAT_FACCERR = 1;//通过写入1来清除错误标记  
  107.       
  108.    pAddr = (uchar *)(start_addr);//指定地址  
  109.    *pAddr = 0x01;  
  110.      
  111.      
  112.    FCMD = 0X40;//擦除命令  
  113.    FSTAT_FCBEF = 1;//启动命令  
  114.      
  115.    asm{         //等待4个bus cycle  
  116.    NOP  
  117.    NOP  
  118.    NOP  
  119.    NOP  
  120.    }  
  121.      
  122.    while(FSTAT_FCCF == 0);//等待完成  
  123.      
  124.      
  125.    for(i = 0; i < length; i++)   
  126.    {  
  127.      
  128.       if(FSTAT_FACCERR == 1)  
  129.         FSTAT_FACCERR = 1;  
  130.         
  131.       pAddr = (uchar *)(start_addr + i);  
  132.       *pAddr = pData[i];  
  133.         
  134.       FCMD = 0X20;//写入命令  
  135.       FSTAT_FCBEF = 1;// 启动命令  
  136.       asm  
  137.       {  
  138.         NOP  
  139.         NOP  
  140.         NOP  
  141.         NOP  
  142.       }  
  143.         
  144.       while(FSTAT_FCCF == 0);//等待完成  
  145.         
  146.    }  
  147.   
  148. }  
  149.   
  150.   
  151. void Read_EEPROM(uint start_addr, uchar *pReadbuf, uchar length)   
  152. {  
  153.     uchar i;  
  154.     uchar *pAddr;  
  155.       
  156.     for(i = 0; i < length; i++)   
  157.     {  
  158.       pAddr = (uchar *)(start_addr);  
  159.       pReadbuf[i] = *pAddr;  
  160.       start_addr++;  
  161.     }  
  162.   
  163. }  


您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部