打印
[STM32]

fm24cl16模拟接口-程序写入数据部分,为什么会丢失头字节?..

[复制链接]
1961|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanse51|  楼主 | 2013-10-30 10:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看到关于FM24CL16的驱动程序。于是自己也跟着学习
      采用不同的调用数组地址的方法,去写入fm24cl16的地址。从0开始写入。 X写**常,Y写法丢失第一个数组数据。为什么啊?  程序如下:
u8 display[4]={0x27,0x1F,0x0E,0x03};
int main(void)
{
  u8 i,ReadBuffer[5];
  USART1_Config();
  I2C_Configuration();//配置I2C IO端口

I2C_FRAM_BufferWrite(display,0,4); //调用这个X写入程序。串口打印正常,:27,1f,0e,03;
                        for(i=0;i<5;i++)     
                        {
                  while(!I2C_WriteByte(display,i,0xA0));//采用这种Y写法。串口打印:1f,0e,03.  第一个字节0x27丢失。 调试好久还是不明白为什么。
                        }
I2C_FRAM_BufferRead(ReadBuffer,0,4);              //EEPROM读数据
                          printf("\r\nthis is a %x\n",ReadBuffer[0]);
                        printf("\r\nthis is a %x\n",ReadBuffer[1]);
                                printf("\r\nthis is a %x\n",ReadBuffer[2]);
                                printf("\r\nthis is a %x\n",ReadBuffer[3]);
                while (1)
                {
                }
}
  /*SendByte:发送数据;WriteAddress:写入地址;DeviceAddress:0xA0*/用这个Y子程序写入,第一个数据0x27丢失
u8 I2C_WriteByte(u8 SendByte, u16 WriteAddress, u8 DeviceAddress)
{               
    if(!IIC_Start())
          return EEPROM_FALSE;
    IIC_Send_Byte(((WriteAddress & 0x0700) >>7) | DeviceAddress & 0xFFFE); //设置高起始地址+器件地址
    if(!IIC_Wait_Ack())
        {
          IIC_Stop();
          return EEPROM_FALSE;
        }
    IIC_Send_Byte((u8)(WriteAddress & 0x00FF));   //设置低起始地址
    IIC_Wait_Ack();        
    IIC_Send_Byte(SendByte);
  IIC_Wait_Ack();
     IIC_Stop();
    return 1;
}
/*pBuffer:数组头地址; WriteAddr:写入地址;NumByteToWrite:写入数据个数*/  用这个X子程序写入,数据输出正常
u8 I2C_FRAM_BufferWrite(u8* pBuffer, u16 WriteAddr, u16 NumByteToWrite)
{
u8 addr_h=0,addr_l=0;
          addr_h=WriteAddr/EEPROM_PAGE_SIZE;
          addr_l=WriteAddr%EEPROM_PAGE_SIZE;
          if(!IIC_Start())
                  return EEPROM_FALSE;
          IIC_Send_Byte(EEPROM_WRITE_ADDR);
          if(!IIC_Wait_Ack())
                  {
                   IIC_Stop();
                   return EEPROM_FALSE;
                  }
          IIC_Send_Byte(addr_h);
          IIC_Wait_Ack();
          IIC_Send_Byte(addr_l);
          IIC_Wait_Ack();

          while(NumByteToWrite--)
                 {
                   IIC_Send_Byte(* pBuffer);
                 IIC_Wait_Ack();
           pBuffer++;
                 }
                 IIC_Stop();
                 return TRUE;
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

88

帖子

0

粉丝