[MCU] 24C02使用的疑问,关于读数据时显示最后一次写的值

[复制链接]
1281|2
 楼主| niuyaliang 发表于 2014-5-5 14:54 | 显示全部楼层 |阅读模式
用的是新塘自带的库函数
  1. Write_24LC64(0x00000000,'a');
  2.         Temp = Read_24LC64(0x00000000);
  3.         printf("%c\n",Temp);
  4.         
  5.         Write_24LC64(0x00000001,'b');
  6.         Temp1 = Read_24LC64(0x00000001);
  7.         printf("%c\n",Temp1);
  8. 这样读完输出的是a,b
  1. Write_24LC64(0x00000000,'a');        
  2.         Write_24LC64(0x00000001,'b');
  3.         
  4.         Temp = Read_24LC64(0x00000000);
  5.         printf("%c\n",Temp);
  6.         Temp1 = Read_24LC64(0x00000001);
  7.         printf("%c\n",Temp1);
  8. 这样输出的是b,b
现在的问题是,连续读的时候,只显示最近一次写入的数据。。。不知道哪里出问题了
 楼主| niuyaliang 发表于 2014-5-5 14:55 | 显示全部楼层
库函数中关于24c02的读写函数
  1. void Write_24LC64(uint32_t address,uint8_t data )
  2. {
  3.         uint32_t i;
  4.         SystemCoreClock = DrvSYS_GetHCLKFreq();
  5.   //Open I2C1 and set clock = 50Kbps
  6.         DrvI2C_Open(I2C_PORT1, 50000);
  7.        
  8.            //send i2c start
  9.         DrvI2C_Ctrl(I2C_PORT1, 1, 0, 0, 0);        //set start
  10.         while (I2C1->I2CON.SI == 0);                        //poll si flag
  11.         //send writer command
  12.         I2C1->I2CDAT = 0XA0;                                        //send writer command
  13.     DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0); //clr si flag
  14.     while( I2C1->I2CON.SI == 0 );                    //poll si flag
  15.         //send address high
  16.         I2C1->I2CDAT = (address>>8)&0XFF;       
  17.         DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //clr si and set ack       
  18.         while( I2C1->I2CON.SI == 0 );                        //poll si flag
  19.         //send address low
  20.         I2C1->I2CDAT = address&0XFF;       
  21.         DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //clr si and set ack       
  22.         while( I2C1->I2CON.SI == 0 );                        //poll si flag
  23.         //send data
  24.         I2C1->I2CDAT = data;                                        //write data to
  25.         DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //clr si and set ack       
  26.         while( I2C1->I2CON.SI == 0 );                        //poll si flag
  27.            //send i2c stop
  28.         DrvI2C_Ctrl(I2C_PORT1, 0, 1, 1, 0); //send stop       
  29.         while( I2C1->I2CON.STO);
  30.         //while( I2C1->CON.SI == 0 );
  31.         for(i=0;i<60;i++);
  32.         DrvI2C_Close(I2C_PORT1);
  33.          
  34.         for(i=0;i<6000;i++);
  35.         for(i=0;i<6000;i++);
  36. }
  1. uint8_t Read_24LC64(uint32_t address)
  2. {
  3.         uint8_t TEMP;
  4.   //Open I2C1 and set clock = 50Kbps
  5.         SystemCoreClock = DrvSYS_GetHCLKFreq();
  6.         DrvI2C_Open(I2C_PORT1, 50000);
  7.         //send i2c start
  8.     DrvI2C_Ctrl(I2C_PORT1, 1, 0, 1, 0);                 //set start
  9.         while (I2C1->I2CON.SI == 0);                                //poll si flag
  10.          
  11.            //send writer command
  12.         I2C1->I2CDAT = 0XA0;
  13.     DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);           //clr si
  14.     while( I2C1->I2CON.SI == 0 );                           //poll si flag
  15.        
  16.         //send address high
  17.     I2C1->I2CDAT = (address>>8)&0XFF;       
  18.         DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);    //clr si and set ack
  19.         while( I2C1->I2CON.SI == 0 );                           //poll si flag
  20.    
  21.         //send address low
  22.         I2C1->I2CDAT = address&0XFF;       
  23.         DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);    //clr si        and set ack
  24.         while( I2C1->I2CON.SI == 0 );                           //poll si flag
  25.        
  26.         //send start flag
  27.         DrvI2C_Ctrl(I2C_PORT1, 1, 0, 1, 0);    //clr si and send start       
  28.         while( I2C1->I2CON.SI == 0 );                           //poll si flag
  29.        
  30.         //send read command
  31.         I2C1->I2CDAT = 0XA1;
  32.         DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);    //clr si
  33.     while( I2C1->I2CON.SI == 0 );                           //poll si flag

  34.         //resive data
  35.         I2C1->I2CDAT = 0XFF;
  36.         DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);    //clr si       
  37.         while( I2C1->I2CON.SI == 0 );                           //poll si flag
  38.         TEMP= I2C1->I2CDAT;
  39.         //send i2c stop
  40.         DrvI2C_Ctrl(I2C_PORT1, 0, 1, 1, 0);    //clr si and set stop
  41.         while( I2C1->I2CON.STO);
  42.         DrvI2C_Close(I2C_PORT1);

  43.         return TEMP;
  44. }
 楼主| niuyaliang 发表于 2014-5-5 15:33 | 显示全部楼层

从调试结果看,读到的是当前地址的数据,而不是写入地址的数据,读函数如上所示
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

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