看到关于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;
}
|