找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2815|回复: 0
打印 上一主题 下一主题
收起左侧

DSP281x 读写EEPROM 24C02例程

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. /******************************************************************/
  2. /*Copyright (C), 2008-2009, 力天电子,LiTian Tech.Co.Ltd.                  */
  3. /*  Module Name   : GPIO                                                                            */
  4. /*  File Name     : main.c                                                                                     */        
  5. /*  Author             : 侯长波                                        */     
  6. /*  Version             : 2.0                                           */         
  7. /*  Function      : 读写EEPROM 24C02                                                     */                       
  8. /*  Description   :                                                                               */            
  9. /******************************************************************/

  10. /*****************头文件********************/  
  11. #include "DSP281x_Device.h"
  12. #include "System.h"

  13. /****************端口宏定义*****************/
  14. #define SCL_OUT GpioDataRegs.GPDDAT.bit.GPIOD0
  15. #define SCL_DIR GpioMuxRegs.GPDDIR.bit.GPIOD0
  16. #define SDA_DAT GpioDataRegs.GPDDAT.bit.GPIOD1
  17. #define SDA_DIR GpioMuxRegs.GPDDIR.bit.GPIOD1  

  18. /****************常量宏定义*****************/
  19. #define TRUE    1
  20. #define FALSE   0  

  21. /***************全局变量定义****************/
  22. unsigned char w_buffer[8]={23,18,18,20,32,25,28,29};
  23. unsigned char r_buffer[8]={0};

  24. /****************函数声明*******************/
  25. void Init_24C02(void);
  26. void Set_SDA_In(void);
  27. void Set_SDA_Out(void);
  28. void Start_IIC(void);
  29. void Stop_IIC(void);
  30. void Master_ACK(void);
  31. void Master_NO_ACK(void);
  32. void Write_Byte(unsigned char content);
  33. unsigned char Read_Byte(void);
  34. unsigned char EEPROM_Check(void);
  35. void EEPROM_Write_Byte(unsigned char Adr,unsigned char Data);
  36. unsigned char EEPROM_Read_Byte(unsigned char Adr);
  37. void EEPROM_Write_Page(unsigned char Adr,unsigned char length,unsigned char *Data);
  38. void EEPROM_Read_Page(unsigned char Adr,unsigned length,unsigned char *buffer);
  39. unsigned char EEPROM_Current_Addr_Read(void);
  40. void EEPROM_Sequential_Read(unsigned length,unsigned char *buffer);

  41. /*------------------------------------------*/
  42. /*形式参数:void                            */
  43. /*返回值:void                                                */
  44. /*函数描述:主函数                                        */
  45. /*------------------------------------------*/
  46. void main(void)
  47. {
  48.         unsigned char i,temp=0,w_data=17,err=0,r_data;
  49.         unsigned char * pointer;
  50.         InitSysCtrl();  // 系统初始化子程序,在DSP28_sysctrl.c中
  51.         Init_24C02();
  52.         for(i=0;i<8;i++)
  53.                 r_buffer[i]=0;
  54.         for(i=0;i<5;i++)
  55.         {
  56.                 EEPROM_Write_Byte(temp++,w_data++);
  57.         }
  58.         temp=0;
  59.         w_data=17;
  60.         for(i=0;i<5;i++)
  61.         {
  62.                 r_data=EEPROM_Read_Byte(temp++);
  63.                 if(r_data!=w_data)
  64.                         err=err+1;
  65.                 w_data++;
  66.         }
  67.         EEPROM_Write_Page(0x28,8,w_buffer);
  68.         EEPROM_Read_Page(0x28,8,r_buffer);
  69.         while(1);   
  70. }

  71. /*------------------------------------------*/
  72. /*形式参数:void                                            */
  73. /*返回值: void                                                      */
  74. /*函数描述:初始化24C02                                            */
  75. /*------------------------------------------*/
  76. void Init_24C02(void)
  77. {
  78.         EALLOW;
  79.         SCL_DIR=1;
  80.           SDA_DIR=1;
  81.         EDIS;
  82. }   

  83. /*------------------------------------------*/
  84. /*形式参数:void                            */
  85. /*返回值:void                                                */
  86. /*函数描述:设置SDA引脚输入                        */
  87. /*------------------------------------------*/  
  88. void Set_SDA_In(void)
  89. {
  90.           EALLOW;       
  91.           SDA_DIR=0;
  92.           EDIS;
  93. }

  94. /*------------------------------------------*/
  95. /*形式参数:void                            */
  96. /*返回值:void                                                */
  97. /*函数描述:设置SDA引脚输出                        */
  98. /*------------------------------------------*/
  99. void Set_SDA_Out(void)
  100. {
  101.           EALLOW;       
  102.           SDA_DIR=1;
  103.           EDIS;
  104. }

  105. /*------------------------------------------*/
  106. /*形式参数:void                            */
  107. /*返回值:void                                                */
  108. /*函数描述:完成IIC的起始条件操作            */
  109. /*------------------------------------------*/
  110. void Start_IIC(void)
  111. {
  112.         unsigned char i;
  113.           SCL_OUT=1;
  114.           SDA_DAT=1;
  115.           for(i=0;i<30;i++);
  116.         SDA_DAT=0;
  117.           for(i=0;i<30;i++);
  118.           SCL_OUT=0;
  119.           for(i=0;i<30;i++);
  120. }

  121. /*------------------------------------------*/
  122. /*形式参数:void                            */
  123. /*返回值:void                                                */
  124. /*函数描述:完成IIC的终止条件操作            */
  125. /*------------------------------------------*/  
  126. void Stop_IIC(void)
  127. {
  128.         unsigned char i;
  129.           SDA_DAT=0;
  130.           for(i=0;i<30;i++);
  131.           SCL_OUT=1;
  132.           for(i=0;i<30;i++);
  133.           SDA_DAT=1;
  134.           for(i=0;i<30;i++);          
  135. }

  136. /*------------------------------------------*/
  137. /*形式参数:void                            */
  138. /*返回值:void                                                */
  139. /*函数描述:完成IIC的主机应答操作            */
  140. /*------------------------------------------*/  
  141. void Master_ACK(void)
  142. {
  143.           unsigned char i;
  144.           SDA_DAT=0;
  145.           for(i=0;i<30;i++);
  146.           SCL_OUT=1;
  147.           for(i=0;i<30;i++);       
  148.           SCL_OUT=0;
  149.           for(i=0;i<10;i++);
  150.           SDA_DAT=1;     
  151.           for(i=0;i<30;i++);       
  152. }

  153. /*------------------------------------------*/
  154. /*形式参数:void                            */
  155. /*返回值:void                                                */
  156. /*函数描述:完成IIC的主机无应答操作          */
  157. /*------------------------------------------*/  
  158. void Master_NO_ACK(void)
  159. {
  160.           unsigned char i;
  161.           SDA_DAT=1;
  162.           for(i=0;i<30;i++);
  163.           SCL_OUT=1;
  164.           for(i=0;i<30;i++);       
  165.           SCL_OUT=0;
  166.           for(i=0;i<30;i++);
  167.           SDA_DAT=0;
  168.           for(i=0;i<30;i++);               
  169. }

  170. /*------------------------------------------*/
  171. /*形式参数:void                            */
  172. /*返回值:从机是否有应答:1--有,0--无       */
  173. /*函数描述:检查从机的应答操作                        */
  174. /*------------------------------------------*/  
  175. unsigned char EEPROM_Check(void)
  176. {
  177.           unsigned char i,Slave_ACK;
  178.           SDA_DAT=1;
  179.           for(i=0;i<30;i++);
  180.           SCL_OUT=1;
  181.           for(i=0;i<30;i++);
  182.           Set_SDA_In();
  183.           for(i=0;i<30;i++);
  184.           Slave_ACK = SDA_DAT;   //读入SDA数值
  185.           SCL_OUT=0;
  186.           for(i=0;i<30;i++);
  187.           Set_SDA_Out();       
  188.           if(Slave_ACK==0)
  189.                   return TRUE;   
  190.           else            
  191.             return FALSE;
  192. }

  193. /*------------------------------------------*/
  194. /*形式参数:content--发送的数据             */
  195. /*返回值:void                                                        */
  196. /*函数描述:向IIC总线发送一个字节的数据      */
  197. /*------------------------------------------*/  
  198. void Write_Byte(unsigned char content)
  199. {
  200.           unsigned char i,j;
  201.           for(i = 8;i > 0;i--)
  202.           {
  203.             if((content&0x80)==0x80)       
  204.             {
  205.                       SDA_DAT=1;
  206.                       for(j=0;j<30;j++);
  207.                       SCL_OUT=1;
  208.                       for(j=0;j<30;j++);
  209.                       SCL_OUT=0;                       
  210.                       for(j=0;j<30;j++);
  211.             }
  212.             else
  213.             {
  214.                       SDA_DAT=0;
  215.                       for(j=0;j<30;j++);
  216.                       SCL_OUT=1;
  217.                       for(j=0;j<30;j++);
  218.                       SCL_OUT=0;                       
  219.                       for(j=0;j<30;j++);
  220.             }
  221.                 content <<= 1;
  222.           }                  
  223.           SDA_DAT=1;
  224.           for(i=0;i<30;i++);
  225. }

  226. /*------------------------------------------*/
  227. /*形式参数:void                                            */
  228. /*返回值:读出的数据                                                    */
  229. /*函数描述:从IIC总线读一个字节的数据        */
  230. /*------------------------------------------*/
  231. unsigned char Read_Byte(void)
  232. {
  233.         unsigned char i,j,temp=0;
  234.           for(i = 0;i < 8;i++)
  235.           {
  236.                 Set_SDA_Out();
  237.                 SDA_DAT=1;
  238.                 SCL_OUT=1;
  239.                 for(j=0;j<30;j++);
  240.                 Set_SDA_In();
  241.             if(SDA_DAT==1)
  242.                       temp |= (0x01 << (7-i));
  243.             SCL_OUT=0;
  244.                 for(j=0;j<30;j++);
  245.           }
  246.         Set_SDA_Out();
  247.           return(temp);
  248. }

  249. /*------------------------------------------*/
  250. /*形式参数:Adr--地址,Data--数据           */
  251. /*返回值:void                                                            */
  252. /*函数描述:向指定地址写入一个字节的数据     */
  253. /*------------------------------------------*/
  254. void EEPROM_Write_Byte(unsigned char Adr,unsigned char Data)
  255. {
  256.         unsigned char temp=0;
  257.         unsigned int i;
  258.           Start_IIC();//启用数据总线
  259.           Write_Byte(0xA0);//发送写命令
  260.           temp=EEPROM_Check();//等待ACK
  261.           if(temp==FALSE)
  262.           {
  263.             return;
  264.           }
  265.           Write_Byte(Adr);//发送指针寄存器
  266.           temp=EEPROM_Check();//等待ACK
  267.           if(temp==FALSE)
  268.           {
  269.             return;
  270.           }
  271.           Write_Byte(Data);//发送数据
  272.           temp=EEPROM_Check();//等待ACK
  273.           if(temp==FALSE)
  274.           {
  275.             return;
  276.           }
  277.           Stop_IIC();
  278.         for(i=0;i<10000;i++);//等待写入完成
  279. }

  280. /*------------------------------------------*/
  281. /*形式参数:Adr--地址                                    */
  282. /*返回值:从指定的地址读处的数据                      */
  283. /*函数描述:从指定地址读出一个字节的数据     */
  284. /*------------------------------------------*/
  285. unsigned char EEPROM_Read_Byte(unsigned char Adr)
  286. {
  287.         unsigned char temp=0,r_data;
  288.           Start_IIC();//启用数据总线
  289.           Write_Byte(0xA0);//发送写命令
  290.           temp=EEPROM_Check();//等待ACK
  291.           if(temp==FALSE)
  292.           {
  293.             return FALSE;
  294.           }
  295.           Write_Byte(Adr);//发送指针寄存器
  296.           temp=EEPROM_Check();//等待ACK
  297.           if(temp==FALSE)
  298.           {
  299.             return FALSE;
  300.           }
  301.         Start_IIC();//启用数据总线
  302.         Write_Byte(0xA1);//发送读命令
  303.           temp=EEPROM_Check();//等ACK
  304.           if(temp==FALSE)
  305.           {
  306.             return FALSE;
  307.           }
  308.         r_data=Read_Byte();
  309.         Master_NO_ACK();
  310.           Stop_IIC();
  311.         return r_data;
  312. }   

  313. /*------------------------------------------*/
  314. /*形式参数:Adr--地址 length--长度 *Data--指向数据的指针*/
  315. /*返回值:void                                                            */
  316. /*函数描述:向指定地址写入一个字节的数据     */
  317. /*------------------------------------------*/   
  318. void EEPROM_Write_Page(unsigned char Adr,unsigned char length,unsigned char *Data)
  319. {
  320.         unsigned char temp=0;
  321.         unsigned int i,j;
  322.           Start_IIC();//启用数据总线
  323.           Write_Byte(0xA0);//发送写命令
  324.           temp=EEPROM_Check();//等待ACK
  325.           if(temp==FALSE)
  326.           {
  327.             return;
  328.           }
  329.           Write_Byte(Adr);//发送指针寄存器
  330.           temp=EEPROM_Check();//等待ACK
  331.           if(temp==FALSE)
  332.           {
  333.             return;
  334.           }
  335.         for(i=0;i<length;i++)
  336.         {
  337.                   Write_Byte(*Data);//发送数据
  338.                 Data++;
  339.                   temp=EEPROM_Check();//等待ACK       
  340.                   if(temp==FALSE)
  341.                   {
  342.                     return;
  343.                   }
  344.         }
  345.           Stop_IIC();
  346.         for(j=0;j<10000;j++);//等待写入完成
  347. }  

  348. /*------------------------------------------*/
  349. /*形式参数:Adr--地址 length--长度 buffer--数据存储区*/
  350. /*返回值:void                                                              */
  351. /*函数描述:从指定地址读出length个字节的数据 */
  352. /*------------------------------------------*/
  353. void EEPROM_Read_Page(unsigned char Adr,unsigned length,unsigned char *buffer)
  354. {
  355.         unsigned char temp=0,i;
  356.           Start_IIC();//启用数据总线
  357.           Write_Byte(0xA0);//发送写命令
  358.           temp=EEPROM_Check();//等待ACK
  359.           if(temp==FALSE)
  360.           {
  361.             return ;
  362.           }
  363.           Write_Byte(Adr);//发送指针寄存器
  364.           temp=EEPROM_Check();//等待ACK
  365.           if(temp==FALSE)
  366.           {
  367.             return ;
  368.           }
  369.         Start_IIC();//启用数据总线
  370.         Write_Byte(0xA1);//发送读命令
  371.           temp=EEPROM_Check();//等待ACK
  372.           if(temp==FALSE)
  373.           {
  374.             return ;
  375.           }
  376.         for(i=0;i<length-1;i++)
  377.         {
  378.                 *buffer=Read_Byte();
  379.                 buffer++;
  380.                 Master_ACK();
  381.         }
  382.         *buffer=Read_Byte();
  383.         Master_NO_ACK();
  384.           Stop_IIC();
  385. }
  386.    
  387. /*------------------------------------------*/
  388. ……………………

  389. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
EE.rar (1.09 MB, 下载次数: 30)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表