- #include "RTC_BL5372.h"
- #include "rx.h"
- #include "DataStore.h"
- #include "ddl.h"
-
-
- h_alarm_set alarm_value;
- h_rtc_init_time current_time;
- h_rtc_read_time current_read_time;
-
-
-
- void RTC_SDA_IN(void)
- {
- stc_gpio_cfg_t stcGpioCfg;
-
- Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //打开GPIO外设时钟
-
- stcGpioCfg.enDir = GpioDirIn; //端口方向配置->输入
- stcGpioCfg.enDrv = GpioDrvL; //驱动能力配置->高驱动能力
- stcGpioCfg.enPu = GpioPuEnable; //端口上下拉配置->无
- stcGpioCfg.enPd = GpioPdDisable;
- stcGpioCfg.enOD = GpioOdDisable; //开漏输出配置->开漏输出关闭
- stcGpioCfg.enCtrlMode = GpioAHB; //总线控制模式配置->AHB
-
- Gpio_Init(RTC_IIC_PORT, RTC_IIC_SDA, &stcGpioCfg);
- }
-
- void RTC_SDA_OUT(void)
- {
- stc_gpio_cfg_t stcGpioCfg;
-
- Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //打开GPIO外设时钟
-
- stcGpioCfg.enDir = GpioDirOut; //端口方向配置->输入
- stcGpioCfg.enDrv = GpioDrvL; //驱动能力配置->高驱动能力
- stcGpioCfg.enPu = GpioPuEnable; //端口上下拉配置->无
- stcGpioCfg.enPd = GpioPdDisable;
- stcGpioCfg.enOD = GpioOdDisable; //开漏输出配置->开漏输出关闭
- stcGpioCfg.enCtrlMode = GpioAHB; //总线控制模式配置->AHB
-
- Gpio_Init(RTC_IIC_PORT, RTC_IIC_SDA, &stcGpioCfg);
- }
-
- //初始化IIC
- void RTC_IIC_Init(void)
- {
- stc_gpio_cfg_t stcGpioCfg;
-
- Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //打开GPIO外设时钟
-
- stcGpioCfg.enDir = GpioDirOut; //端口方向配置->输入
- stcGpioCfg.enDrv = GpioDrvL; //驱动能力配置->高驱动能力
- stcGpioCfg.enPu = GpioPuDisable; //端口上下拉配置->无
- stcGpioCfg.enPd = GpioPdDisable;
- stcGpioCfg.enOD = GpioOdDisable; //开漏输出配置->开漏输出关闭
- stcGpioCfg.enCtrlMode = GpioAHB; //总线控制模式配置->AHB
-
- Gpio_Init(RTC_IIC_PORT, RTC_IIC_SCL, &stcGpioCfg);
- Gpio_Init(RTC_IIC_PORT, RTC_IIC_SDA, &stcGpioCfg);
-
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA);
- }
- //产生IIC起始信号
- void RTC_IIC_Start(void)
- {
- RTC_SDA_OUT(); // sda线输出
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA);
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
- Ddl_Delay1us(4);
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SDA); // START:when CLK is high,DATA change form high to low
- Ddl_Delay1us(4);
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL); //钳住I2C总线,准备发送或接收数据
- }
- //产生IIC停止信号
- void RTC_IIC_Stop(void)
- {
- RTC_SDA_OUT(); // sda线输出
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SDA); // STOP:when CLK is high DATA change form low to high
- Ddl_Delay1us(4);
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA); //发送I2C总线结束信号
- Ddl_Delay1us(4);
- }
- //等待应答信号到来
- //返回值:1,接收应答失败
- // 0,接收应答成功
- u8 RTC_IIC_Wait_Ack(void)
- {
- u8 ucErrTime = 0;
- RTC_SDA_IN(); // SDA设置为输入
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA);
- Ddl_Delay1us(2);
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
- Ddl_Delay1us(2);
- while (RTC_READ_SDA == TRUE)
- {
- ucErrTime++;
- if (ucErrTime > 250)
- {
- RTC_IIC_Stop();
- return 1;
- }
- }
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL); //时钟输出0
- return 0;
- }
- //产生ACK应答
- void RTC_IIC_Ack(void)
- {
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
- RTC_SDA_OUT();
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SDA);
- Ddl_Delay1us(2);
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
- Ddl_Delay1us(2);
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
- }
- //不产生ACK应答
- void RTC_IIC_NAck(void)
- {
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
- RTC_SDA_OUT();
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA);
- Ddl_Delay1us(2);
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
- Ddl_Delay1us(2);
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
- }
- // IIC发送一个字节
- //返回从机有无应答
- // 1,有应答
- // 0,无应答
- void RTC_IIC_Send_Byte(u8 txd)
- {
- u8 t;
- RTC_SDA_OUT();
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL); //拉低时钟开始数据传输
- for (t = 0; t < 8; t++)
- {
- // RTC_IIC_SDA=(txd&0x80)>>7;
- if ((txd & 0x80) >> 7)
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA);
- else
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SDA);
- txd <<= 1;
- // Ddl_Delay1us(2); //对TEA5767这三个延时都是必须的
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
- // Ddl_Delay1us(2);
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
- // Ddl_Delay1us(2);
- }
- }
- //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
- u8 RTC_IIC_Read_Byte(unsigned char ack)
- {
- unsigned char i, receive = 0;
- RTC_SDA_IN(); // SDA设置为输入
- for (i = 0; i < 8; i++)
- {
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
- delay10us(1);
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
- receive <<= 1;
- if (RTC_READ_SDA == TRUE)
- receive++;
- Ddl_Delay1us(1);
- }
- if (!ack)
- RTC_IIC_NAck(); //发送nACK
- else
- RTC_IIC_Ack(); //发送ACK
- return receive;
- }
-
- //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
- u8 RTC_IIC_Read_Byte_Fast_Ack(unsigned char ack)
- {
- unsigned char i, receive = 0;
- RTC_SDA_IN(); // SDA设置为输入
- for (i = 0; i < 8; i++)
- {
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
- receive <<= 1;
- if (RTC_READ_SDA == TRUE)
- receive++;
- }
- if (!ack)
- RTC_IIC_NAck(); //发送nACK
- else
- RTC_IIC_Ack(); //发送ACK
- return receive;
- }
-
- //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
- u8 RTC_IIC_Read_Byte_Fast_No_Ack()
- {
- unsigned char i, receive = 0;
- RTC_SDA_IN(); // SDA设置为输入
- for (i = 0; i < 8; i++)
- {
- Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
- Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
- receive <<= 1;
- if (RTC_READ_SDA == TRUE)
- receive++;
- }
-
- return receive;
- }
-
- //初始化IIC接口
- void RTC_Init(void)
- {
- RTC_IIC_Init();
- }
- //在AT24CXX指定地址读出一个数据
- // ReadAddr:开始读数的地址
- //返回值 :读到的数据
- u8 RTC_ReadOneByte(u16 ReadAddr)
- {
- u8 temp = 0;
- RTC_IIC_Start();
- RTC_IIC_Send_Byte(IIC_WRITE_ARR); //发送写命令
- RTC_IIC_Wait_Ack();
- RTC_IIC_Send_Byte(((ReadAddr<<4)|0)); //发送高地址
- RTC_IIC_Wait_Ack();
- RTC_IIC_Start();
- RTC_IIC_Send_Byte(IIC_READ_ARR); //进入接收模式
- RTC_IIC_Wait_Ack();
- temp = RTC_IIC_Read_Byte(0);
- // IIC_NAck();
- RTC_IIC_Stop(); //产生一个停止条件
-
- delay1ms(1);
- Wdt_Feed();
- return temp;
- }
- //在AT24CXX指定地址写入一个数据
- // WriteAddr :写入数据的目的地址
- // DataToWrite:要写入的数据
- void RTC_WriteOneByte(u16 WriteAddr, u8 DataToWrite)
- {
- RTC_IIC_Start();
- RTC_IIC_Send_Byte(IIC_WRITE_ARR); //发送写命令
- RTC_IIC_Wait_Ack();
- RTC_IIC_Send_Byte(((WriteAddr<<4)|0)); //发送高地址
- RTC_IIC_Wait_Ack();
- RTC_IIC_Send_Byte(DataToWrite); //发送字节
- RTC_IIC_Wait_Ack();
- RTC_IIC_Stop(); //产生一个停止条件
-
- delay1ms(10);
- }
-
- //在AT24CXX里面的指定地址开始写入长度为Len的数据
- //该函数用于写入16bit或者32bit的数据.
- // WriteAddr :开始写入的地址
- // DataToWrite:数据数组首地址
- // Len :要写入数据的长度2,4
- void RTC_WriteLenByte(u16 WriteAddr, unsigned char *pBuffer, u8 Len)
- {
- while(Len--)
- {
- RTC_WriteOneByte(WriteAddr,*pBuffer);
- WriteAddr++;
- pBuffer++;
- }
- }
-
- //在AT24CXX里面的指定地址开始读出长度为Len的数据
- //该函数用于读出16bit或者32bit的数据.
- // ReadAddr :开始读出的地址
- //返回值 :数据
- // Len :要读出数据的长度2,4
-
- void RTC_ReadLenByte(unsigned char ReadAddr,unsigned char *pBuffer,unsigned char NumToRead)
- {
- while(NumToRead)
- {
- *pBuffer++=RTC_ReadOneByte(ReadAddr++);
- NumToRead--;
- }
- }
- //检查AT24CXX是否正常
- //这里用了24XX的最后一个地址(255)65535来存储标志字.
- //如果用其他24C系列,这个地址要修改
- //返回1:检测失败
- //返回0:检测成功
- u8 RTC_Check(void)
- {
- u8 temp;
- temp = RTC_ReadOneByte(65535); //避免每次开机都写AT24CXX
- if (temp == 0x55)
- return 0;
- else //排除第一次初始化的情况
- {
- RTC_WriteOneByte(65535, 0x55);
- temp = RTC_ReadOneByte(65535);
- if (temp == 0x55)
- return 0;
- }
- return 1;
- }
-
- //在AT24CXX里面的指定地址开始读出指定个数的数据
- // ReadAddr :开始读出的地址 对24c02为0~255
- // pBuffer :数据数组首地址
- // NumToRead:要读出数据的个数
- void RTC_Read(u16 ReadAddr, u8 *pBuffer, u16 NumToRead)
- {
- while (NumToRead)
- {
- *pBuffer++ = RTC_ReadOneByte(ReadAddr++);
- // printf("%c\n",*pBuffer);//显示读到的字符串
- NumToRead--;
-
- Wdt_Feed();
- }
- }
- //在AT24CXX里面的指定地址开始写入指定个数的数据
- // WriteAddr :开始写入的地址 对24c02为0~255
- // pBuffer :数据数组首地址
- // NumToWrite:要写入数据的个数
- void RTC_Write(u16 WriteAddr, u8 *pBuffer, u16 NumToWrite)
- {
- while (NumToWrite--)
- {
- RTC_WriteOneByte(WriteAddr, *pBuffer);
- WriteAddr++;
- pBuffer++;
-
- Wdt_Feed();
- }
- }
-
-
- //用来设置当前的时间
- void BL5372_init(h_rtc_init_time time)
- {
- unsigned char BL5372buf[16];
- unsigned char temp;
- unsigned char index=0;
-
- ///RTC_IIC_Init
-
- BL5372buf[index++]=time.Set_Second;second
- BL5372buf[index++]=time.Set_Minute;minute
- BL5372buf[index++]=time.Set_Hour;hour
- BL5372buf[index++]=time.Set_Week;week
- BL5372buf[index++]=time.Set_Day;day
- BL5372buf[index++]=time.Set_Month;month
- BL5372buf[index++]=time.Set_Year;///year
- BL5372buf[index++]=0x00;
- BL5372buf[index++]=0x00;
- BL5372buf[index++]=0x00;
- BL5372buf[index++]=0x00;
- BL5372buf[index++]=0x00;
- BL5372buf[index++]=0x00;
- BL5372buf[index++]=0x00;
- BL5372buf[index++]=RTC_CRL_G1_USUAL;
- BL5372buf[index++]=RTC_CRL_G2_USUAL;
- do{
- RTC_WriteLenByte(0x00,BL5372buf,16);
- temp=RTC_ReadOneByte(RTC_CRL_G2_ARR);
- }while((temp&0x10)==0x10);
-
- }
-
-
- //读当前时间
- void Read_Nowtime(h_rtc_read_time *read_time)
- {
- read_time->Second=RTC_ReadOneByte(RTC_SECOND_ARR);
- read_time->Minute=RTC_ReadOneByte(RTC_MINUTE_ARR);
- read_time->Hour=RTC_ReadOneByte(RTC_HOUR_ARR);
- read_time->Week=RTC_ReadOneByte(RTC_WEEK_ARR);
- read_time->Day=RTC_ReadOneByte(RTC_DAY_ARR);
- read_time->Month=RTC_ReadOneByte(RTC_MONTH_ARR);
- read_time->Year=RTC_ReadOneByte(RTC_YEAR_ARR);
- read_time->Control_1=RTC_ReadOneByte(RTC_CRL_G1_ARR);
- read_time->Control_2=RTC_ReadOneByte(RTC_CRL_G2_ARR);
- }
-
- //自定义时间闹钟
- void RTC_SetAlarm(h_alarm_set value)
- {
- RTC_WriteOneByte(ALARM_CLOCK_MINUTE_ARR,value.Minute);
- RTC_WriteOneByte(ALARM_CLOCK_HOUR_ARR,value.Hour);
- RTC_WriteOneByte(ALARM_CLOCK_WEEK_ARR,value.Week);
- RTC_WriteOneByte(RTC_CRL_G1_ARR,RTC_CRL_G1_ALARM);
- RTC_WriteOneByte(RTC_CRL_G2_ARR,RTC_CRL_G2_ALARM);
- }
-
- //定时间隔输出
- void RTC_Fixed_interval_timer(interval_timer Mode)
- {
- RTC_WriteOneByte(RTC_CRL_G1_ARR,Mode);
- RTC_WriteOneByte(RTC_CRL_G2_ARR,RTC_CRL_G2_USUAL);
- }