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

void main(void)
{
    //1 变量定义
    uint16 RunCount = 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 关总中断
    DisableMCUint();
    //3 芯片初始化
    MCUInit();
    //4 模块初始化
    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接收中断
    EnableMCUint(); //开放总中断
    
    //6 主循环
    while (1)
    {   
        RunCount++;
        //1 改变指示灯状态
        if(RunCount >= 50000)
        {
           Light_Change(Light_Run_PORT,Light_Run);   
           RunCount=0;
        }
        //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);  
        }   
    }
}
