52 lines
887 B
C++
52 lines
887 B
C++
|
|
#ifndef __SPI_DRIVER_H__
|
||
|
|
#define __SPI_DRIVER_H__
|
||
|
|
|
||
|
|
#include <cstdint>
|
||
|
|
#include "bus_core.h"
|
||
|
|
|
||
|
|
enum class SpiPort : uint8_t {
|
||
|
|
_0 = 0,
|
||
|
|
_1, _2, _3, _4, _5,
|
||
|
|
MAX
|
||
|
|
};
|
||
|
|
|
||
|
|
struct SpiConfig {
|
||
|
|
uint32_t speed_hz = 1000000;
|
||
|
|
uint8_t data_width = 8;
|
||
|
|
uint8_t mode = 0;
|
||
|
|
};
|
||
|
|
|
||
|
|
class SpiBus;
|
||
|
|
|
||
|
|
class SpiDevice {
|
||
|
|
public:
|
||
|
|
SpiDevice(uint32_t cs_port, uint32_t cs_pin);
|
||
|
|
RetCode init();
|
||
|
|
|
||
|
|
private:
|
||
|
|
friend class SpiBus;
|
||
|
|
uint32_t cs_port_;
|
||
|
|
uint32_t cs_pin_;
|
||
|
|
bool initialized_ = false;
|
||
|
|
};
|
||
|
|
|
||
|
|
class SpiBus {
|
||
|
|
public:
|
||
|
|
explicit SpiBus(SpiPort port);
|
||
|
|
~SpiBus();
|
||
|
|
|
||
|
|
SpiBus(const SpiBus &) = delete;
|
||
|
|
SpiBus &operator=(const SpiBus &) = delete;
|
||
|
|
|
||
|
|
RetCode init(const SpiConfig &config);
|
||
|
|
RetCode deinit();
|
||
|
|
RetCode transfer(SpiDevice *device, BusTransfer *transfer);
|
||
|
|
|
||
|
|
private:
|
||
|
|
SpiPort port_;
|
||
|
|
SpiConfig config_;
|
||
|
|
bool initialized_ = false;
|
||
|
|
};
|
||
|
|
|
||
|
|
#endif
|