PSRAM64.h
Go to the documentation of this file.
1 /****
2  * PSRAM64.h
3  *
4  * Copyright 2020 mikee47 <mike@sillyhouse.net>
5  *
6  * This file is part of the HardwareSPI Library
7  *
8  * This library is free software: you can redistribute it and/or modify it under the terms of the
9  * GNU General Public License as published by the Free Software Foundation, version 3 or later.
10  *
11  * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  * See the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along with this library.
16  * If not, see <https://www.gnu.org/licenses/>.
17  *
18  * @author: October 2020 - mikee47 <mike@sillyhouse.net>
19  *
20  ****/
21 
22 #pragma once
23 
24 #include "../MemoryDevice.h"
25 
26 namespace HSPI
27 {
28 namespace RAM
29 {
34 class PSRAM64 : public MemoryDevice
35 {
36 public:
37  using MemoryDevice::MemoryDevice;
38 
39  size_t getSize() const override
40  {
41  return 8 * 1024 * 1024;
42  }
43 
44  IoModes getSupportedIoModes() const override
45  {
47  }
48 
52  bool begin(PinSet pinSet, uint8_t chipSelect, uint32_t clockSpeed)
53  {
54  if(!MemoryDevice::begin(pinSet, chipSelect, clockSpeed)) {
55  return false;
56  }
57 
60 
61  // Exit QUAD mode
63  Request req;
64  req.setCommand8(0xF5);
65  execute(req);
67 
68  // Issue RESET
69  req.setCommand8(0x66);
70  execute(req);
71  req.setCommand8(0x99);
72  execute(req);
73 
74  readId();
75 
76  return true;
77  }
78 
79  uint8_t readId()
80  {
81  auto savedIoMode = getIoMode();
82  if(!setIoMode(IoMode::SPIHD)) {
83  debug_e("readId() requires SPIHD IO");
84  return 0;
85  }
86 
87  uint8_t buffer[8];
88  Request req;
89  req.setCommand8(0x9F); // Read ID
90  req.setAddress24(0);
91  req.in.set(buffer, sizeof(buffer));
92  execute(req);
93 
94  setIoMode(savedIoMode);
95 
96  debug_hex(ERR, "ID", buffer, sizeof(buffer));
97 
98  return buffer[0];
99  }
100 
101  bool setIoMode(IoMode mode) override
102  {
103  auto oldMode = MemoryDevice::getIoMode();
104  if(oldMode == mode) {
105  return true;
106  }
107 
108  if(!isSupported(mode)) {
109  debug_e("setIoMode(): Mode %u invalid", unsigned(mode));
110  return false;
111  }
112 
113  Request req;
114  if(oldMode == IoMode::SQI) {
115  req.setCommand8(0xF5); // Exit Quad Mode
116  execute(req);
117  } else if(mode == IoMode::SQI) {
118  req.setCommand8(0x35); // Enter Quad Mode
119  execute(req);
120  }
121 
122  return MemoryDevice::setIoMode(mode);
123  }
124 
125  void prepareWrite(HSPI::Request& req, uint32_t address) override
126  {
127  bool quad = (getIoMode() != IoMode::SPIHD);
128  wait(req);
129  req.setCommand8(quad ? 0x38 : 0x02);
130  req.setAddress24(address);
131  req.dummyLen = 0;
132  }
133 
134  void prepareRead(HSPI::Request& req, uint32_t address) override
135  {
136  bool quad = (getIoMode() != IoMode::SPIHD);
137  wait(req);
138  req.setCommand8(quad ? 0xEB : 0x0B);
139  req.setAddress24(address);
140  req.dummyLen = quad ? 6 : 8;
141  }
142 
143 private:
144  HSPI::Request req1;
145  HSPI::Request req2;
146 };
147 
148 } // namespace RAM
149 } // namespace HSPI
@ QIO
Four bits per clock for Address and Data, 1-bit for Command.
Definition: Common.h:34
bool begin(PinSet pinSet, uint8_t chipSelect, uint32_t clockSpeed)
Register device with controller and prepare for action.
Definition: Libraries/HardwareSPI/src/include/HSPI/Device.h:122
IoMode getIoMode() const
Definition: Libraries/HardwareSPI/src/include/HSPI/Device.h:209
void setBitOrder(BitOrder bitOrder)
Definition: Libraries/HardwareSPI/src/include/HSPI/Device.h:160
void setAddress24(uint32_t address)
Set 24-bit address.
Definition: HardwareSPI/src/include/HSPI/Request.h:154
void set(const void *data, uint16_t count)
Set to reference external data block.
Definition: Data.h:120
#define MSBFIRST
Definition: WConstants.h:63
virtual bool setIoMode(IoMode mode)
Definition: Libraries/HardwareSPI/src/include/HSPI/Device.h:200
@ SQI
Four bits per clock for Command, Address and Data.
BitSet< uint16_t, IoMode, unsigned(IoMode::MAX)> IoModes
Definition: Common.h:62
uint8_t readId()
Definition: PSRAM64.h:136
void setClockMode(ClockMode mode)
Definition: Libraries/HardwareSPI/src/include/HSPI/Device.h:173
Data in
Incoming data.
Definition: HardwareSPI/src/include/HSPI/Request.h:92
bool isSupported(IoMode mode) const
Determine if the device/controller combination supports an IO mode Must be called after begin() as ot...
Definition: Libraries/HardwareSPI/src/include/HSPI/Device.h:195
#define ERR
Definition: debug_progmem.h:41
IoMode
Mode of data transfer.
Definition: Common.h:49
#define debug_e(fmt,...)
Definition: debug_progmem.h:77
bool setIoMode(IoMode mode) override
Definition: PSRAM64.h:158
IoModes getSupportedIoModes() const override
Return set of IO modes supported by a device implementation.
Definition: PSRAM64.h:101
Defines an SPI Request Packet.
Definition: HardwareSPI/src/include/HSPI/Request.h:79
PinSet
How SPI hardware pins are connected.
Definition: Common.h:108
size_t getSize() const override
Definition: PSRAM64.h:96
void setCommand8(uint8_t command)
Set 8-bit command.
Definition: HardwareSPI/src/include/HSPI/Request.h:119
bool begin(PinSet pinSet, uint8_t chipSelect, uint32_t clockSpeed)
Configure the RAM into a known operating mode.
Definition: PSRAM64.h:109
@ mode0
CPOL: 0 CPHA: 0.
uint8_t dummyLen
Dummy read bits between address and read data, 0 - 255.
Definition: HardwareSPI/src/include/HSPI/Request.h:89
void execute(Request &request)
Definition: Libraries/HardwareSPI/src/include/HSPI/Device.h:233
void prepareRead(HSPI::Request &req, uint32_t address) override
Prepare without buffer.
Definition: PSRAM64.h:191
void prepareWrite(HSPI::Request &req, uint32_t address) override
Prepare request without data.
Definition: PSRAM64.h:182
void wait(Request &request)
Definition: Libraries/HardwareSPI/src/include/HSPI/Device.h:248
@ SPIHD
One bit per clock, MISO stage follows MOSI (half-duplex)
#define debug_hex(_level, _tag, _data, _len,...)
Definition: debug_progmem.h:87