Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 120 additions & 0 deletions libraries/PFlash/PFlash.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
/*
* PFlash.cpp - library for SPI Flash memory on Papilio Pro
*
* by theFloe <thefloe@ptmx.org>
*/

#include <SPI.h>
#include "PFlash.h"


SPIClass FLASH(1);


PFLASH::PFLASH() {

}



void PFLASH::begin() {
pinMode(SPI_FLASH_SEL_PIN, OUTPUT);
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);

FLASH.begin(WishboneSlot(4));
FLASH.setDataMode(SPI_MODE2);
}



uint16_t PFLASH::rdid()
{
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
FLASH.transfer(FLASH_RDID); // RDID
unsigned int ret = FLASH.transfer16(0x0000);
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
return ret;
}

uint8_t PFLASH::read(uint16_t addr)
{
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
FLASH.transfer(FLASH_READ); // READ
FLASH.transfer24(FLASHSTART+addr);
byte ret = FLASH.transfer(0x00);
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
return ret;
}

void PFLASH::readBlock(uint16_t addr, uint8_t *data, uint16_t size)
{
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
FLASH.transfer(FLASH_READ); // READ
FLASH.transfer24(FLASHSTART+addr);
for (uint16_t i=0; i<size; i++)
*data++ = FLASH.transfer(0x00);
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
}


uint8_t PFLASH::status()
{
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
FLASH.transfer(FLASH_RDSR); // Status
byte ret = FLASH.transfer(0x00);
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
return ret;
}

void PFLASH::write(uint16_t addr, uint8_t data)
{
if (addr > FLASHSIZE)
return;

digitalWrite(SPI_FLASH_SEL_PIN, LOW);
FLASH.transfer(FLASH_WREN); // WRREN
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
FLASH.transfer(FLASH_WRITE); // WRITE
FLASH.transfer24(FLASHSTART+addr);
FLASH.transfer(data);
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);

while (status() & 0x01)
delay(1);
}

void PFLASH::writeBlock(uint16_t addr, uint8_t *data, uint8_t size)
{
if (addr+size > FLASHSIZE)
return;

digitalWrite(SPI_FLASH_SEL_PIN, LOW);
FLASH.transfer(FLASH_WREN); // WRREN
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
FLASH.transfer(FLASH_WRITE); // WRITE
FLASH.transfer24(FLASHSTART+addr);
for (uint8_t i=0; i<size; i++)
FLASH.transfer(data[i]);
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);

while (status() & 0x01)
delay(1);
}


void PFLASH::erase()
{
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
FLASH.transfer(FLASH_WREN); // WRREN
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);

digitalWrite(SPI_FLASH_SEL_PIN, LOW);
FLASH.transfer(FLASH_SERASE);
FLASH.transfer24(FLASHSTART);
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);

while (status() & 0x01)
delay(1);
}
45 changes: 45 additions & 0 deletions libraries/PFlash/PFlash.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* PFlash.h - library for SPI Flash memory on Papilio Pro
*
* by theFloe <thefloe@ptmx.org>
*/

#ifndef PFLASH_H
#define PFLASH_H

#include <SPI.h> // relies on arduino SPI library



#define FLASHSTART 0x7FF000
#define FLASHSIZE 0x000FFF
#define FLASHSECTOR 0x7FF

#define FLASH_RDID 0x9F
#define FLASH_READ 0x03
#define FLASH_RDSR 0x05
#define FLASH_WREN 0x06
#define FLASH_WRITE 0x02
#define FLASH_SERASE 0x20

class PFLASH
{
private:


public:
PFLASH(); // default to type 0


void begin();
uint16_t rdid();
uint8_t read(uint16_t addr);
void readBlock(uint16_t addr, uint8_t *data, uint16_t size);
uint8_t status();
void write(uint16_t addr, uint8_t data);
void writeBlock(uint16_t addr, uint8_t *data, uint8_t size);
void erase();

};

#endif // PFLASH_H