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