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 + -
显示快捷键?