//-------------------------------------------------------------------------*
// 工 程 名: SPI-AT45                                                      *
// 硬件连接: 将SPI-AT45-JK插孔与AW60核心板连接对应关系                     *
//           SO---PTE5                                                     *
//           SI---PTE6                                                     *
//           SCK--PTE7                                                     *
//           RST--PTA0 需要通过10M电阻手工下拉到地                         *
//           CS---PTA1 需要通过10M电阻手工下拉到地                         *
//           WP---PTA2 需要通过10M电阻手工下拉到地                         *
// 程序描述: 使用UART0和PC机通信                                           *
//         初始时发送"Test AT45"到PC机1次                                *
// 命令格式：5A 页号(00 00-07 FF) 向指定页写入256个数据00-FF               *
//          5B 页号(00 00-07 FF) 读取指定页的数据                          *
//          5C 页号(00 00-07 FF) 擦除指定页（实质是写FF)                   *
// 说    明:1.波特率为38400,使用UART0口。                                  *
//          2.使用10M电阻下拉主要是因为AT45工作电压为2.7V，而AW60工作      *
//          电压是5V，出现电平不匹配。若使用工作电压为3.3V的芯片则不会     *
//          该问题。                                                       *
//----------------苏州大学飞思卡尔嵌入式系统研发中心2011年-----------------*

#include "Includes.h" //头文件


uint8 ret;

int main(void)
{
    uint8 m,fp;
   	uint32 i,j;
    uint8 k;
    uint8 RevData[2];
    uint32 PageAddr;
    
    //1.关总中断
    DisableInterrupt();
    
    MCUInit();
    //2.UART初始化
    //使用UART0模块,使用系统时钟作为UART的时钟源
    //波特率为38400,初始化时禁止接收中断
    SCIInit(SCI_NUM_1,SYSTEM_CLOCK,38400);
    
    EFlash_Init();
    
    //3.开总中断
    EnableInterrupt();

    SCISendString(SCI_NUM_1,"Test AT45\r\n");
    //4.主循环
    while (1)
    {
        fp=1;
        while(fp) 
            fp=SCIReN(SCI_NUM_1,1,RevData);      //SCIReN函数返回1表示失败
        SCISendN(SCI_NUM_1,1,RevData); 

        if(RevData[0]==0x5A)//命令格式：5A 页号(00 00-07 FF) 向指定页写入256个数据00-FF
        {
            //等待读两个字节的页地址，复位：00 00---07 FF
            fp=1;
            while(fp) 
                fp=SCIReN(SCI_NUM_1,2,RevData);
            SCISendN(SCI_NUM_1,2,RevData); 
            
            PageAddr=RevData[0]*256 + RevData[1];

            //准备待写入的256字节的数据
            for(j=0;j<256;j++)  
                Buffer[j]=j;
            //写入数据
            if(1==EFlash_ProgramFlash(1,PageAddr,0,Buffer,256))
            {
                SCISend1(SCI_NUM_1,0x6A);
            }
            else
            {
                SCISend1(SCI_NUM_1,0x5A);       //发送应答
            }
        }
        else if(RevData[0]==0x5B)//命令格式：5B 页号(00 00-07 FF) 读取指定页的数据
        {
            //等待读两个字节的页地址，复位：00 00---07 FF
            fp=1;
            while(fp) 
                fp=SCIReN(SCI_NUM_1,2,RevData);
            SCISendN(SCI_NUM_1,2,RevData); 
            
            PageAddr=RevData[0]*256 + RevData[1];

            for(j=0;j<256;j++) 
                Buffer[j]=0x00;

            if(1==EFlash_ContinueRead(PageAddr,0,Buffer,256))
            {
                SCISend1(SCI_NUM_1,0x6B);
            }
            else
            {
                SCISend1(SCI_NUM_1,0x5B);
            }
            for(j=0;j<256;j++) 
                SCISend1(SCI_NUM_1,Buffer[j])  ; 
        }
        else if(RevData[0]==0x5C)//命令格式：5C 页号(00 00-07 FF) 擦除指定页（实质是写FF)
        {
            //等待读两个字节的页地址，复位：00 00---07 FF
            fp=1;
            while(fp) 
                fp=SCIReN(SCI_NUM_1,2,RevData);
            SCISendN(SCI_NUM_1,2,RevData); 
            
            PageAddr=RevData[0]*256 + RevData[1];

            for(j=0;j<256;j++) 
                Buffer[j]=0xFF;
            EFlash_ProgramFlash(1,PageAddr,0,Buffer,256);

            SCISend1(SCI_NUM_1,0x6C);
        }
        else if(RevData[0]==0x5D)      //读安全寄存器
        {
            EFlash_ReadSecurityReg(Buffer);        
            for(k=0;k<=63;k++)
            {
                SCISend1(SCI_NUM_1,Buffer[k]);
            } 
            SCISend1(SCI_NUM_1,0x6D);        
        }
        else if(RevData[0]==0x5E)      //写安全寄存器
        {
            for(k=0;k<=63;k++)
            {
                Buffer[k]=SecurityContent[k];
            }    
            EFlash_WriteSecurityReg(Buffer);   
            SCISend1(SCI_NUM_1,0x6E);     
        }
        else if(RevData[0]==0x5F)     //读状态寄存器
        {
            k=EFlash_StatusRegisterRead();
            SCISend1(SCI_NUM_1,k);
            SCISend1(SCI_NUM_1,0x6F);
        }    
        else if(RevData[0]==0x60)     //设置+读保护寄存器
        {
            //(2) 去保护
            EFlash_setReadprotectReg(Buffer);
            
            for(k=0;k<=7;k++)
            {
                SCISend1(SCI_NUM_1,Buffer[k]);
            }  
            SCISend1(SCI_NUM_1,0x70);
        }    
        else if(RevData[0]==0x61)      //设置256B/Page
        {
            //设置256B/Page
            EFlash_SetPage256();
            SCISend1(SCI_NUM_1,0x71);
        } 
    }
    return 0;
}
      