예제 #1
0
    void sysRead(uint8_t *dest, uint16_t addr, uint16_t count)
    {
        uint8_t oldRFIE = RFIE; 
        uint16_t PageCounter = 0;
        RFIE = 0;
        do
        {
            EES_nCS = 0;
            MacroNop();
            EESPIPut(SPI_RD_STATUS);
            PageCounter = EESPIGet();
            EES_nCS = 1;
            MacroNop();
        } 
        while(PageCounter & 0x01 );
        

        EES_nCS = 0;
        EESPIPut(SPI_READ);
        EESPIPut(0x01);     // allow system settings for second bank
	EESPIPut(addr >> 8);        
        EESPIPut(addr);

        while( count > 0 )
        {
            *dest++ = EESPIGet();
            count--;
        }
        EES_nCS = 1;

        RFIE = oldRFIE;
    }
예제 #2
0
파일: spieeprom.c 프로젝트: BeeeOn/sensors
void spieepromWrite(uint8_t *source, uint16_t addr, uint16_t count) {
    uint8_t statusReg = 0;
    uint8_t oldGIE = INTCONbits.GIE;
    INTCONbits.GIE = 0;

EEPROM_NEXT_PAGE:
    do {
        EE_nCS = 0;
        EESPIPut(SPI_RDSR);
        statusReg = EESPIGet();
        EE_nCS = 1;
        Nop();
    } while (statusReg & 0x01);

    EE_nCS = 0;
    EESPIPut(SPI_WREN);
    EE_nCS = 1;
    Nop();
    EE_nCS = 0;
#if MCHP_EEPROM < MCHP_4KBIT
    EESPIPut(SPI_WRITE);
    EESPIPut(addr);
#elif MCHP_EEPROM == MCHP_4KBIT
    if (addr > 0xFF) {
        EESPIPut(SPI_WRITE | 0x08);
    } else {
        EESPIPut(SPI_WRITE);
    }
    EESPIPut(addr);
#elif MCHP_EEPROM < MCHP_1MBIT
    EESPIPut(SPI_WRITE);
    EESPIPut(addr >> 8);
    EESPIPut(addr);
#endif
    statusReg = 0;
    while (count > 0) {
        EESPIPut(*source++);
        count--;
        statusReg++;
        if (((addr + statusReg) & (NVM_PAGE_SIZE - 1)) == 0) {
            EE_nCS = 1;
            addr += statusReg;
            goto EEPROM_NEXT_PAGE;
        }
    }
    EE_nCS = 1;
    Nop();    
    // waiting for write finish
    do {        
        EE_nCS = 0;
        EESPIPut(SPI_RDSR);
        statusReg = EESPIGet();
        EE_nCS = 1;
        Nop();
    
    } while (statusReg & 0x01);

    INTCONbits.GIE = oldGIE;
}
예제 #3
0
파일: spieeprom.c 프로젝트: BeeeOn/sensors
void spieepromRead(uint8_t *dest, uint16_t addr, uint16_t count) {
    uint8_t oldGIEH = INTCONbits.GIE;
    INTCONbits.GIE = 0;

    EE_nCS = 0;

#if MCHP_EEPROM < MCHP_4KBIT
    EESPIPut(SPI_READ);
    EESPIPut(addr);
#elif MCHP_EEPROM == MCHP_4KBIT
    if (addr > 0xFF) {
        EESPIPut(SPI_READ | 0x08);
    } else {
        EESPIPut(SPI_READ);
    }
    EESPIPut(addr);
#elif MCHP_EEPROM < MCHP_1MBIT
    EESPIPut(SPI_READ);
    EESPIPut(addr >> 8);
    EESPIPut(addr);
#endif

    while (count > 0) {
        *dest++ = EESPIGet();
        count--;
    }

    EE_nCS = 1;

    INTCONbits.GIE = oldGIEH;

}
예제 #4
0
    uint16_t sysDiff(uint8_t *dest, uint16_t addr, uint16_t count)
    {
        uint8_t oldRFIE = RFIE;                
        RFIE = 0; 
        EES_nCS = 0;
        EESPIPut(SPI_READ);
        EESPIPut(0x01);     // allow system settings for second bank
	EESPIPut(addr >> 8);        
        EESPIPut(addr);

        while( count > 0 )
        {
            if(*dest++ != EESPIGet())
            {
                EES_nCS = 1;
                RFIE = oldRFIE;
                return (count&0xFF);
            }
            count--;
        }
        EES_nCS = 1;

        RFIE = oldRFIE;
        return 0;
    }
예제 #5
0
    void sysErase()
    {
        uint32_t addr = 0;
        uint32_t count = 0x20000;
        uint16_t PageCounter = 0;
        uint8_t oldRFIE = RFIE;
        RFIE = 0;

EEPROM_NEXT_PAGE:
        do
        {
            EES_nCS = 0;
            MacroNop();
            EESPIPut(SPI_RD_STATUS);
            PageCounter = EESPIGet();
            EES_nCS = 1;
            MacroNop();
        } 
        while(PageCounter & 0x01 );

        EES_nCS = 0;
        MacroNop();
        EESPIPut(SPI_EN_WRT);
        EES_nCS = 1;
        MacroNop();
        EES_nCS = 0;
        MacroNop();

        EESPIPut(SPI_WRITE);
        EESPIPut(addr >> 16); // allow system settings for second bank
        EESPIPut(addr >> 8);
        EESPIPut(addr);
        PageCounter = 0;

        while( count > 0 )
        {
            EESPIPut(0xFF);
            count--;
            PageCounter++;
            if( ((addr + PageCounter) & (NVM_PAGE_SIZE-1)) == 0 )
            {
                EES_nCS = 1;
                addr += PageCounter;
                goto EEPROM_NEXT_PAGE;
            }
        }
        EES_nCS = 1;

        RFIE = oldRFIE;
    }
예제 #6
0
파일: NVM.c 프로젝트: agus-xyz/cNGD-soft
     /*********************************************************************
     * Function:         void NVMRead(BYTE *dest, BYTE addr, BYTE count)
     *
     * PreCondition:     SPI port has been initialized
     *
     * Input:		    dest -  pointer to the buffer to hold the read data
     *                   addr -  starting address for the read
     *                   count - total number of bytes to be read
     *
     * Output:		    none
     *
     * Side Effects:	    none
     *
     * Overview:		    This function will read count byte of data starting
     *                   from address addr, and store the read data to the
     *                   buffer starting from *dest.
     *
     * Note:			    None
     ********************************************************************/        
 	void NVMRead(BYTE *dest, WORD addr, WORD count)
     {
         #if defined(__18CXX)
             BYTE oldGIEH = INTCONbits.GIEH;
             
             INTCONbits.GIEH = 0;
         #else
             BYTE oldRFIE = RFIE;
             
             RFIE = 0;
         #endif
         
         EE_nCS = 0;
         
         #if MCHP_EEPROM < MCHP_4KBIT
             EESPIPut(SPI_READ);
             EESPIPut(addr);
         #elif MCHP_EEPROM == MCHP_4KBIT
             if( addr > 0xFF )
             {
                 EESPIPut(SPI_READ | 0x08);
             }
             else
             {
                 EESPIPut(SPI_READ);
             }
             EESPIPut(addr);
         #elif MCHP_EEPROM < MCHP_1MBIT
             EESPIPut(SPI_READ);
             EESPIPut(addr>>8);
             EESPIPut(addr);
         #endif
         
     	while( count > 0 )
         {
             *dest++ = EESPIGet();
             count--;
         }
         EE_nCS = 1;
         
         #if defined(__18CXX)
             INTCONbits.GIEH = oldGIEH;
         #else
             RFIE = oldRFIE;
         #endif
     }
예제 #7
0
    void NVMRead(uint8_t *dest, uint16_t addr, uint16_t count)
    {
        uint8_t oldRFIE = RFIE;                
        RFIE = 0; 

        EES_nCS = 0;
        EESPIPut(SPI_READ);
        EESPIPut(0x00);     // allow MIWI for first bank
	EESPIPut(addr >> 8);
        EESPIPut(addr);

        while( count > 0 )
        {
            *dest++ = EESPIGet();
            count--;
        }
        EES_nCS = 1;

        RFIE = oldRFIE;
    }
예제 #8
0
파일: NVM.c 프로젝트: agus-xyz/cNGD-soft
    	void NVMWrite(BYTE *source, WORD addr, WORD count)
        {
            BYTE PageCounter = 0;
            //BYTE i;
            #if defined(__18CXX)
                BYTE oldGIEH = INTCONbits.GIEH;   
                INTCONbits.GIEH = 0;
            #else
                BYTE oldRFIE = RFIE;
                RFIE = 0;
            #endif
           
            
EEPROM_NEXT_PAGE:
            do
            {
                EE_nCS = 0;
                EESPIPut(SPI_RD_STATUS);
                PageCounter = EESPIGet();
                EE_nCS = 1;
                MacroNop();
            } while(PageCounter & 0x01 );
    
            EE_nCS = 0;
            EESPIPut(SPI_EN_WRT);
            EE_nCS = 1;
            MacroNop();
            EE_nCS = 0;
            #if MCHP_EEPROM < MCHP_4KBIT
                EESPIPut(SPI_WRITE);
                EESPIPut(addr);
            #elif MCHP_EEPROM == MCHP_4KBIT
                if( addr > 0xFF )
                {
                    EESPIPut(SPI_WRITE | 0x08);
                }
                else
                {
                    EESPIPut(SPI_WRITE);
                }
                EESPIPut(addr);
            #elif MCHP_EEPROM < MCHP_1MBIT
                EESPIPut(SPI_WRITE);
                EESPIPut(addr>>8);
                EESPIPut(addr);
            #endif
            PageCounter = 0;
        	while( count > 0 )
            {
                EESPIPut(*source++);
                count--;
                PageCounter++;
                if( ((addr + PageCounter) & (NVM_PAGE_SIZE-1)) == 0 )
                {
                    EE_nCS = 1;
                    addr += PageCounter;
                    goto EEPROM_NEXT_PAGE;
                }
            }
            EE_nCS = 1;
            
            #if defined(__18CXX)
                INTCONbits.GIEH = oldGIEH;
            #else
                RFIE = oldRFIE;
            #endif
            
        }