//-------------------------------------------------------------------------*
// 工 程 名: IIC                                                           *
// 硬件连接: (1)MCU的IIC接口(PTC1(SDA1)和PTC0(SCL1))与时钟芯片的IIC接口    *
//              (SDA和SCL)相连                                             *
//           (2)MCU的串行口1与PC机的串行口相连                             *
//           (3)PTD.0接指示灯                                               *
// 功能说明: MCU与时钟芯片PCF8563通过IIC总线通信,MCU从PCF8563获得时间,并通 *
//           过串口发送给PC.PC方可发送时间数据调整PCF8263的时间.           *
// 目    的: 熟悉使用AW60的IIC通信功能                                     *
// 说    明: 无                                                            *
//----------------苏州大学飞思卡尔嵌入式系统研发中心2011年-----------------*
//总头文件
#include "Includes.h"

void main(void)
{
    //1 变量定义
    uint16 mRuncount = 0;//指示灯变量
    uint8 i,k;          //循环控制变量
    uint8 Sec = 0xFF;   //记录秒值                 
    //   初始写入PCF8563寄存器的值: CSR1, 2,   秒, 分钟,小时, 天,  星期,月,      
    uint8 WriteData[15] =          {0x00,0x00,0x00,0x00,0x14,0x01,0x01,0x10,
                        //          年,  分钟报警,小时报警,日期报警,周报警,
                                    0x10,0x80,    0x80,    0x80,    0x80,    
                        //          CLKOUT频率,定时器控制                     
                                    0x00,      0x00};
    uint8 ReadData[7];  //依次存放秒,分,小时,日,星期,月,年数值的BCD码
    uint8 SendBuf[17];  //存放要发送的从秒到年的ASCII码(首字节:帧头)

    //2 关总中断
    DisableInterrupt();
    //3 芯片初始化
    MCUInit();
    //4 模块初始化
    Light_Init(Light_Run_PORT,Light_Run,Light_OFF);//指示灯初始化
    SCIInit(SCI_NUM_1,SYSTEM_CLOCK,9600); //串行口初始化(波特率:9600,查询方式)
    IICInit();                            //IIC通信初始化(IIC波特率 = 227KHz)
    //初始化时钟芯片PCF8563,初始时间设置:2010.10.01 14:00 Mon
    while (IICwriteN(0xA2, 0x00, WriteData, 15));
    //5 开放各模块中断
    EnableSCIReInt();                     //开放SCI接收中断
    EnableInterrupt();                    //开放总中断
    
    //6 主循环
    while (1)
    {   
        mRuncount++;
        //1 改变指示灯状态
        if(mRuncount >= 50000)
        {
          Light_Change(Light_Run_PORT,Light_Run);   
          //2 接收到正确的一帧        
          if (g_Flag == 1)        
          {
              //处理从秒到年数据(2字节ASCII合为1字节的压缩BCD)
              for (i = 0;i < 8;i++)//最后一个字节为世纪字节
              {
                  k = (g_ReBuf[2*i+1] - '0') << 4;
                  WriteData[i] = k | (g_ReBuf[2*i+2] - '0');
              }
              //按照时间寄存器格式,进一步处理WriteData中的时间数据
              WriteData[0] &= 0b01111111;   //VL位清零
              if (WriteData[7] == 0x19)     //设置月寄存器的世纪位
                  WriteData[5] |= 0b10000000;
              else
                  WriteData[5] &= 0b01111111;                  
              while(IICwriteN(0xA2, 0x02, WriteData, 7));        
              g_Flag = 0;
          } 
          
          //3 从PCF8563读出时间的BCD码,存入ReadData
          while(IICreadN(0xA3, 0x02, ReadData, 7));
          if (Sec != (ReadData[0] & 0b01111111))
          {   //秒值发生变化就,转换数据格式并发送
              //处理ReadData中的7个时间数据
              for (i = 0;i < 7;i++)           
              {
                  switch(i)
                  {   
                      case 0://秒和分数据的最高位不用,清零
                      case 1:
                          ReadData[i] &= 0b01111111;
                          break;
                      case 2://时和天数据的高两位不用,清零
                      case 3: 
                          ReadData[i] &= 0b00111111;
                          break;
                      case 4://星期数据的高五位不用,清零 
                          ReadData[i] &= 0b00000111;
                          break;
                      case 5://月数据的6、5两位不用
                          if ((ReadData[i] & 0b10000000) == 0)
                          {
                              SendBuf[15] = '2';
                              SendBuf[16] = '0';
                          }
                          else
                          {
                              SendBuf[15] = '1';
                              SendBuf[16] = '9';
                          }
                          ReadData[i] &= 0b00011111;
                          break;
                      default:
                          break;
                  }
                  //BCD码转为ASCII码
                  SendBuf[2*i+2] = (ReadData[i] & 0b00001111) + 0x30;
                  SendBuf[2*i+1] = ((ReadData[i] & 0b11110000) >> 4) + 0x30;
              }  
              SendBuf[0] = '#';           //'#'作为帧头
              Sec =  ReadData[0];
              SCISendN(SCI_NUM_1,17,SendBuf);  
          }   
          mRuncount=0;
        }
    }
}
