fm24c256.c
来自「C8051ucos源码」· C语言 代码 · 共 116 行
C
116 行
#include "C8051F020.h"
#define FM24C256ClkDelay 10
#define FM24C256SCL P1_6
#define FM24C256SDA P1_7
//---------------------------------------------------------------------------------
//IIC总线的开始状态
void FM24C256I2CStart(void)
{
unsigned char wait;
for(wait=0;wait<FM24C256ClkDelay;wait++);
FM24C256SDA = 1;
FM24C256SCL = 1;
for(wait=0;wait<FM24C256ClkDelay;wait++);
FM24C256SDA = 0;
for(wait=0;wait<FM24C256ClkDelay;wait++);
FM24C256SCL = 0;
for(wait=0;wait<FM24C256ClkDelay;wait++);
}
//----------------------------------------------------------------------------------
//IIC总线的停止状态
void FM24C256I2CStop(void)
{
unsigned char wait;
FM24C256SCL = 0;
FM24C256SDA = 0;
for(wait=0;wait<FM24C256ClkDelay;wait++);
FM24C256SCL = 1;
for(wait=0;wait<FM24C256ClkDelay;wait++);
FM24C256SDA = 1;
}
//----------------------------------------------------------------------------------
//向从器件写出一个字节 ch,同时判断ack返回
//返回:ack的状态
unsigned char FM24C256I2CByteWr(unsigned char ch)
{
unsigned char i,wait;
for (i=0; i<8; i++)
{
if(ch&0x80) FM24C256SDA=1; else FM24C256SDA=0;
ch<<=1;
for(wait=0;wait<FM24C256ClkDelay;wait++);
FM24C256SCL = 1;
for(wait=0;wait<FM24C256ClkDelay;wait++);
FM24C256SCL = 0;
for(wait=0;wait<FM24C256ClkDelay;wait++);
}
FM24C256SDA=1;
for(wait=0;wait<FM24C256ClkDelay;wait++);
FM24C256SCL = 1;
if(FM24C256SDA)i=1;else i=0;
for(wait=0;wait<FM24C256ClkDelay;wait++);
FM24C256SCL = 0;
return i;
}
//-----------------------------------------------------------------------------------
//从从器件读入一个字节
//reack:是反给从器件的应答信号
//返回:读入的字节
unsigned char FM24C256I2CByteRd(unsigned char reack)
{
unsigned char i,val,wait;
FM24C256SDA = 1;
for (i=0; i<8; i++)
{
for(wait=0;wait<FM24C256ClkDelay;wait++);
FM24C256SCL = 1;
val<<=1;
if(FM24C256SDA) val|=1;
for(wait=0;wait<FM24C256ClkDelay;wait++);
FM24C256SCL = 0;
}
for(wait=0;wait<FM24C256ClkDelay;wait++);
if (reack)FM24C256SDA = 1;else FM24C256SDA = 0;
for(wait=0;wait<FM24C256ClkDelay;wait++);
FM24C256SCL = 1;
for(wait=0;wait<FM24C256ClkDelay;wait++);
FM24C256SCL = 0;
return val;
}
//====================================================================================
void FM24C256Write(unsigned int romadr,unsigned char *buf,unsigned int len)
{
if(len==0)return;
FM24C256I2CStart();
FM24C256I2CByteWr(0xa0);
FM24C256I2CByteWr((romadr/0x100));
FM24C256I2CByteWr((romadr%0x100));
while(len--)
{
FM24C256I2CByteWr(*buf++);
}
FM24C256I2CStop();
}
//-----------------------------------------------------------------------------------
void FM24C256Read(unsigned int romadr,unsigned char *buf,unsigned int len)
{
if(len==0)return;
FM24C256I2CStart();
FM24C256I2CByteWr(0xa0);
FM24C256I2CByteWr((romadr/0x100));
FM24C256I2CByteWr((romadr%0x100));
FM24C256I2CStart();
FM24C256I2CByteWr(0xa1);
while(len--)
{
if(len!=0)*buf++ = FM24C256I2CByteRd(0);
else *buf = FM24C256I2CByteRd(1);//读取最后一个字节后ACK的值必须是1
}
FM24C256I2CStop();
}
//-----------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?