Beispiel #1
0
// function to configure SPI module for STANDARD MASTER mode
void ConfigureMasterSPI(){

    // clear SPIEN
    SPI1STATbits.SPIEN=0;

    // if using interrupts
    IFS0bits.SPI1IF = 0;        // clear the interrupt flag
    IEC0bits.SPI1IE = 0;        // enable interrupt
//    IPC2bits.SPI1IP = 111;      // set the interrupt priority

    // write the desired settings to SPI1CON1 and SPI1CON2 (MSTEN = 1 for master)
    SPI1CON1bits.DISSCK = 0;    // disable SCK1 pin bit (SPI Master modes only)[enabled]
    SPI1CON1bits.DISSDO = 0;    // disables SDO1 pin bit[controlled by module]
    SPI1CON1bits.MODE16 = 0;    // word/byte communication select bit[byte wide]
    SPI1CON1bits.SMP = 0;       // SPI1 data input sample phase bit[middle]
    SPI1CON1bits.CKE = 0;       // SPI1 clock edge select bit
    SPI1CON1bits.SSEN = 1;      // slave select enable bit (slave mode)
    SPI1CON1bits.CKP = 0;       // clock polarity set bit[idle high]

    InitSPIMaster();
    SPI1CON1bits.MSTEN = 1;     // master mode enable bit
    SPI1CON1bits.SPRE = 0b000;    // secondary prescale bits (master mode)[8:1]
    SPI1CON1bits.PPRE = 0b00;     // primary prescale bits (master mode)[64:1]

    SPI1CON2bits.FRMEN = 0;     // frame SPI1 support bit[disabled]
    SPI1CON2bits.SPIFSD = 0;    // frame sync pulse direction control on SS1 pin bit
    SPI1CON2bits.SPIFPOL = 0;   // frame sync pulse polarity bit (frame mode only)
    SPI1CON2bits.SPIFE = 0;     // frame sync pulse edge select bit
    SPI1CON2bits.SPIBEN = 0;    // enhanced buffer enable bit

    // clear the SPIROV bit
    SPI1STATbits.SPIROV = 0;    // recieve overflow flag bit

    // enable SPI operation by setting the SPIEN bit
    SPI1STATbits.SPIEN = 1;     // SPI1 enable bit

    // write the data to be transmitted to the SPI1BUF register.
    // transmission (and reception) will start as soon as data is written to the SPI1BUF register.
}
//Read a register from the memory
static int _F9_Handler (void)
{
	uint8_t RegToRead 		= argAsInt(1);
	uint8_t BufferNumber 	= argAsInt(2);
	uint16_t Addr 			= argAsInt(3);
	uint8_t DataBuffer[10];
	
	if(RegToRead == 1)
	{
		AT45DB321D_Select();
	}
	else if(RegToRead == 0)
	{
		AT45DB321D_Deselect();
	}
	else if(RegToRead == 2)	//Read status
	{
		//SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | SPI_SAMPLE_TRAILING | SPI_MODE_MASTER);		
		InitSPIMaster(0,0);		//Mode 0,0 is good
		printf_P(PSTR("Stat: 0x%02X\n"), AT45DB321D_ReadStatus());
	}
	else if(RegToRead == 3)	//Read IDs
	{
		//SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | SPI_SAMPLE_TRAILING | SPI_MODE_MASTER);		
		InitSPIMaster(0,0);		//Mode 0,0 is good
		AT45DB321D_Select();
		SPISendByte(AT45DB321D_CMD_READ_DEVICE_ID);
		printf_P(PSTR("ID[1]: 0x%02X\n"), SPISendByte(0x00));
		printf_P(PSTR("ID[2]: 0x%02X\n"), SPISendByte(0x00));
		printf_P(PSTR("ID[3]: 0x%02X\n"), SPISendByte(0x00));
		printf_P(PSTR("ID[4]: 0x%02X\n"), SPISendByte(0x00));
		AT45DB321D_Deselect();
	}
	else if(RegToRead == 4)	//Read bytes from buffer
	{
		printf_P(PSTR("Reading 5 bytes from buffer %u at address 0x%04X\n"), BufferNumber, Addr);
		AT45DB321D_BufferRead(BufferNumber, Addr, DataBuffer, 5);
		printf_P(PSTR("0: 0x%02X\n"), DataBuffer[0]);
		printf_P(PSTR("1: 0x%02X\n"), DataBuffer[1]);
		printf_P(PSTR("2: 0x%02X\n"), DataBuffer[2]);
		printf_P(PSTR("3: 0x%02X\n"), DataBuffer[3]);
		printf_P(PSTR("4: 0x%02X\n"), DataBuffer[4]);
	}
	
	else if(RegToRead == 5)	//write bytes to buffer
	{
		printf_P(PSTR("writing 5 bytes to buffer %u at address 0x%04X\n"), BufferNumber, Addr);
		DataBuffer[0] = 0xAE;
		DataBuffer[1] = 0x14;
		DataBuffer[2] = 0x9A;
		DataBuffer[3] = 0x22;
		DataBuffer[4] = 0x17;
		AT45DB321D_BufferWrite(BufferNumber, Addr, DataBuffer, 5);
	}
	
	else if(RegToRead == 6)	//Copy page to buffer
	{
		printf_P(PSTR("Copy page 0x%04X to buffer %u\n"), Addr, BufferNumber);
		AT45DB321D_CopyPageToBuffer(BufferNumber, Addr);
		printf_P(PSTR("Stat: 0x%02X\n"), AT45DB321D_WaitForReady());
	}
	
	else if(RegToRead == 7)	//Copy buffer to page
	{
		printf_P(PSTR("Copy buffer %u to page 0x%04X\n"), BufferNumber, Addr);
		AT45DB321D_CopyBufferToPage(BufferNumber, Addr);
		printf_P(PSTR("Stat: 0x%02X\n"), AT45DB321D_WaitForReady());
	}
	
	else if(RegToRead == 8)	//Erase page
	{
		printf_P(PSTR("Erase page 0x%04X\n"), Addr);
		AT45DB321D_ErasePage(Addr);
		printf_P(PSTR("Stat: 0x%02X\n"), AT45DB321D_WaitForReady());
	}
	
	else if(RegToRead == 9)	//init datalogger
	{
		 Datalogger_Init(DATALOGGER_INIT_APPEND | DATALOGGER_INIT_RESTART_IF_FULL);
	}
	
	else if (RegToRead == 10)
	{
		Datalogger_AddDataSet(DataBuffer);
	}
	
	else if (RegToRead == 11)
	{
		Datalogger_SaveDataToFlash();
	}
	
	else if (RegToRead == 12)
	{
		Datalogger_ReadBackData(5);
	}
	
	return 0;
}