📄 pmp_rtc_driver.c
字号:
// 将地址数据进行作艺的动作
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 + -