1 | void spi_init(char mode)
|
2 | {
|
3 | pio.OutputDriverEnable(CS);
|
4 | pio.OutputDriverEnable(HOLD);
|
5 | pio.OutputDriverEnable(WP);
|
6 | pio.OutputDriverEnable(CLK);
|
7 | pio.OutputDriverEnable(MOSI);
|
8 | pio.OutputDriverDisable(MISO);
|
9 | pio.PullupDisable(MISO);
|
10 |
|
11 | pio.OutputLevelHigh(CS); pio.PullupEnable(CS);
|
12 | pio.OutputLevelLow(CLK);
|
13 | pio.OutputLevelHigh(HOLD);
|
14 | pio.OutputLevelHigh(WP);
|
15 | }
|
16 |
|
17 | char spi(char data)
|
18 | {
|
19 | char ret = 0;
|
20 | for(int i = 0; i < 8; i++)
|
21 | {
|
22 | if (data & (0x80>>i)) pio.OutputLevelHigh(MOSI); else pio.OutputLevelLow(MOSI);
|
23 | pio.OutputLevelHigh(CLK);
|
24 | if (pio.GetInputLevel(MISO)) ret |= (0x80>>i);
|
25 | pio.OutputLevelLow(CLK);
|
26 | }
|
27 | return ret;
|
28 | }
|
29 |
|
30 | #define FM_WREN 0x06 // set write enable latch
|
31 | #define FM_WRDI 0x04 // write disable
|
32 | #define FM_RDSR 0x05 // read status register
|
33 | #define FM_WRSR 0x01 // write status register
|
34 | #define FM_READ 0x03 // read memory data
|
35 | #define FM_WRITE 0x02 // write memory data
|
36 |
|
37 |
|
38 | #define select() pio.OutputLevelLow(CS)
|
39 | #define deselect() pio.OutputLevelHigh(CS)
|
40 |
|
41 | #define SPI_MODE 0
|
42 |
|
43 | void fram_read(unsigned addr, char *data, unsigned size)
|
44 | {
|
45 | spi_init(SPI_MODE);
|
46 |
|
47 | select();
|
48 | spi(FM_READ);
|
49 | spi(addr >> 8);
|
50 | spi(addr);
|
51 | while (size--)*data++ = spi(0);
|
52 | deselect();
|
53 | }
|
54 |
|
55 | void
|
56 | fram_write(unsigned addr, char *data1, unsigned size1)
|
57 | {
|
58 | spi_init(SPI_MODE);
|
59 |
|
60 | select();
|
61 | spi(FM_WREN);
|
62 | deselect();
|
63 |
|
64 | select();
|
65 | spi(FM_WRITE);
|
66 | spi(addr >> 8);
|
67 | spi(addr);
|
68 | for (; size1; --size1) spi(*data1++);
|
69 | deselect();
|
70 | }
|
71 |
|
72 | void CSPI::Test()
|
73 | {
|
74 | char* Hallo = "Hallo!";
|
75 | fram_write(128, Hallo, 7);
|
76 | Wait(100);
|
77 | char Blubb[8] = {0};
|
78 | fram_read(128, Blubb, 7);
|
79 | TFT.Out(1, 40, "Empfangen:");
|
80 | TFT.Out(1, 60, Blubb);
|
81 | TFT.SetFontColor(RGB(63, 0, 0));
|
82 | for(int i = 0; i < 7; i++)
|
83 | {
|
84 | TFT.Out(1+i*25, 80, Blubb[i]);
|
85 | }
|
86 | TFT.SetFontColor(RGB(63, 63, 63));
|
87 | }
|