Address mode updating works as intended, successful chip erase, read and write

This commit is contained in:
dario
2024-02-19 11:28:28 +01:00
parent ebbcd79fb9
commit b28e15daff
3 changed files with 225 additions and 80 deletions

View File

@@ -7,41 +7,59 @@
namespace sta
{
/**
* @brief
*
*/
enum class BlockSize
{
_32KB,
_64KB
};
/**
* @brief
*
*/
enum class ChipState
{
NORMAL,
POWERED_DOWN
};
/**
* @brief
*
*/
enum class AddressMode
{
_24BIT,
_32BIT
};
class W25Qxx
{
enum class BlockSize
{
_32KB,
_64KB
};
// TODO decide address size at compile time? Use sta/config.hpp?
union Address32
{
uint32_t value;
uint8_t buffer[4];
uint8_t page[3];
};
union Address24
{
uint32_t value;
uint8_t dummy;
uint8_t buffer[3];
uint8_t page[2];
};
enum class ChipState
{
NORMAL,
POWERED_DOWN
};
public:
W25Qxx(SPIDevice * device);
/**
* @brief Construct a new W25Qxx object
*
* @param device
* @param addrMode
*/
W25Qxx(SPIDevice * device, AddressMode addrMode = AddressMode::_24BIT);
uint8_t init();
/**
* @brief Set the Address Mode object
*
* @param addrMode
* @return uint8_t
*/
uint8_t setAddressMode(AddressMode addrMode);
AddressMode getAddressMode();
uint8_t getChipID();
uint8_t getManufacturerID();
@@ -119,7 +137,7 @@ namespace sta
* @param length
* @return uint8_t
*/
uint8_t readData(Address32 address, uint8_t * buffer, size_t length, bool fast = true);
uint8_t readData(uint32_t address, uint8_t * buffer, size_t length, bool fast = true);
/**
* @brief
@@ -129,7 +147,7 @@ namespace sta
* @param length
* @return uint8_t
*/
uint8_t pageProgram(Address32 address, uint8_t * buffer, size_t length);
uint8_t pageProgram(uint32_t address, uint8_t * buffer, size_t length);
public:
@@ -146,7 +164,7 @@ namespace sta
* @param address The address of the sector to erase.
* @return bool Returns 1 if the operation was successful, 0 otherwise.
*/
uint8_t sectorErase(Address32 address);
uint8_t sectorErase(uint32_t address);
/**
* @brief Sets all memory within a specified block (32/64 KByte) to 1s.
@@ -158,7 +176,7 @@ namespace sta
* @param blockSize The size of the block (32KByte vs 64KByte)
* @return uint8_t Returns 1 if the operation was successful, 0 otherwise.
*/
uint8_t blockErase(Address32 address, BlockSize blockSize);
uint8_t blockErase(uint32_t address, BlockSize blockSize);
/**
* @brief Sets all memory on the chip to 1s.
@@ -201,8 +219,28 @@ namespace sta
// Global Block / Sector unlock
private:
/**
* @brief
*
* @param instruction
* @param data
* @param length
* @param arguments
* @param arg_length
* @return uint8_t
*/
uint8_t busWrite(uint8_t instruction, const uint8_t * data = nullptr, size_t length = 0, uint8_t * arguments = nullptr, size_t arg_length = 0);
/**
* @brief
*
* @param instruction
* @param data
* @param length
* @param arguments
* @param arg_length
* @return uint8_t
*/
uint8_t busRead(uint8_t instruction, uint8_t * data, size_t length, uint8_t * arguments = nullptr, size_t arg_length = 0);
/**
@@ -221,6 +259,7 @@ namespace sta
private:
SPIDevice * device_;
ChipState state_;
AddressMode addrMode_;
};
} // namespace sta

View File

@@ -1,6 +1,8 @@
#ifndef STA_SENSORS_W25QXX_DEFS_HPP
#define STA_SENSORS_W25QXX_DEFS_HPP
// Enable 4 Byte address mode (for W25Q512)
#define W25QXX_4_BYTE_ADDR_ENABLE 0xB7
// W25Qxx-specific instructions
#define W25QXX_WRITE_ENABLE 0x06
@@ -26,7 +28,6 @@
// ID reading
#define W25QXX_DEVICE_ID 0x90
#define W25QXX_JEDEC_ID 0x9F
#define W25QXX_READ_UNIQUE_ID 0x4B
#define W25QXX_GLOBAL_BLOCK_LOCK 0x7E
@@ -56,7 +57,8 @@
#define W25QXX_INDIV_BLOCK_UNLOCK 0x39
#define W25QXX_READ_BLOCK_LOCK 0x3D
#define W25QXX_FAST_READ_DUAL
#define W25QXX_DEVICE_ID_RESULT 0xEF
#endif // STA_SENSORS_W25QXX_DEFS_HPP
#endif // STA_SENSORS_W25QXX_DEFS_HPP