@@ -14,78 +14,35 @@ extern "C" {
14
14
class HSPI : public SPIImpl
15
15
{
16
16
public:
17
- virtual void begin ()
18
- {
19
- // bit9 of PERIPHS_IO_MUX should be cleared when HSPI clock doesn't equal CPU clock
20
- WRITE_PERI_REG (PERIPHS_IO_MUX, 0x105 );
21
- PIN_FUNC_SELECT (PERIPHS_IO_MUX_MTDI_U, FUNC_HSPIQ_MISO); // gpio12
22
- PIN_FUNC_SELECT (PERIPHS_IO_MUX_MTCK_U, FUNC_HSPID_MOSI); // gpio13
23
- PIN_FUNC_SELECT (PERIPHS_IO_MUX_MTMS_U, FUNC_HSPI_CLK); // gpio14
24
- PIN_FUNC_SELECT (PERIPHS_IO_MUX_MTDO_U, FUNC_HSPI_CS0); // gpio15
25
-
26
-
27
- SET_PERI_REG_MASK (SPI_USER (HSPI), SPI_CS_SETUP|SPI_CS_HOLD|SPI_USR_COMMAND);
28
- CLEAR_PERI_REG_MASK (SPI_USER (HSPI), SPI_FLASH_MODE);
29
-
30
- // SPI clock=CPU clock/8
31
- WRITE_PERI_REG (SPI_CLOCK (HSPI),
32
- ((1 &SPI_CLKDIV_PRE)<<SPI_CLKDIV_PRE_S)|
33
- ((3 &SPI_CLKCNT_N)<<SPI_CLKCNT_N_S)|
34
- ((1 &SPI_CLKCNT_H)<<SPI_CLKCNT_H_S)|
35
- ((3 &SPI_CLKCNT_L)<<SPI_CLKCNT_L_S)); // clear bit 31,set SPI clock div
36
-
37
-
38
- SET_PERI_REG_MASK (SPI_USER (spi_no), SPI_CS_SETUP|SPI_CS_HOLD|SPI_USR_COMMAND|SPI_USR_MOSI);
39
- CLEAR_PERI_REG_MASK (SPI_USER (spi_no), SPI_FLASH_MODE);
40
-
41
- // clear Daul or Quad lines transmission mode
42
- CLEAR_PERI_REG_MASK (SPI_CTRL (spi_no), SPI_QIO_MODE|SPI_DIO_MODE|SPI_DOUT_MODE|SPI_QOUT_MODE);
43
-
44
- WRITE_PERI_REG (SPI_CLOCK (spi_no),
45
- ((3 &SPI_CLKCNT_N)<<SPI_CLKCNT_N_S)|
46
- ((1 &SPI_CLKCNT_H)<<SPI_CLKCNT_H_S)|
47
- ((3 &SPI_CLKCNT_L)<<SPI_CLKCNT_L_S)); // clear bit 31,set SPI clock div
48
-
49
- // set 8bit output buffer length, the buffer is the low 8bit of register"SPI_FLASH_C0"
50
- WRITE_PERI_REG (SPI_USER1 (spi_no),
51
- ((7 &SPI_USR_MOSI_BITLEN)<<SPI_USR_MOSI_BITLEN_S)|
52
- ((7 &SPI_USR_MISO_BITLEN)<<SPI_USR_MISO_BITLEN_S));
53
-
54
- }
55
-
56
- virtual void end ()
57
- {
58
-
59
- }
60
-
61
- virtual void setBitOrder (uint8_t bitOrder)
62
- {
63
-
64
- }
65
-
66
- virtual void setDataMode (uint8_t dataMode)
67
- {
68
-
69
- }
17
+ virtual void begin ();
18
+ virtual void end ();
19
+ virtual void setBitOrder (uint8_t bitOrder);
20
+ virtual void setDataMode (uint8_t dataMode);
21
+ virtual void setClockDivider (uint8_t clockDiv);
22
+ virtual uint8_t transfer (uint8_t data);
23
+ virtual uint16_t transfer16 (uint16_t data);
24
+ virtual void transfer (void *buf, size_t count);
70
25
71
- virtual void setClockDivider (uint8_t clockDiv)
72
- {
73
-
74
- }
26
+ private:
27
+ uint32_t _clkDiv;
28
+ uint32_t *spi_fifo;
29
+ const uint32_t hspi_port = 1 ;
30
+ const uint32_t hspi_fifo_size = 32 ;
75
31
76
- virtual uint8_t transfer (uint8_t data)
32
+ private:
33
+ inline void hspi_wait_ready (void ){while (READ_PERI_REG (SPI_FLASH_CMD (hspi_port))&SPI_FLASH_USR);}
34
+ inline void hspi_start_tx (){SET_PERI_REG_MASK (SPI_FLASH_CMD (hspi_port), SPI_FLASH_USR);}
35
+ inline void hspi_prepare_tx (uint32_t bytecount)
77
36
{
78
-
37
+ uint32_t bitcount = bytecount * 8 - 1 ;
38
+ WRITE_PERI_REG (SPI_FLASH_USER1 (hspi_port), (bitcount & SPI_USR_OUT_BITLEN) << SPI_USR_OUT_BITLEN_S);
79
39
}
80
-
81
- virtual void transfer (void *buf, size_t count)
40
+ inline void hspi_prepare_txrx (uint32_t bytecount)
82
41
{
83
-
42
+ uint32_t bitcount = bytecount * 8 - 1 ;
43
+ WRITE_PERI_REG (SPI_FLASH_USER1 (hspi_port), ((bitcount & SPI_USR_OUT_BITLEN) << SPI_USR_OUT_BITLEN_S) |
44
+ ((bitcount & SPI_USR_DIN_BITLEN) << SPI_USR_DIN_BITLEN_S));
84
45
}
85
-
86
- private:
87
- uint32_t _clkDiv;
88
-
89
46
90
47
};
91
48
0 commit comments