Skip to content

Commit 2087791

Browse files
author
thefloe1
committed
initial release
Library for accessing the configuration FLASH on Papilio Pro boards
1 parent d20cfc3 commit 2087791

File tree

2 files changed

+165
-0
lines changed

2 files changed

+165
-0
lines changed

libraries/PFlash/PFlash.cpp

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/*
2+
* PFlash.cpp - library for SPI Flash memory on Papilio Pro
3+
*
4+
* by theFloe <thefloe@ptmx.org>
5+
*/
6+
7+
#include <SPI.h>
8+
#include "PFlash.h"
9+
10+
11+
SPIClass FLASH(1);
12+
13+
14+
PFLASH::PFLASH() {
15+
16+
}
17+
18+
19+
20+
void PFLASH::begin() {
21+
pinMode(SPI_FLASH_SEL_PIN, OUTPUT);
22+
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
23+
24+
FLASH.begin(WishboneSlot(4));
25+
FLASH.setDataMode(SPI_MODE2);
26+
}
27+
28+
29+
30+
uint16_t PFLASH::rdid()
31+
{
32+
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
33+
FLASH.transfer(FLASH_RDID); // RDID
34+
unsigned int ret = FLASH.transfer16(0x0000);
35+
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
36+
return ret;
37+
}
38+
39+
uint8_t PFLASH::read(uint16_t addr)
40+
{
41+
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
42+
FLASH.transfer(FLASH_READ); // READ
43+
FLASH.transfer24(FLASHSTART+addr);
44+
byte ret = FLASH.transfer(0x00);
45+
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
46+
return ret;
47+
}
48+
49+
void PFLASH::readBlock(uint16_t addr, uint8_t *data, uint16_t size)
50+
{
51+
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
52+
FLASH.transfer(FLASH_READ); // READ
53+
FLASH.transfer24(FLASHSTART+addr);
54+
for (uint16_t i=0; i<size; i++)
55+
*data++ = FLASH.transfer(0x00);
56+
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
57+
}
58+
59+
60+
uint8_t PFLASH::status()
61+
{
62+
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
63+
FLASH.transfer(FLASH_RDSR); // Status
64+
byte ret = FLASH.transfer(0x00);
65+
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
66+
return ret;
67+
}
68+
69+
void PFLASH::write(uint16_t addr, uint8_t data)
70+
{
71+
if (addr > FLASHSIZE)
72+
return;
73+
74+
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
75+
FLASH.transfer(FLASH_WREN); // WRREN
76+
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
77+
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
78+
FLASH.transfer(FLASH_WRITE); // WRITE
79+
FLASH.transfer24(FLASHSTART+addr);
80+
FLASH.transfer(data);
81+
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
82+
83+
while (status() & 0x01)
84+
delay(1);
85+
}
86+
87+
void PFLASH::writeBlock(uint16_t addr, uint8_t *data, uint8_t size)
88+
{
89+
if (addr+size > FLASHSIZE)
90+
return;
91+
92+
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
93+
FLASH.transfer(FLASH_WREN); // WRREN
94+
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
95+
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
96+
FLASH.transfer(FLASH_WRITE); // WRITE
97+
FLASH.transfer24(FLASHSTART+addr);
98+
for (uint8_t i=0; i<size; i++)
99+
FLASH.transfer(data[i]);
100+
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
101+
102+
while (status() & 0x01)
103+
delay(1);
104+
}
105+
106+
107+
void PFLASH::erase()
108+
{
109+
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
110+
FLASH.transfer(FLASH_WREN); // WRREN
111+
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
112+
113+
digitalWrite(SPI_FLASH_SEL_PIN, LOW);
114+
FLASH.transfer(FLASH_SERASE);
115+
FLASH.transfer24(FLASHSTART);
116+
digitalWrite(SPI_FLASH_SEL_PIN, HIGH);
117+
118+
while (status() & 0x01)
119+
delay(1);
120+
}

libraries/PFlash/PFlash.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* PFlash.h - library for SPI Flash memory on Papilio Pro
3+
*
4+
* by theFloe <thefloe@ptmx.org>
5+
*/
6+
7+
#ifndef PFLASH_H
8+
#define PFLASH_H
9+
10+
#include <SPI.h> // relies on arduino SPI library
11+
12+
13+
14+
#define FLASHSTART 0x7FF000
15+
#define FLASHSIZE 0x000FFF
16+
#define FLASHSECTOR 0x7FF
17+
18+
#define FLASH_RDID 0x9F
19+
#define FLASH_READ 0x03
20+
#define FLASH_RDSR 0x05
21+
#define FLASH_WREN 0x06
22+
#define FLASH_WRITE 0x02
23+
#define FLASH_SERASE 0x20
24+
25+
class PFLASH
26+
{
27+
private:
28+
29+
30+
public:
31+
PFLASH(); // default to type 0
32+
33+
34+
void begin();
35+
uint16_t rdid();
36+
uint8_t read(uint16_t addr);
37+
void readBlock(uint16_t addr, uint8_t *data, uint16_t size);
38+
uint8_t status();
39+
void write(uint16_t addr, uint8_t data);
40+
void writeBlock(uint16_t addr, uint8_t *data, uint8_t size);
41+
void erase();
42+
43+
};
44+
45+
#endif // PFLASH_H

0 commit comments

Comments
 (0)