找回密码
 立即注册

QQ登录

只需一步,快速开始

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

IIC_EEPROM_24LC64芯片与TMS320F2812完成读写操作

[复制链接]
跳转到指定楼层
楼主
给大家分享一个IIC_EEPROM_24LC64存储芯片与TMS320F2812 dsp读写操作的源码


dsp源程序如下:
  1. /*********************************************************************
  2. **        实验目的:学习IIC接口的EEPROM数据读写                            **
  3. **        实验说明:EEPROM采用24LC64芯片,串行数据线和串行时钟线分别由DSP的 **
  4. **           PA13和PA15控制                                         **
  5. **        实验结果:按照我们下面所设置的断点运行可读出我们写入EEPROM里的值 **                                   **
  6. **********************************************************************/


  7. #include "DSP28_Device.h"
  8. #include "DSP28_Globalprototypes.h"


  9. #define          SDA1            GpioDataRegs.GPADAT.bit.GPIOA13 = 1////串行数据输出高
  10. #define          SDA0      GpioDataRegs.GPADAT.bit.GPIOA13 = 0////串行数据输出低
  11. #define          SCL1            GpioDataRegs.GPADAT.bit.GPIOA15 = 1////串行时钟输出高
  12. #define          SCL0      GpioDataRegs.GPADAT.bit.GPIOA15 = 0////串行时钟输出低

  13.      
  14. #define          SDAIN          EALLOW;GpioMuxRegs.GPADIR.bit.GPIOA13  = 0; EDIS
  15. #define          SDAOUT    EALLOW;GpioMuxRegs.GPADIR.bit.GPIOA13  = 1;EDIS

  16. #define          SDADATA          GpioDataRegs.GPADAT.bit.GPIOA13

  17. //24C64  =8K Bytes =13bit Add
  18. //页编程平均400us写一字节,随机读平均1.8ms读一字节,连续读平均600us一字节
  19. #define  uchar unsigned char         /*宏定义*/
  20. #define  uint  unsigned int


  21. void delay(unsigned int t);
  22. unsigned char ByteRead(unsigned int add,unsigned char *temp);
  23. unsigned char ByteWrite(unsigned int add,unsigned char dat);

  24. void main(void)
  25. {   
  26.     unsigned char t,s,a;

  27.         /*初始化系统*/
  28.         InitSysCtrl();

  29.         /*关中断*/
  30.         DINT;
  31.         IER = 0x0000;
  32.         IFR = 0x0000;
  33.         /*初始化PIE*/
  34.         InitPieCtrl();

  35.         /*初始化PIE中断矢量表*/
  36.         InitPieVectTable();        
  37.         

  38.    
  39.         InitGpio();
  40.     SDA1;
  41.         SCL1;

  42.     t=0;

  43.     s=ByteWrite(0,0x12);
  44.     delay(10000);
  45.     s=ByteRead(0,&t);
  46.     a=0;//设断点,看变量t的值

  47.     s=ByteWrite(1,0x34);
  48.     delay(10000);
  49.     s=ByteRead(1,&t);
  50.         a=1; //设断点

  51.         s=ByteWrite(2,0x56);
  52.         delay(10000);
  53.     s=ByteRead(2,&t);
  54.         a=2; //设断点

  55.         s=ByteWrite(3,0x78);
  56.         delay(10000);
  57.     s=ByteRead(3,&t);
  58.         a=3; //设断点


  59.         for(;;);

  60. }         

  61. void delay(unsigned int t)
  62. {
  63.   while(t>0) t--;
  64.   
  65. }



  66. //总线无效期间二线全为主高,总线有效期间时钟线为低,一个高低跳变为一个时钟
  67. //周期,时钟线为低时才能改变数据线状态,若时钟线为高时改变数据线状态,则只
  68. //能是开始或结束总线操作

  69. unsigned char ack;                         /*应答标志位*/
  70.    

  71. /*******************************************************************
  72.                      起动总线函数   
  73. 时钟线在高电平时,数据线从高向低的跳变开始总线,最终二线全变低            
  74. 函数原型: void  Start_I2c();  
  75. 功能:     启动I2C总线,即发送I2C起始条件.  
  76. ********************************************************************/
  77. void Start_I2c()
  78. {
  79.   SDA1;                   /*先跳高,为稍后的从高向低跳作准备*/
  80.   delay(60);
  81.   SCL1;
  82.   delay(500);   /*起始条件建立时间大于4.7us,延时*/
  83.   SDA0;                   /*发送起始信号*/
  84.   delay(60);    /* 起始条件锁定时间大于4μs*/
  85.   SCL0;                   /*钳住I2C总线,准备发送或接收数据 */
  86.   delay(60);
  87. }


  88. /*******************************************************************
  89.                       结束总线函数   
  90. 时钟线在低电平时,数据线从低向高的跳变结束总线,最终二线都变高            
  91. 函数原型: void  Stop_I2c();  
  92. 功能:     结束I2C总线,即发送I2C结束条件.  
  93. ********************************************************************/
  94. void Stop_I2c()
  95. {
  96.   SDA0;                  /*先跳低,为稍后的从低向高跳变作准备*/
  97.   delay(60);
  98.   SCL1;                  /*发送结束条件的时钟信号,结束条件建立时间大于4μs*/
  99.   delay(60);
  100.   SDA1;                  /*发送I2C总线结束信号*/
  101.   delay(60);
  102. }



  103. /*******************************************************************
  104.                  字节数据发送函数               
  105. 函数原型: void  SendByte(uchar c);
  106. 功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
  107.           此状态位进行操作.(不应答或非应答都使ack=0)     
  108.                发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
  109. ********************************************************************/
  110. unsigned char   SendByte(uchar c)
  111. {
  112. uchar BitCnt,t[8];
  113. for(BitCnt=0;BitCnt<8;BitCnt++)          /*要传送的数据长度为8位*/
  114.     {
  115.      if((c<<BitCnt)&0x80)
  116.         t[BitCnt]=1;                                   /*判断发送位*/
  117.      else  
  118.        t[BitCnt]=0;  
  119.         }
  120.          
  121.          SCL0;
  122.          delay(4);

  123. for(BitCnt=0;BitCnt<8;BitCnt++)          /*要传送的数据长度为8位*/
  124.     { SCL0;
  125.      if(t[BitCnt])SDA1;                           /*判断发送位*/
  126.        else  SDA0;               
  127.      delay(60);
  128.      SCL1;                               /*置时钟线为高,通知被控器开始接收数据位*/
  129.      delay(60);                     /*保证时钟高电平周期大于4μs*/
  130.       
  131.      // if((BitCnt==7) && t[BitCnt])
  132.         //        SDAIN;  //设为输入                       
  133.     }         
  134.          
  135.     SCL0;
  136.         SDAIN;  //设为输入
  137.     delay(60);           
  138.      SCL1;

  139.     if(SDADATA)ack=1;                    //没有收到应答信号
  140.        else ack=0;                        //收到应答信号


  141.         delay(60);
  142.     SCL0;
  143.     delay(60);         
  144.         SDAOUT;                                         //重新设为输出
  145.          
  146.         
  147.         return ack;
  148. }




  149. /*******************************************************************
  150.                  字节数据接收函数               
  151. 函数原型: uchar  RcvByte();
  152. 功能:            用来接收从器件传来的数据,并判断总线错误(不发应答信号),
  153.           发完后请用应答函数应答从机。  
  154. ********************************************************************/        
  155. uchar  RcvByte()
  156. {
  157.   uchar retc;
  158.   uchar BitCnt;
  159.   
  160.   retc=0;
  161.   SCL0;                               //先将时钟线拉低

  162.   SDAIN;                                     /*置数据线为输入方式*/
  163.   for(BitCnt=0;BitCnt<8;BitCnt++)
  164.       {      
  165.         SCL0;                          /*置时钟线为低,准备接收数据位*/
  166.         delay(60);                     /*时钟低电平周期大于4.7μs*/      
  167.         SCL1;                          /*置时钟线为高使数据线上数据有效*/
  168.         retc=retc<<1;
  169.         if(SDADATA)
  170.                    retc=retc+1;                  /*读数据位,接收的数据位放入retc中 */
  171.         delay(60);
  172.       }
  173.   SCL0; //从器件数据输了阶段在这一位后没有响应,数据线补外部上拉电阻临时拉为高
  174.   
  175.   delay(60);
  176.   SDAOUT;
  177.   return(retc);
  178.   
  179. }



  180. /*******************************************************************
  181.                  接口函数                                   
  182. *******************************************************************/


  183. unsigned char ByteRead(unsigned int add,unsigned char *temp)
  184. {
  185.         unsigned char rt;
  186.           rt=0;
  187.           Start_I2c();                       /*启动总线*/
  188.           if(SendByte(0xa0))                 /*发送写命令*/
  189.             rt=1;
  190.           if(SendByte(add>>8))              //发送地址
  191.             rt= 2;
  192.           if(SendByte(add))                     //发送地址
  193.             rt= 3;
  194.           Start_I2c();                       /*启动总线*/
  195.           if(SendByte(0xa1))                   //发送读命令
  196.                    rt= 4;
  197.    
  198.           *temp=RcvByte();
  199.         
  200.           Stop_I2c();                        /*结束总线*/
  201.   
  202.           return rt;
  203. }

  204. unsigned char ByteWrite(unsigned int add,unsigned char dat)
  205. {

  206.         unsigned char rt;
  207. ……………………

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

所有资料51hei提供下载:

IIC_EEPROM_24LC64芯片与TMS320F2812完成读写操作.rar (250.44 KB, 下载次数: 63)


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

使用道具 举报

沙发
ID:480811 发表于 2021-4-21 23:19 | 只看该作者
正好有个项目要用这块,谢谢了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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