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

📄 pmp_rtc_driver.c

📁 嵌入式系统下的文件管理处理,和基本图片jpg格式处理原代码
💻 C
📖 第 1 页 / 共 3 页
字号:

	// 将地址数据进行作艺的动作 
	data = Addr << 1;
	// 如果不是进行数据的写动作, 最低位进行置位的动作
	if (Flag != FLAG_WRITE_DATA ) {
		data |= 0x01;
	}

	// output one byte 
	i2c_byte_send( data );

	// return 
	return;
}


/************************************************************************/
/*	初始化 HOST interface 

  input:
  output:
  func:		diable host interface 
                                                                        */
/************************************************************************/
static void host_interface_disable( void )
{
	UINT8	data;	
	UINT32	reg_addr;

	// disable host interface 
	data = 0x00;
	reg_addr = REG_HOST_INTERFACE_ENABLE;

	WRITE8(reg_addr++, data);
	WRITE8(reg_addr++, data);
	WRITE8(reg_addr++, data);
	WRITE8(reg_addr, data);
	
	return;
}

/************************************************************************/
/*	输入一个寄存器地址和位数值,将该位置 进行置位、复位

  input:
			RegAddr		[in]	UINT32	32位的寄存器地址值
			BitOffset	[in]	UINT8	0 ~ 7
			Flag		[in]	UINT8	0 或者 非0值
  output:
			void 
  func:
                                                                        */
/************************************************************************/
static void set_register(UINT32 RegAddr, UINT8 BitOffset, UINT8 Flag)
{
	UINT8 j;
	UINT8 data;	

	// read data from register
	data = READ8( RegAddr );
	// 获得数据因子
	j = 1 << BitOffset;	

	// 如果是"0", 进行清0 的动作
	if (!Flag) {
		j = ~j;
		data &= j;
	}
	else{
		data |= j;
	}	

	// 将数据写回寄存器
	WRITE8( RegAddr, data );

	return;
}


/************************************************************************/
/* 使用I2C 接收一字节的数据
  input:	
			pdata	[out]
  output:
  func:
  note:
                                                                        */
/************************************************************************/
static void i2c_byte_receive( UINT8 *pdata )
{
	UINT8 i,data;

	data = 0x00;

	// disable SDA output
	set_register( REG_HGPIO_OUTPUT_ENABLE, I2C_SDA_BIT, 0);
	// set SDA as input
	set_register(REG_HGPIO_INPUT_ENABLE, I2C_SDA_BIT, 1);

	// input one byte from SDA
	for(i=0x00; i<0x08; i++){
		// output low level 
		scl_output_bit( LOW_LEVEL );
		i2c_delay( I2C_NORMAL_DELAY );
		
		// low 2 high
		scl_output_bit( HIGH_LEVEL );
		i2c_delay( I2C_NORMAL_DELAY );
		
		data <<= 1;	
		// read one bit 
		data |= sda_input_bit();
	}

	// scl change 2 low
	scl_output_bit( LOW_LEVEL );
	// SDA change 2 OUTPUT HIGH stat 
	sda_output_bit( HIGH_LEVEL );

	// save erceived data to input pointer
	*pdata = data;

	return ;
}

/************************************************************************/
/* 使用 I2C 发送一字节的数据
  input:
			data	[in] 将要通过 SDA 串行输出的数据
  output:
			void 
  func:
			发送8bit 数据, 数据的顺序是 MSB 先输出, LSB 后输出
			发送完 8 bit 数据后, 发送一个 CLK 等待 SLAVE 的回应信号

                                                                        */
/************************************************************************/
static void i2c_byte_send( UINT8 data)
{
	UINT8 i,j;

	j =0x80;

	// 将一字节的数据,串行输出到 SDA 上 
	for(i=0x00; i<0x08; i++)
	{
		// clk low 
		scl_output_bit( LOW_LEVEL );
		// sda output
		sda_output_bit( data&j );

		i2c_delay( I2C_NORMAL_DELAY);

		// clk high
		scl_output_bit( HIGH_LEVEL );
		i2c_delay( I2C_NORMAL_DELAY );		
		j >>= 1;
	}

	// clk low 
	scl_output_bit( LOW_LEVEL );

	// 将 SDA 设置位输入的状态
	set_register( REG_HGPIO_OUTPUT_ENABLE, I2C_SDA_BIT, 0);		// disable output 
	set_register( REG_HGPIO_INPUT_ENABLE, I2C_SDA_BIT, 1);		// enable input

	// ack clk
	i2c_delay( I2C_NORMAL_DELAY );		
	scl_output_bit( HIGH_LEVEL );

	i2c_delay( I2C_NORMAL_DELAY );		
	scl_output_bit( LOW_LEVEL );

	return;
}

/*
 *	i2c_delay
 */
static void i2c_delay( UINT8 delay )
{
	UINT16 i;
	for(i=0x00; i<delay; i++);
	return;
}

/*
 *	i2c_start
 */
static void i2c_start( void )
{


	scl_output_bit( HIGH_LEVEL );
	sda_output_bit( HIGH_LEVEL );

	i2c_delay( I2C_NORMAL_DELAY );
	
	sda_output_bit( LOW_LEVEL );

 set_register(REG_HGPIO_OUTPUT_VALUE, 4, LOW_LEVEL);
	

	i2c_delay( I2C_NORMAL_DELAY );	
	scl_output_bit(LOW_LEVEL);

	i2c_delay( I2C_NORMAL_DELAY );	
	

 set_register(REG_HGPIO_OUTPUT_VALUE, 4, HIGH_LEVEL);
	

	return;
}

/*
 *	i2c_stop
 */
static void i2c_stop( void )
{
	sda_output_bit( LOW_LEVEL );
	scl_output_bit( LOW_LEVEL );

	i2c_delay( I2C_NORMAL_DELAY );

	scl_output_bit( HIGH_LEVEL );

	i2c_delay( I2C_NORMAL_DELAY );
	
	sda_output_bit( HIGH_LEVEL );	
	
	return;
}

/*
 *	SCL output one bit
 */

static void scl_output_bit( UINT8 data )
{
	// output one bit 	
	set_register(REG_HGPIO_OUTPUT_VALUE, I2C_SCL_BIT, data);
}

/*
 *	SDA output one bit 
 */
static void sda_output_bit( UINT8 data )
{
	// set SDA as output 
	set_register(REG_HGPIO_INPUT_ENABLE, I2C_SDA_BIT, 0);
	set_register(REG_HGPIO_OUTPUT_ENABLE, I2C_SDA_BIT, 1);

	// output one bit 	
	set_register(REG_HGPIO_OUTPUT_VALUE, I2C_SDA_BIT, data);
	return;
}

/************************************************************************/
/*	从 SDA 上读取 1 bit 的数据
  input:
			void 
  output:
			0 或者 1
  func:
                                                                        */
/************************************************************************/
static UINT8 sda_input_bit( void )
{
	UINT8 data;

	// read HOST GPIO interface 
	data = READ8( REG_HGPIO_INPUT_VALUE);

	// test I2C_SDA
	if (data & (1<<I2C_SDA_BIT) ) {
		return 1;
	}

	return 0;
}

/************************************************************************/
/*	从 slave 读取数据时,对slave 进行 回应
  input:

  output:
  func:
		在SCL上输出一个时钟信号,在SDA 输出一个回应信号
                                                                        */
/************************************************************************/
static void i2c_read_ack( UINT8 AckSignal )
{
	sda_output_bit( AckSignal );
	i2c_delay(I2C_NORMAL_DELAY);
	scl_output_bit( HIGH_LEVEL );

	i2c_delay(I2C_NORMAL_DELAY);
	scl_output_bit( LOW_LEVEL );

	// 将数据线 从输出状态 转变为 输入状态
	set_register(REG_HGPIO_OUTPUT_ENABLE, I2C_SDA_BIT, 0);
	set_register(REG_HGPIO_INPUT_ENABLE, I2C_SDA_BIT, 1);

	return;
}

/************************************************************************/
/*	获取数据格式
  input:
			void
  output:
  func:	
			返回数据的格式
                                                                        */
/************************************************************************/
static UINT16 get_data_format( void )
{
	return rtc_data_format;
}

/************************************************************************/
/*	将 BCD 的数据转换为 HEX 
  input:
			pBCD	[in]	BCD数据的存放地址
			pHex	[out]	Hex数据的存放地址
			len		[in]	数据的长度
  output:
			将输入的BCD数据转换为HEX数据
  func:
		
                                                                        */
/************************************************************************/
static UINT16 bcd_2_hex(UINT8 *pBCD, UINT8 *pHex, UINT8 len)
{
	UINT8 i;
	
	for(i=0x00; i<len; i++)
	{
		pHex[i] = ((pBCD[i] & 0xf0)>>4 )*10 + (pBCD[i] & 0x0f);
	}
}

/************************************************************************/
/*	将 HEX 的数据转换为 BCD 
  input:
			pHex	[in]	Hex数据的存放地址  
			pBCD	[out]	BCD数据的存放地址
			len		[in]	数据的长度
  output:
			将输入的BCD数据转换为HEX数据
  func:
                                                                        */
/************************************************************************/
static UINT16 hex_2_bcd(UINT8 *pHex, UINT8 *pBCD, UINT8 len)
{
	UINT8 i;

	// 将Hex 数据转换为 BCD
	for(i=0x00; i<len; i++)
	{
		pBCD[i] = ((pHex[i]/10) << 0x04) | (pHex[i]%10);
	}

	return 0x00;
}




/************************************************************************/
/*		输入一个 BCD 编码值, 将该值转换为 HEX 编码
  input:
			bcd		[in]	
  output:
			转换后的HEX 值
  func:
  note:
                                                                        */
/************************************************************************/
static UINT16 ValueBCD_2_HEX( UINT16 bcd )
{
	UINT16 data;

	data = 	((bcd&0xf00) >>8)*100 + ((bcd &0xf0)>>4)*10 + (bcd&0x0f);

	return data;
}

/************************************************************************/
/*		输入一个 HEX 编码值, 将该值转换为 BCD 编码
  input:
			hex		[in]	
  output:
			BCD 的编码值
  func:
  note:
                                                                        */
/************************************************************************/
static UINT16 ValueHEX_2_BCD( UINT16 hex )
{
	UINT16 i;

	i = ( (hex%100)/10 )<<4 | (hex%10);

	if ( hex<100 ) 
	{
		return i;
	}

	i |= ((hex%1000)/100 )<<8;

	if ( hex < 1000)
	{
		return i;
	}

	i |= ((hex%10000)/1000 )<<12;

	return i;
}

/************************************************************************/
/*			
			编译中报出的没有用到的程序
                                                                        */
/************************************************************************/

#if				0x0000

/************************************************************************/
/*	获取 RTC 的时间信息
  input:
			pTimt_t		[in]	时间信息的指针
  output:
			0 成功, 非0值失败
  func:
			获取时间信息
  note:
			根据设定的数据格式,进行数据的输出
                                                                        */
/************************************************************************/
static UINT16 SPMP_RTC_GetNowH_M_S( struct RTCtime_t * pTime_t )
{
	UINT8 buf[0x10];

	// 判断输入参数是否合法
	if (NULL == pTime_t) 
	{
		ERROR_REPORT;	
		return APP_DRV_ERR;
	}

	// 读RTC 的时间信息
	read_RTC_addr(RTC_ADDR_SECOND, 0x03, buf);
	// 如果数据格式是 HEX, 需要进行数据的转换
	if (DATA_FORMAT_HEX == get_data_format() ) 
	{
		// 将输入的BCD 数据转换为 HEX
		bcd_2_hex( buf, buf, 0x03);			
	}

	// 直接进行数据的赋值
	pTime_t->Hour	= buf[2];
	pTime_t->Minute	= buf[1];
	pTime_t->Second	= buf[0];

	// 返回成功
	return APP_DRV_OK;
}

#endif

⌨️ 快捷键说明

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