📄 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 + -