微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Freescale 9S12 系列单片机应用笔记(EETS4K模块) 1

Freescale 9S12 系列单片机应用笔记(EETS4K模块) 1

时间:11-20 来源:互联网 点击:

EETS4K模块应用笔记(1)

9S12系列单片机的通常包含4KB的EEPROM。Freescale将EEPROM模块称之为EETS4K。实际上,这里所谓的EEPROM其实是FLASH,只不过Freescale特意将这里Flash的sector做的很小(4Bytes),使得用户用起来像是在用EEPROM。

EEPROM是直接映射到9S12单片机的地址空间的,如果程序中只是读取EEPROM中的内容,而不涉及到对EEPROM中数据的修改。那就不需要特殊的编程。就像读取RAM数据那样直接访问就可以了。

只有当需要在程序中更新EEPROM中内容时,才需要学习下面的内容。

初始化EETS4K

在向EETS4K写入数据或擦除数据前要先配置EETS4K的时钟。EETS4K的时钟频率必须在150KHz——200KHz之间,为此需要配置ECLKdiv寄存器。

ECLKdiv寄存器(EEPROMClockDividerRegister)

图1ECLKdiv寄存器

PRdiv8是预分频位:当PRdiv8=1时输入时钟被预分频为1/8。

Ediv5——Ediv8为分频除数寄存器,最多可以产生1/64的分频比。简单的计算可知,当输入时钟大于12.8MHz时需要将PRdiv8置位。

经过PRdiv8和Ediv两级分频最多可将时钟频率分为1/512。

擦除和写入和读取

这里不详细介绍每一个寄存器的用法。只对需要注意的地方加以说明。

EETS4K模块的最小擦除单位是4Bytes,EETS4K模块提供了两条相关命令,一条是擦除一个sector,也就是4字节,并且要求是字节对其的双字。另一条命令擦除全部EEPROM空间。

每次编程(写入)单位为两个字节。并且这两个字节要是对其字。

当EETS4K模块正在进行擦除或编程操作时是不能同时读取EEPROM中内容的。

有了这些介绍就够了。下面给出一个具体的例子。

  1. /*EETS4K.h*/
  2. #ifndefNVM_H
  3. #defineNVM_H
  4. /*
  5. *CONSTANTS
  6. */
  7. #defineNVM_NO_ERR(1)
  8. #defineNVM_ODD_ACCESS_ERR(-1)
  9. #defineNVM_ACCESS_ERR(-2)
  10. #defineNVM_PROTECTION_ERR(-3)
  11. /*
  12. *FUNCTIONPROTOTYPES
  13. */
  14. voidEEPROM_Init(unsignedlongsysclk);
  15. charEEPROM_Write_Word(unsignedintaddress,unsignedintdata);
  16. charEEPROM_Erase_Sector(unsignedintaddress);
  17. charEEPROM_Erase_All(void);
  18. unsignedintEEPROM_Read_Word(unsignedintaddress);
  19. #endif/*Endoffile*/

  1. /*EETS4K.C*/
  2. #include/*commondefinesandmacros*/
  3. #include"derivative.h"/*derivative-specificdefinitions*/
  4. #include"eets4k.h"
  5. /**@briefThisfunctioninitializestheNonVolatileEEPROMcontrolregisters
  6. *andmustbecalledbeforeattemptingtowriteoreraseanEEPROMsector.
  7. *
  8. *@parasysclktheCPUclockfrequency(SYSCLK)drivenbytheonboardoscillatororthePLLifenabled.
  9. */
  10. voidEEPROM_Init(unsignedlongsysclk)
  11. {
  12. unsignedchareclk_val;
  13. if(sysclk>=12000){/*IftheSYSCLKis>12MHz,thensetFdiv8bit*/
  14. eclk_val=(sysclk/(8*200))-1;/*Computethecorrectdividervalue*/
  15. ECLKdiv|=ECLKdiv_PRdiv8_MASK|eclk_val;/*WritetheECLKdivregisterwiththecorrectsettings*/
  16. }else{
  17. eclk_val=(sysclk/200)-1;/*Computethecorrectdividervalue*/
  18. ECLKdiv|=eclk_val;/*WritetheECLKdivregisterwiththecorrectsettings*/
  19. }
  20. ESTAT|=(ESTAT_PVIOL_MASK|ESTAT_ACCERR_MASK);/*Clearanyerrorflags*/
  21. }
  22. /**@briefThisfunctionwritesa16-bitwordtoEEPROM
  23. *@paramaddress,thedestinationEEPROMaddresstowritethedata
  24. *@paramdata,thedatatowritetoargumentaddress.
  25. *@return
  26. *NVM_NO_ERR-EEPROMWriteSuccess
  27. *NVM_ODD_ACCESS_ERR-EEPROMWriteError,Addressnotonanevenaddressboundry
  28. *NVM_ACCESS_ERR-EEPROMWriteError,AccessViolation
  29. *NVM_PROTECTION_ERR-EEPROMWriteError,Attemptedtowriteaprotectedsector
  30. */
  31. charEEPROM_Write_Word(unsignedintaddress,unsignedintdata)
  32. {
  33. while(!ESTAT_CBEIF){/*WaitforEEPROMaccesscontrollertobecomeready*/
  34. ;
  35. }
  36. ESTAT=(ESTAT_ACCERR_MASK|ESTAT_PVIOL_MASK);/*Clearexistingerrorflags*/
  37. if(address&0x0001){
  38. return(NVM_ODD_ACCESS_ERR);/*AddressisNOTalignedonanevenboundry?*/
  39. }
  40. (*(unsignedint*)address)=data;/*Writethedatatothespecifiedaddress*/
  41. ECMD=ECMD_CMDB5_MASK;/*StoreprogrammingcommandinFCMD*/
  42. ESTAT_CBEIF=1;/*Executethecommand*/
  43. if(ESTAT_ACCERR){/*Checkiftherehasbeenanaccesserror*/
  44. return(NVM_ACCESS_ERR);/*ReturnanAccessErrorcode*/
  45. }
  46. if(ESTAT_PVIOL){/*Checkiftherehasbeenaprotectionerror*/
  47. return(NVM_PROTECTION_ERR);/*ReturnaProtectionErrorcode*/
  48. }
  49. return(NVM_NO_ERR);/*ReturnNoError*/
  50. }
  51. /**@briefThisfunctionerasesa4-bytesectorof

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top