mirror of
https://github.com/esp8266/Arduino.git
synced 2025-07-27 18:02:17 +03:00
Add WIP SPI library
This commit is contained in:
94
libraries/SPI/include/HSPI.h
Normal file
94
libraries/SPI/include/HSPI.h
Normal file
@ -0,0 +1,94 @@
|
||||
#ifndef HSPI_H
|
||||
#define HSPI_H
|
||||
|
||||
#include "SPIImpl.h"
|
||||
#include "SPIdef.h"
|
||||
|
||||
extern "C" {
|
||||
#include "spi_register.h"
|
||||
#include "ets_sys.h"
|
||||
#include "osapi.h"
|
||||
#include "os_type.h"
|
||||
}
|
||||
|
||||
class HSPI : public SPIImpl
|
||||
{
|
||||
public:
|
||||
virtual void begin()
|
||||
{
|
||||
//bit9 of PERIPHS_IO_MUX should be cleared when HSPI clock doesn't equal CPU clock
|
||||
WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105);
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_HSPIQ_MISO); // gpio12
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_HSPID_MOSI); // gpio13
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_HSPI_CLK); // gpio14
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_HSPI_CS0); // gpio15
|
||||
|
||||
|
||||
SET_PERI_REG_MASK(SPI_USER(HSPI), SPI_CS_SETUP|SPI_CS_HOLD|SPI_USR_COMMAND);
|
||||
CLEAR_PERI_REG_MASK(SPI_USER(HSPI), SPI_FLASH_MODE);
|
||||
|
||||
// SPI clock=CPU clock/8
|
||||
WRITE_PERI_REG(SPI_CLOCK(HSPI),
|
||||
((1&SPI_CLKDIV_PRE)<<SPI_CLKDIV_PRE_S)|
|
||||
((3&SPI_CLKCNT_N)<<SPI_CLKCNT_N_S)|
|
||||
((1&SPI_CLKCNT_H)<<SPI_CLKCNT_H_S)|
|
||||
((3&SPI_CLKCNT_L)<<SPI_CLKCNT_L_S)); //clear bit 31,set SPI clock div
|
||||
|
||||
|
||||
SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_CS_SETUP|SPI_CS_HOLD|SPI_USR_COMMAND|SPI_USR_MOSI);
|
||||
CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_FLASH_MODE);
|
||||
|
||||
//clear Daul or Quad lines transmission mode
|
||||
CLEAR_PERI_REG_MASK(SPI_CTRL(spi_no), SPI_QIO_MODE|SPI_DIO_MODE|SPI_DOUT_MODE|SPI_QOUT_MODE);
|
||||
|
||||
WRITE_PERI_REG(SPI_CLOCK(spi_no),
|
||||
((3&SPI_CLKCNT_N)<<SPI_CLKCNT_N_S)|
|
||||
((1&SPI_CLKCNT_H)<<SPI_CLKCNT_H_S)|
|
||||
((3&SPI_CLKCNT_L)<<SPI_CLKCNT_L_S)); //clear bit 31,set SPI clock div
|
||||
|
||||
//set 8bit output buffer length, the buffer is the low 8bit of register"SPI_FLASH_C0"
|
||||
WRITE_PERI_REG(SPI_USER1(spi_no),
|
||||
((7&SPI_USR_MOSI_BITLEN)<<SPI_USR_MOSI_BITLEN_S)|
|
||||
((7&SPI_USR_MISO_BITLEN)<<SPI_USR_MISO_BITLEN_S));
|
||||
|
||||
}
|
||||
|
||||
virtual void end()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
virtual void setBitOrder(uint8_t bitOrder)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
virtual void setDataMode(uint8_t dataMode)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
virtual void setClockDivider(uint8_t clockDiv)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
virtual uint8_t transfer(uint8_t data)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
virtual void transfer(void *buf, size_t count)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private:
|
||||
uint32_t _clkDiv;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif//HSPI_H
|
21
libraries/SPI/include/SPIImpl.h
Normal file
21
libraries/SPI/include/SPIImpl.h
Normal file
@ -0,0 +1,21 @@
|
||||
#ifndef SPIIMPL_H
|
||||
#define SPIIMPL_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
class SPIImpl
|
||||
{
|
||||
public:
|
||||
virtual void begin() = 0;
|
||||
virtual uint8_t transfer(uint8_t data) = 0;
|
||||
virtual void transfer(void *buf, size_t count) = 0;
|
||||
virtual void end() = 0;
|
||||
|
||||
virtual void setBitOrder(uint8_t bitOrder) = 0;
|
||||
virtual void setDataMode(uint8_t dataMode) = 0;
|
||||
virtual void setClockDivider(uint8_t clockDiv) = 0;
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif//SPIIMPL_H
|
28
libraries/SPI/include/SPIdef.h
Normal file
28
libraries/SPI/include/SPIdef.h
Normal file
@ -0,0 +1,28 @@
|
||||
#ifndef SPIDEF_H
|
||||
#define SPIDEF_H
|
||||
|
||||
|
||||
#ifndef LSBFIRST
|
||||
#define LSBFIRST 0
|
||||
#endif
|
||||
#ifndef MSBFIRST
|
||||
#define MSBFIRST 1
|
||||
#endif
|
||||
|
||||
|
||||
// AVR compatibility definitions
|
||||
const uint8_t SPI_CLOCK_DIV4 = 4;
|
||||
const uint8_t SPI_CLOCK_DIV16 = 16;
|
||||
const uint8_t SPI_CLOCK_DIV64 = 64;
|
||||
const uint8_t SPI_CLOCK_DIV128 = 128;
|
||||
const uint8_t SPI_CLOCK_DIV2 = 2;
|
||||
const uint8_t SPI_CLOCK_DIV8 = 8;
|
||||
const uint8_t SPI_CLOCK_DIV32 = 32;
|
||||
|
||||
const uint8_t SPI_MODE0 = 0x00;
|
||||
const uint8_t SPI_MODE1 = 0x04;
|
||||
const uint8_t SPI_MODE2 = 0x08;
|
||||
const uint8_t SPI_MODE3 = 0x0C;
|
||||
|
||||
|
||||
#endif//SPIDEF_H
|
Reference in New Issue
Block a user