LPC21XX系列ARM7驱动RTC RX8025(I/O模拟IIC)
/******************************************************************************************
* 函数名称 :I2C_Delay
* 功能描述 :
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
void I2C_Delay(uint32 WaitTime)
{
uint32 uiTemp = WaitTime * small;
while (uiTemp--);
}
/******************************************************************************************
* 函数名称 :IO_Write
* 功能描述 :
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
void IO_Write(uint16 data, uint16 level)
{
switch(data)
{
case I2C_SDA:
{
switch(level)
{
case High:
IO0SET |= I2C_SDA;
I2C_Delay(5);
break;
case Low:
IO0CLR |= I2C_SDA;
I2C_Delay(5);
break;
}
}//end case
break;
case I2C_SCL:
{
switch(level)
{
case High:
IO0SET |= I2C_SCL;
I2C_Delay(5);
break;
case Low:
IO0CLR |= I2C_SCL;
I2C_Delay(5);
break;
}
}//end case
break;
}
}
/******************************************************************************************
* 函数名称 :I2C_Stop
* 功能描述 :
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
void I2C_Stop(void) // I2C总线操作结止位发送
{
IO_Write(I2C_SDA, Low); // SDA = Low
IO_Write(I2C_SCL, High); // SCL = High
I2C_Delay(10);
IO_Write(I2C_SDA, High); // SDA = High
I2C_Delay(5);
IO_Write(I2C_SCL, Low); // SCL = Low
I2C_Delay(5);
}
/******************************************************************************************
* 函数名称 :I2C_Start
* 功能描述 :
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
void I2C_Start(void)
{
I2C_Stop();
I2C_Delay(5);
IO_Write(I2C_SDA, High); // SDA = High
I2C_Delay(5);
IO_Write(I2C_SCL, High); // SCL = High
I2C_Delay(5);
IO_Write(I2C_SDA, Low); // SDA = Low
I2C_Delay(5);
IO_Write(I2C_SCL, Low); // SCL = Low
I2C_Delay(5);
}
/******************************************************************************************
* 函数名称 :I2C_Clock
* 功能描述 :
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
void I2C_Clock(void)
{
I2C_Delay(5); // SCL = High-> Low
IO_Write(I2C_SCL, High); // SCL = High
I2C_Delay(5);
IO_Write(I2C_SCL, Low); // SCL = Low
I2C_Delay(2);
}
/******************************************************************************************
* 函数名称 :I2C_Clock_Ask
* 功能描述 :
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
uint8 I2C_Clock_Ask(void)
{
uint8 Status;
I2C_Delay(5);
IO_Write(I2C_SCL, High); // SCL = High
I2C_Delay(5);
switch ( (IO0PIN&I2C_SDA)&I2C_SDA )
{
case (1<<14):
Status = I2CNoAck; // 返回I2CNoAck
break;
case (0x00):
Status = I2CAck; // 返回I2CAck
break;
}
IO_Write(I2C_SCL, Low); // SCL = Low
I2C_Delay(5);
return (Status);
}
/******************************************************************************************
* 函数名称 :I2C_Ack
* 功能描述 :
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
void I2C_Ack(uint8 Status)
{
switch (Status)
{
case (I2CAck):
IO_Write(I2C_SDA, Low);//SDA = Low 有应答
break;
case (I2CNoAck):
IO_Write(I2C_SDA, High);//SDA = High 无应答
break;
}
I2C_Delay(5);
IO_Write(I2C_SCL, High); //SCL = High -> Low
I2C_Delay(5);
IO_Write(I2C_SCL, Low);
I2C_Delay(5);
IO_Write(I2C_SDA, High); //SDA = High
I2C_Delay(5);
}
/******************************************************************************************
* 函数名称 :I2C_Send_8Bit
* 功能描述 :
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
uint8 I2C_Send_8Bit(uint8 Value)
{
uint8 I2C_Loop;
for (I2C_Loop = 0; I2C_Loop <8; I2C_Loop++)
{
switch ((Value << I2C_Loop) & 0x80)
{
case 0x80:
IO_Write(I2C_SDA, High);
break;
case 0x00:
IO_Write(I2C_SDA, Low);
break;
}
I2C_Clock(); // 从SCL 端口发送一个时钟信号
}
IO_Write(I2C_SDA, High); //释放SDA
I2C_Delay(10);
return (I2C_Clock_Ask()); // 返回ACK 信号
}
/******************************************************************************************
* 函数名称 :I2C_Receive_8Bit
* 功能描述 :
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
uint8 I2C_Receive_8Bit(void)
{
uint8 I2C_Loop;
uint8 Value =0x00;
IO_Write(I2C_SDA, High); //置数据线为输入方式
for (I2C_Loop = 0; I2C_Loop < 8; I2C_Loop++)
{
I2C_Delay(5);
IO_Write(I2C_SCL, Low);// SCL = Low -> High
I2C_Delay(5);
IO_Write(I2C_SCL, High);
I2C_Delay(5);
Value <<= 1;
switch( (IO0PIN&I2C_SDA)&I2C_SDA )
{
case (1<<14):
Value |= 0x01;
break;
case (0x00):
Value &= 0xFE;
break;
}
I2C_Delay(5);
}
IO_Write(I2C_SCL, Low); // SCL = Low
I2C_Delay(5);
return (Value);
}
/******************************************************************************************
* 函数名称 :RTC8025_Write_Bytes
* 功能描述 :
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
uint8 RTC8025_Write_Bytes(uint8 RTCAddr,uint8 Volue)
{
I2C_Start(); // 向RTC发送起始位
if (I2C_Send_8Bit(RTC8025_ID) == I2CNoAck) //发送硬件地址以及写信号
{
return NOTOK;
}
if (I2C_Send_8Bit((RTCAddr << 4) & 0xF0) == I2CNoAck) //发送操作寄存器地址("0")
{
return NOTOK;
}
if (I2C_Send_8Bit(Volue) == I2CNoAck) //发送硬件地址以及写信号
{
return NOTOK;
}
I2C_Stop(); // 向RTC 发送停止位
return (OK);
}
/******************************************************************************************
* 函数名称 :modify_rx8025time
* 功能描述 :对时钟进行校时
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
uint8 Modify_rx8025time(RTC_STRUCT *modify_time)
{
uint8 h;
h = RTC8025_Write_Bytes(RTC8025_Second, modify_time->second); //修改" 秒"
if (h != OK)
return NOTOK;
h = RTC8025_Write_Bytes(RTC8025_Minute, modify_time->minute); //修改" 分钟"
if (h != OK)
return NOTOK;
h = RTC8025_Write_Bytes(RTC8025_Hour, modify_time->hour) ; //修改" 小时"
if (h != OK)
return NOTOK;
h = RTC8025_Write_Bytes(RTC8025_Day, modify_time->day); //修改" 日期"
if (h != OK)
return NOTOK;
h = RTC8025_Write_Bytes(RTC8025_Month, modify_time->month); //修改" 月份"
if (h != OK)
return NOTOK;
h = RTC8025_Write_Bytes(RTC8025_Year, modify_time->year); //修改" 年份"
if (h != OK)
return NOTOK;
return (OK);
}
/******************************************************************************************
* 函数名称 :Get_Time
* 功能描述 :读取时间
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
uint8 Get_Time(RTC_STRUCT *time_data)
{
uint8 ucLoop;
uint8 week;
uint8 pon;
for (ucLoop = 0x01; ucLoop > 0x00; ucLoop--)
{
//Dummy_RTC.Date.Century = 0x00;
I2C_Start(); // 向RTC发送起始位
if (I2C_Send_8Bit(RTC8025_ID) == I2CNoAck) //发送硬件地址以及写信号
{
continue;
}
if (I2C_Send_8Bit((uint8)(RTC8025_Simple_Read | (RTC8025_Control2 << 4))) //发送操作寄存器地址和读取模式
== I2CNoAck)
{
continue;
}
pon = (I2C_Receive_8Bit() & RTC8025_PON) >> 4; // 读寄存器2中电源
I2C_Ack(I2CAck);
time_data->second = I2C_Receive_8Bit(); // 读" 秒"
I2C_Ack(I2CAck);
time_data->minute = I2C_Receive_8Bit(); // 读" 分钟"
I2C_Ack(I2CAck);
time_data->hour = I2C_Receive_8Bit(); // 读" 小时"
I2C_Ack(I2CAck);
week = I2C_Receive_8Bit(); // 读" 星期"
I2C_Ack(I2CAck);
time_data->day = I2C_Receive_8Bit(); // 读" 日期"
I2C_Ack(I2CAck);
time_data->month = I2C_Receive_8Bit(); // 读" 月份"
I2C_Ack(I2CAck);
time_data->year = I2C_Receive_8Bit(); // 读" 年份"
I2C_Ack(I2CNoAck);
time_data->century = 0x20; //世纪定死为0x20
I2C_Stop(); // 向RTC 发送停止位
}
return OK;
}
/******************************************************************************************
* 函数名称 :Rx8025_init
* 功能描述 :Rx8025初始化
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
void Rx8025_init(void)
{
uint8 ucTemp;
IO0DIR |= I2C_SDA | I2C_SCL;
IO0CLR = I2C_SCL;
I2C_Delay(1);
I2C_Stop();
ucTemp = 0x20|0x02;
RTC8025_Write_Bytes(RTC8025_Control1, ucTemp); // 24小时模式设置,1Hz 频率输出
ucTemp = 0x20;
RTC8025_Write_Bytes(RTC8025_Control2, ucTemp); // 2.1V电压检测模式及电压有效标志(PON)
}