⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd2003.c

📁 sd2003芯片资料及源码
💻 C
字号:
/*******************************************************
【描述】: SD2003读写,
【作者】: zhiping.li
【修改】: zhiping.li
【时间】: 2006/03/22
【功能】: 
	I2C总线模式,
	24c04、16是另一样的格式,地址为双字节
	所有的程序都一样,上端和固定地址合在一起
	24c32~256是另外的程序,地址为双字节,和固定地址分开
【影响】: 无.
*******************************************************/

#define _DF_SD2003_

#include "head.h"
#include "sd2003.h"


/*
void ini_SD2003(void);
void write_8bit_SD2003(UCHAR ch);
UCHAR Read_8bit_SD2003();
UCHAR Read_SD2003(UINT address);
bit Readblock(UINT address,UCHAR *p,UCHAR undatalen);
bit Writeblock(UINT address,UCHAR *p,UCHAR undatalen);
bit WriteSD2003(UINT address,UCHAR ddata);
bit mend_scl(void);
bit IsBusy(void);0
*/

/*-----------------------------------------------
调用方式:void ini_SD2003()
函数说明:初始化SD2003
-----------------------------------------------*/
void ini_SD2003(void)
{
	SCL_SD2003 = 1;
	SDA_SD2003 = 1;
	Readblock_SD2003(READ_STATUS,untimes);
	_nop_();
	untimes[0] = 0x40;
	Writeblock_SD2003(READ_STATUS,untimes);
	_nop_();
	Readblock_SD2003(READ_YEAR, untimes);
	_nop_();
}


bit mend_scl_SD2003(void)
{
	UCHAR i;
	for(i = 0; i < 250; i ++)
	{
		SCL_SD2003 = 1;
		_nop_();
		_nop_();
		_nop_();
		SCL_SD2003 = 1;
		if (SDA_SD2003)
			return SDA_SD2003;
	}
	return false;
}


/*-----------------------------------------------
调用方式:void start_bit(void)
函数说明:开始位
-----------------------------------------------*/
bit start_bit_SD2003(void)
{
	SCL_SD2003=1;
	_nop_();
	SDA_SD2003=1;
	_nop_(); 
	if( SCL_SD2003 && SDA_SD2003)
	{
		SDA_SD2003=0;
		_nop_(); 
		SCL_SD2003=0;
		_nop_(); 
		return true;
	}
	else
	{
		return mend_scl_SD2003();
	}
}


/*-----------------------------------------------
调用方式:void stop_bit(void)
函数说明:停止位
-----------------------------------------------*/
void stop_bit_SD2003(void)
{
	SDA_SD2003=0;
	_nop_(); 
	SCL_SD2003=1;
	_nop_(); 
	_nop_(); 
	SDA_SD2003=1;
	_nop_(); 
}


/*-----------------------------------------------
调用方式:void mast_ack(void)
函数说明:主答函数
-----------------------------------------------*/
void mast_ack_SD2003(void)
{
	SCL_SD2003=0;
	_nop_(); 
	SDA_SD2003=0;
	_nop_();
	SCL_SD2003=1;
	_nop_();
	_nop_();
	_nop_();
	SCL_SD2003=0;
	_nop_();
	SDA_SD2003=1;
	_nop_();
}


/*-----------------------------------------------
调用方式:void ack(void)
函数说明:应答函数
-----------------------------------------------*/
void ack_SD2003(void)
{
	UCHAR i= 10;
	SDA_SD2003=1;
	SCL_SD2003=0;
	while( SDA_SD2003 && i )
	{
		i--;
	}   //This may make the CPU crash. 04-3-18 17:16
	SCL_SD2003=1;
	_nop_();  
	_nop_();
	_nop_();
	SCL_SD2003=0;
	_nop_(); 
}


/*-----------------------------------------------
调用方式:void no_ack(void)
函数说明:无需应答位,在读程序中用到
-----------------------------------------------*/
void no_ack_SD2003(void)
{
	SDA_SD2003=1;
	_nop_(); 
	SCL_SD2003=1;
	_nop_(); 
	_nop_(); 
	_nop_(); 
	//while(SDA_SD2003){;}  //This may make the CPU crash. 04-3-18 17:16
	SCL_SD2003=0;
	_nop_(); 
}


/*-----------------------------------------------
调用方式:void write_8bit_SD2003(UCHAR ch)
函数说明:写一个字节(8位)数据
-----------------------------------------------*/
void write_8bit_SD2003(UCHAR ch)
{
	UCHAR i=8;
	
	SCL_SD2003=0;
	_nop_();
	while(i--)
	{
		SDA_SD2003=(bit)(ch&0x80);
		_nop_(); 
		ch<<=1;
		SCL_SD2003=1;
		_nop_();
		_nop_();
		_nop_();
		SCL_SD2003=0;
		_nop_();
		_nop_();		
	}
}

UCHAR Read_8bit_SD2003(void)
{
	UCHAR rdata,i = 8;
	SDA_SD2003 = 1;
	SCL_SD2003 = 0;
	while(i--)
	{
		rdata<<=1;
		SCL_SD2003=1;
		_nop_(); 
		_nop_(); 
		_nop_(); 
		if(SDA_SD2003)
			rdata|=0x01;
		_nop_(); 
		SCL_SD2003=0;
		_nop_(); 
	}
	return rdata;
}

void write_8bit_SD2003_R(UCHAR ch)
{
	UCHAR i=8;
	
	SCL_SD2003=0;
	_nop_();
	while(i--)
	{
		SDA_SD2003=(bit)(ch&0x01);
		_nop_(); 
		ch>>=1;
		SCL_SD2003=1;
		_nop_();
		_nop_();
		_nop_();
		SCL_SD2003=0;
		_nop_();
		_nop_();		
	}
}

UCHAR Read_8bit_SD2003_R(void)
{
	UCHAR rdata,i = 8;
	SDA_SD2003 = 1;
	SCL_SD2003 = 0;
	while(i--)
	{
		rdata>>=1;
		SCL_SD2003=1;
		_nop_(); 
		_nop_(); 
		_nop_(); 
		if(SDA_SD2003)
			rdata|=0x80;
		_nop_(); 
		SCL_SD2003=0;
		_nop_(); 
	}
	return rdata;
}

/*-----------------------------------------------
调用方式:bit Readblock(UCHAR *p,UCHAR undatalen)
函数说明:连续读数据
-----------------------------------------------*/
bit Readblock_SD2003(UCHAR ucommand,UCHAR *p)
{
	UCHAR undatalen;
	undatalen = sd2003commandstring[ucommand];
	undatalen--;
	start_bit_SD2003();
	write_8bit_SD2003(FIRMWARE_SR| ((ucommand<<1)&0x0e));
	ack_SD2003();
	while(undatalen--)
	{
		*p = Read_8bit_SD2003_R();
		p++;
		mast_ack_SD2003();
	}
	*p = Read_8bit_SD2003_R();
	p++;
	no_ack_SD2003();
	stop_bit_SD2003();
	//EA=1;
	return true;
}


/*-----------------------------------------------
调用方式:bit Writeblock(UINT address,UCHAR *p,UCHAR undatalen)
函数说明:连续写数据
-----------------------------------------------*/
bit Writeblock_SD2003(UCHAR ucommand,UCHAR *p)
{
	UCHAR undatalen;
	undatalen = sd2003commandstring[ucommand];
	start_bit_SD2003();
	write_8bit_SD2003(FIRMWARE_SW | ((ucommand<<1)&0x0e) );
	ack_SD2003();
	_nop_();
	while(undatalen--)
	{
		write_8bit_SD2003_R(*p);
		p++;
		ack_SD2003();
	}
	stop_bit_SD2003();
	//EA=1;
	return true;
}




/*
	UCHAR i= 10;
	SDA_SD2003=1;
	SCL_SD2003=0;
	_nop_();  
	SCL_SD2003=1;
	_nop_();
	while( SDA_SD2003 && i )
	{
		i--;
	}   //This may make the CPU crash. 04-3-18 17:16
	SCL_SD2003=0;
	_nop_(); 
*/





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -