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

📄 dls.c

📁 AT91fr40162的FLASH读写程序
💻 C
字号:
#include "dtm_v3.h"
#include "dtm.h"
#include "externdef.h"
#include <stdio.h>

void DlsSetTime(struct StruCLOCK *sClock);						// 设置时间
void DlsReadTime(struct StruCLOCK *sClock);						// 读时钟
_BYTE HexToBcd(_BYTE cHex);
_BYTE BcdToHex(_BYTE cBcd);

/****************************************************************************
* 名称:DlsWriteByte()
* 功能:发送一字节数据
* 入口参数:
*      cData: 要发送的数据
* 出口参数:无
* 说明:发送数据时,低位先发送。
****************************************************************************/
void DlsWriteByte(_BYTE cData)
{  
	_BYTE  i;
   	for(i=0; i<8; i++) {				// 发送8位数据
      	/* 设置PIO的DATA输出值 */
      	if( (cData&0x01)!=0)
      		MY_PIO_SODR = HTSDA;
       	else
       		MY_PIO_CODR = HTSDA;
      	cData >>= 1;
      	MY_PIO_SODR = HTSCL;				// SCL = 1
      	DelayMCK4(SPI_BASE_DELAY_TIME);
      	MY_PIO_CODR = HTSCL;				// SCL = 0
      	DelayMCK4(SPI_BASE_DELAY_TIME);
   	}
}

/****************************************************************************
* 名称:DlsReadByte()
* 功能:读一字节数据
* 返回:  函数返回值为读取的数据
* 说明:先接收低位。
****************************************************************************/
_BYTE  DlsReadByte()
{  
    _BYTE  i;
    _BYTE  cData=0; 
   	MY_PIO_ODR  = HTSDA;     			//* set SDA line as an input
   	for(i=0; i<8; i++) {			// 发送8位数据
      	MY_PIO_SODR = HTSCL;			// SCL = 1
      	DelayMCK4(SPI_BASE_DELAY_TIME);
      	if((MY_PIO_PDSR & HTSDA) == HTSDA )
      		cData |= (1<<i);
		MY_PIO_CODR = HTSCL;			// SCL = 0
      	DelayMCK4(SPI_BASE_DELAY_TIME);
   	}
   	return(cData);
}

/****************************************************************************
* 名称:DlsWriteBuffer()
* 功能:写命令字和wrBuf中的时钟信息到HT1380
* 参数: 
*       cCommand: HT1380的命令字(写时钟信息的命令字)
*       cLength : 时钟信息的长度
*       cpTimeBuf:存放时钟信息的缓冲区
* 返回: 无
* 说明:
****************************************************************************/
void DlsWriteBuffer(_BYTE cCommand,_BYTE cLength,_BYTE * cpTimeBuf)
{
	_BYTE i;
	MY_PIO_PER  = (HTSDA | HTSCL | HTRST);
    MY_PIO_OER  = HTSDA;    					//* set SDA line as an output
    MY_PIO_OER  = HTSCL;     					//* set SCL line as an output
	MY_PIO_OER  = HTRST;     					//* set RST line as an output
	
	MY_PIO_CODR = HTRST;			// RST = 0
	DelayMCK4(100*SPI_BASE_DELAY_TIME);
	MY_PIO_CODR = HTSCL;			// SCL = 0
	DelayMCK4(SPI_BASE_DELAY_TIME);
	MY_PIO_SODR = HTRST;			// RST = 1
	DelayMCK4(100*SPI_BASE_DELAY_TIME);
	DlsWriteByte(cCommand);
	DelayMCK4(100*SPI_BASE_DELAY_TIME);	
	for(i=0;i<cLength;i++) {
		DlsWriteByte(*(cpTimeBuf+i));
	
	}
	DelayMCK4(SPI_BASE_DELAY_TIME);
	MY_PIO_CODR = HTRST;			// RST = 0
	DelayMCK4(SPI_BASE_DELAY_TIME);
}

/****************************************************************************
* 名称:DlsReadBuffer()
* 功能:读取HT1380中的时钟信息
* 参数: 
*       cCommand: HT1380的命令字(读时钟信息的命令字)
*       cLength : 时钟信息的长度
*       cpTimeBuf:存放时钟信息的缓冲区
* 返回: 无
* 说明:
****************************************************************************/
void DlsReadBuffer(_BYTE cCommand,_BYTE cLength,_BYTE * cpTimeBuf)
{
	_BYTE i;
	MY_PIO_PER  = (HTSDA | HTSCL | HTRST);
    MY_PIO_OER  = HTSDA;     //* set SDA line as an output
    MY_PIO_OER  = HTSCL;     //* set SCL line as an output
	MY_PIO_OER  = HTRST;     //* set RST line as an output
	
	MY_PIO_CODR = HTRST;			// RST = 0
	DelayMCK4(100*SPI_BASE_DELAY_TIME);
	MY_PIO_CODR = HTSCL;			// SCL = 0
	DelayMCK4(SPI_BASE_DELAY_TIME);
	MY_PIO_SODR = HTRST;			// RST = 1
	DelayMCK4(100*SPI_BASE_DELAY_TIME);
	DlsWriteByte(cCommand);
	DelayMCK4(100*SPI_BASE_DELAY_TIME);	
	for(i=0;i<cLength;i++) {
		*(cpTimeBuf+i)=(DlsReadByte());
	}
	DelayMCK4(SPI_BASE_DELAY_TIME);
	MY_PIO_CODR = HTRST;			// RST = 0
	DelayMCK4(SPI_BASE_DELAY_TIME);
}

//=================================================================
// 函数: DlsSetTime
// 功能: 设置时钟
// 参数: 
//       sClock: 存放时钟信息的结构类型
//=================================================================
void DlsSetTime(struct StruCLOCK *sClock)						//设置时间
{
    _BYTE cpTimeData[8];
    cpTimeData[0] = HexToBcd(sClock->cSecond);				// 秒
    cpTimeData[1] = HexToBcd(sClock->cMinter);				// 分
    cpTimeData[2] = HexToBcd(sClock->cHour);				// 小时,24小时
    cpTimeData[3] = HexToBcd(sClock->cDay);					// 日
    cpTimeData[4] = HexToBcd(sClock->cMonth);				// 月
    cpTimeData[5] = HexToBcd(sClock->cWeek);				// 周
    cpTimeData[6] = HexToBcd(sClock->cYear);				// 年
    cpTimeData[7] = 0x00;						// 开写保护
	    
	DlsWriteBuffer(0x8e,1,&cpTimeData[7]);		// 禁止写保护			
	DelayMCK4(SPI_BASE_DELAY_TIME);											// 延时
	DlsWriteBuffer(0xbe,8,cpTimeData);			//写入时间
	cpTimeData[7]=0x80;											
	DelayMCK4(SPI_BASE_DELAY_TIME);
	DlsWriteBuffer(0x8e,1,&cpTimeData[7]);		//启用写保护
}
 
//=================================================================
// 函数: DlsReadTime
// 功能: 读取时钟
// 参数: 
//       sClock: 存放时钟信息的结构类型
//=================================================================
void DlsReadTime(struct StruCLOCK *sClock)
{
    _BYTE cpTimeData[8];
	DlsReadBuffer(0xbf,8,cpTimeData);
    sClock->cSecond = BcdToHex(cpTimeData[0]);			// 秒
    sClock->cMinter = BcdToHex(cpTimeData[1]);			// 分
    sClock->cHour   = BcdToHex(cpTimeData[2]);			// 小时,24小时
    sClock->cDay    = BcdToHex(cpTimeData[3]);			// 日
    sClock->cMonth  = BcdToHex(cpTimeData[4]);			// 月
    sClock->cWeek   = BcdToHex(cpTimeData[5]);			// 周
    sClock->cYear   = BcdToHex(cpTimeData[6]);			// 年
}

_BYTE HexToBcd(_BYTE cHex)
{
	_BYTE cByteH,cByteL;
	cByteH = cHex/10;
	cByteL = cHex%10;
	return(cByteL|(cByteH<<4));
}

_BYTE BcdToHex(_BYTE cBcd)
{
	_BYTE cByteH,cByteL;
	cByteH = (cBcd&0xf0)>>4;
	cByteL = (cBcd&0x0f);
	return(cByteH*10+cByteL);
}

⌨️ 快捷键说明

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