FaxRxBuf2Flash.c
上传用户:xhjmsc
上传日期:2019-09-13
资源大小:389k
文件大小:9k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. //**************************************************************************
  2. #include "includeH.h"
  3. void  FaxRxBufRawdata2Flash(void)
  4. {     
  5.       unsigned char 
  6.                     ucRxIndex=0,ucGeneralCnt=0,ucFlashSttsOverflowCnt=0,
  7.                     ucBlockCnt=0;
  8.       unsigned int  wPageCount=0,wRxBufPageRearAddress=0,
  9.                     wNextPageAddress=0,wPageAddress=cstFaxRxBufStartPage,
  10.                     wEveryFaxHead=0;//wFaxPropertyNo=0;
  11.  
  12.       wRxBufPageRearAddress=gwPageAddress;//1226;//gwPageAddress;
  13.       ViewCommunicationRX();//read fax time
  14.       for(ucGeneralCnt=0;ucGeneralCnt<255;ucGeneralCnt++)
  15.        { 
  16.             aucUartRxBuf[ucGeneralCnt]=0;    //clear RX buffer
  17.        }  
  18.   
  19.   gdwRxQueueFrontCnt += 2048;//whole packet length
  20.        //Fax packet head ba 23 ba 23
  21.                   ucRxIndex=0; //write Fax Property
  22.   aucUartRxBuf[ucRxIndex++] = 0xba;
  23.   aucUartRxBuf[ucRxIndex++] = 0x23;
  24.   aucUartRxBuf[ucRxIndex++] = 0xba;
  25.   aucUartRxBuf[ucRxIndex++] = 0x23;
  26.       for(ucGeneralCnt=0;ucGeneralCnt<8;ucGeneralCnt++)//interval flag 8 0x55
  27.       {
  28.          aucUartRxBuf[ucRxIndex++] = 0x55;
  29.       }
  30.       //fax Length 4 bytes
  31.       aucUartRxBuf[ucRxIndex++] = (gdwRxQueueFrontCnt & 0xff);
  32.       aucUartRxBuf[ucRxIndex++] = (gdwRxQueueFrontCnt >> 8) & 0xff;
  33.       aucUartRxBuf[ucRxIndex++] = (gdwRxQueueFrontCnt>>16) & 0xff;
  34.       aucUartRxBuf[ucRxIndex++] = (gdwRxQueueFrontCnt>>24) & 0xff;
  35.       for(ucGeneralCnt=0;ucGeneralCnt<8;ucGeneralCnt++)
  36.       {
  37.          aucUartRxBuf[ucRxIndex++] = 0x55;
  38.       }
  39.       //fax time 6 bytes
  40.       aucUartRxBuf[ucRxIndex++] = aucViewData[cstViewSecondIndex];// //second
  41.       aucUartRxBuf[ucRxIndex++] = aucViewData[cstViewMinuteIndex];//  //minute
  42.       aucUartRxBuf[ucRxIndex++] = aucViewData[cstViewHourIndex];//hour
  43.       aucUartRxBuf[ucRxIndex++] = aucViewData[cstViewDateIndex];//date
  44.       aucUartRxBuf[ucRxIndex++] = aucViewData[cstViewMonthIndex];//month
  45.       aucUartRxBuf[ucRxIndex++] = aucViewData[cstViewYearIndex];//Year
  46.       //fax Head and Rear Address
  47.       //aucUartRxBuf[ucRxIndex++] = wEveryFaxHead & 0xff;
  48.       //aucUartRxBuf[ucRxIndex++] = (wEveryFaxHead>>8) & 0xff;
  49.       //aucUartRxBuf[ucRxIndex++] = gwPageAddress & 0xff;
  50.       //aucUartRxBuf[ucRxIndex++] = (gwPageAddress>>8) & 0xff;
  51.       for(ucGeneralCnt=0;ucGeneralCnt<8;ucGeneralCnt++)
  52.       {
  53.          aucUartRxBuf[ucRxIndex++] = 0x55;
  54.       }
  55.       
  56.       //fax Telephone Number TSI 25 bytes
  57.       for (ucGeneralCnt=0; ucGeneralCnt<25; ucGeneralCnt++)
  58.       {
  59.          aucUartRxBuf[ucRxIndex++] = FRHTSI[ucGeneralCnt];
  60.       }
  61.       for(ucGeneralCnt=0;ucGeneralCnt<8;ucGeneralCnt++)
  62.       {
  63.          aucUartRxBuf[ucRxIndex++] = 0x55;
  64.       }
  65.       
  66.       //wPageAddress = cstFaxRxBufFirstPage;
  67.       ZERO_ADDRESS();
  68.       ROW_ADDRESS_LOW = wPageAddress & 0XFF;
  69.       ROW_ADDRESS_HIGH = (wPageAddress>>8) & 0XFF;
  70.       PROGRAM_256_BYTE();                         
  71.   //find the rear pointer in the Fax Rear Area
  72.   //wRxBufPageRearAddress=gwPageAddress;//1226;//gwPageAddress;
  73.       ReadLastFaxRearPointer();//return gwPageAddress
  74.       //ReadLast16BytesFromFlashMemoryArea(cstFaxRearPointerTableStartBlockNum, cstFaxRearPointerTableOverBlockNum);//return gwPageAddress
  75.       gwPageAddress++;
  76.              //check the gwPageAddress whether it is a page in bad block 
  77.              do{
  78.              wNextPageAddress=gwPageAddress+64;
  79.              gwPageAddress=CalNextPageAddress(gwPageAddress);
  80.              }while(wNextPageAddress==gwPageAddress);
  81.            //erase next block
  82.            if (gwPageAddress%64==0)
  83.                {
  84.                   ROW_ADDRESS_LOW=gwPageAddress & 0XFF;
  85.                   ROW_ADDRESS_HIGH=(gwPageAddress>>8) & 0XFF; 
  86.                   ERASE_ONE_BLOCK();
  87.                }
  88.       wEveryFaxHead=gwPageAddress;//Record the Every Fax head for the Every fax table
  89.               
  90.         for (wPageCount=cstFaxRxBufStartPage;wPageCount<=wRxBufPageRearAddress;wPageCount++)//Block 19-39
  91.         {
  92.     COMMAND_VAL=0x00; //#0X00 //00H READ1 0-2112BYTE
  93. COMMAND_LATCH_INTO();
  94. //ADDRESS
  95. ADDRESS_VALUE=0;//COLUMN_ADDRESS_LOW; //#0X00
  96. ADDRESS_LATCH_INTO();
  97. ADDRESS_VALUE=0;//COLUMN_ADDRESS_HIGH; //#0X00
  98. ADDRESS_LATCH_INTO();
  99. ADDRESS_VALUE= wPageCount & 0xff ; //#0X00
  100. ADDRESS_LATCH_INTO();
  101. ADDRESS_VALUE= (wPageCount>>8) & 0xff; //#0X00
  102. ADDRESS_LATCH_INTO();
  103. FLASH_CON_PORT_OUT &=~ ALE;
  104. COMMAND_VAL=0X35;
  105. COMMAND_LATCH_INTO();
  106. //ATcmdDelay();
  107. while((FLASH_CON_PORT_IN & RB)==0);
  108.   
  109.   COMMAND_VAL=0x85;
  110. COMMAND_LATCH_INTO();
  111. //ADDRESS
  112. ADDRESS_VALUE=0;//COLUMN_ADDRESS_LOW; //#0X00
  113. ADDRESS_LATCH_INTO();
  114. ADDRESS_VALUE=0;//COLUMN_ADDRESS_HIGH; //#0X00
  115. ADDRESS_LATCH_INTO();
  116. ADDRESS_VALUE= gwPageAddress & 0xff; //#0X00
  117. ADDRESS_LATCH_INTO();
  118. ADDRESS_VALUE=(gwPageAddress>>8) & 0xff; //#0X00
  119. ADDRESS_LATCH_INTO();
  120. FLASH_CON_PORT_OUT &=~ ALE;
  121. COMMAND_VAL=cFlashWriteInitiateCmd; //10H INITIATES PROGRAM
  122. COMMAND_LATCH_INTO();
  123. READ_STATUS();
  124. ucFlashSttsOverflowCnt=0;
  125. if(FLASH_STATUS==1&&(ucFlashSttsOverflowCnt++)<2)
  126. {
  127. ;
  128. }
  129.                 gwPageAddress++;
  130.                 if (gwPageAddress==0) gwPageAddress+=cstFaxContentStartPage;
  131.              do{
  132.              wNextPageAddress=gwPageAddress+64;
  133.              gwPageAddress=CalNextPageAddress(gwPageAddress);
  134.              }while(wNextPageAddress==gwPageAddress);
  135.            if (gwPageAddress%64==0)
  136.                {
  137.                   ROW_ADDRESS_LOW=gwPageAddress & 0XFF;
  138.                   ROW_ADDRESS_HIGH=(gwPageAddress>>8) & 0XFF; 
  139.                   ERASE_ONE_BLOCK();
  140.                }
  141.         //if ((aucUartRxBuf[ucRxIndex] == 0xfb && aucUartRxBuf[ucRxIndex-1] == 0x13 
  142.      //&& aucUartRxBuf[ucRxIndex-2] == 0xff))// || (wRxQueueFrontCnt>gwRxQueueFrontCnt))
  143.         //break;
  144.         }//write 1344 pages over        
  145.               
  146.       /*******************************************      
  147. Write New Fax Rear Pointer
  148.       if (FaxRearPointerTableFull)
  149.        {erase next block in fax rear pointer table}
  150.       else
  151.        write one Fax content
  152. *******************************************/
  153.       if ((gwGeneralPageAddress>>6) > cstFaxRearPointerTableOverBlockNum)
  154.        {
  155.          for (ucBlockCnt=0;ucBlockCnt<4;ucBlockCnt++)
  156.          {
  157.                  wPageAddress=(cstFaxRearPointerTableStartBlockNum+ucBlockCnt)<<6;
  158.           ROW_ADDRESS_LOW=wPageAddress & 0XFF;
  159.           ROW_ADDRESS_HIGH=(wPageAddress>>8) & 0XFF; 
  160.           ERASE_ONE_BLOCK();
  161.          }
  162.          gwGeneralPageAddress=cstFaxRearPointerTableStartPage;
  163.          gwColumnAddress=0;
  164.          
  165.        }
  166.       ucRxIndex=0; //write Fax Rear Pointer
  167.       gwPageAddress--; // get Rear Pointer
  168.       aucUartRxBuf[ucRxIndex++]=gwPageAddress & 0xff;
  169.       aucUartRxBuf[ucRxIndex++]=(gwPageAddress>>8) & 0xff;
  170.       for(ucGeneralCnt=0;ucGeneralCnt<14;ucGeneralCnt++)
  171.       {
  172.          aucUartRxBuf[ucRxIndex++] = 0x55;
  173.       }
  174.         
  175.       //WriteFaxRearPointerTable();
  176.       Write16Bytes2FlashMemoryArea();
  177. /*******************************************      
  178. Write Fax Property Table
  179.       if (Fax Property Table Full)
  180.        {erase next block in Fax Property Table}
  181.       else
  182.        write one Fax Property
  183. *******************************************/
  184.       ReadLastFaxProperty();
  185.       //ReadLast16BytesFromFlashMemoryArea(cstFaxPropertyTableStartBlockNum, cstFaxPropertyTableOverBlockNum);
  186.       if ((gwGeneralPageAddress>>6) > cstFaxPropertyTableOverBlockNum)//>=cstFaxPropertyTableOverBlockNum)
  187.        {
  188.        for (ucBlockCnt=0;ucBlockCnt<10;ucBlockCnt++)
  189.          {
  190.            wPageAddress=(cstFaxPropertyTableStartBlockNum+ucBlockCnt)<<6;
  191.           ROW_ADDRESS_LOW=wPageAddress & 0XFF;
  192.           ROW_ADDRESS_HIGH=(wPageAddress>>8) & 0XFF; 
  193.           ERASE_ONE_BLOCK();
  194.          }
  195.          gwGeneralPageAddress=cstFaxPropertyTableStartPage;
  196.          gwColumnAddress=0;
  197.        }
  198.       
  199.       ucRxIndex=0; //write Fax Property
  200.       aucUartRxBuf[ucRxIndex++] = aucViewData[cstViewSecondIndex];// //second
  201.       aucUartRxBuf[ucRxIndex++] = aucViewData[cstViewMinuteIndex];//  //minute
  202.       aucUartRxBuf[ucRxIndex++] = aucViewData[cstViewHourIndex];//hour
  203.       aucUartRxBuf[ucRxIndex++] = aucViewData[cstViewDateIndex];//date
  204.       aucUartRxBuf[ucRxIndex++] = aucViewData[cstViewMonthIndex];//month
  205.       aucUartRxBuf[ucRxIndex++] = aucViewData[cstViewYearIndex];//Year
  206.       aucUartRxBuf[ucRxIndex++] = wEveryFaxHead & 0xff;
  207.       aucUartRxBuf[ucRxIndex++] = (wEveryFaxHead>>8) & 0xff;
  208.       aucUartRxBuf[ucRxIndex++] = gwPageAddress & 0xff;
  209.       aucUartRxBuf[ucRxIndex++] = (gwPageAddress>>8) & 0xff;
  210.       aucUartRxBuf[ucRxIndex++] = (gdwRxQueueFrontCnt & 0xff);
  211.       aucUartRxBuf[ucRxIndex++] = (gdwRxQueueFrontCnt >> 8) & 0xff;
  212.       aucUartRxBuf[ucRxIndex++] = (gdwRxQueueFrontCnt>>16) & 0xff;
  213.       aucUartRxBuf[ucRxIndex++] = (gdwRxQueueFrontCnt>>24) & 0xff;
  214.       aucUartRxBuf[ucRxIndex++]=0x55;
  215.       aucUartRxBuf[ucRxIndex++]=0x55;                              //15
  216.       //WriteFaxPropertyTable();
  217.       Write16Bytes2FlashMemoryArea();             
  218. }//FaxRXProcess