blob: 4ee50a1242158a22a025836b2bd2f05cd49f6f28 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
#include "project.h"
// P0.20 => ginatop pin 8 MISO
// P0.19 => ginatop pin 7 CS
// P0.18 => ginatop pin 4 SCLK
// P0.17 => ginatop pin 3 MOSI
#define MOSI 17
#define SCLK 18
#define NCS 19
#define MISO 20
#define READ 0x3
#define FAST_READ 0xb
static inline void d(void)
{
nrf_delay_us(1);
}
void
gt_init (void)
{
NRF_GPIO->PIN_CNF[SCLK] =
(GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) |
(GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) |
(GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
(GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos) |
(GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
NRF_GPIO->PIN_CNF[MOSI] =
(GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) |
(GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) |
(GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
(GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos) |
(GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
NRF_GPIO->PIN_CNF[NCS] =
(GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) |
(GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) |
(GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
(GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos) |
(GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
NRF_GPIO->PIN_CNF[MISO] =
(GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) |
(GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
(GPIO_PIN_CNF_PULL_Pulldown << GPIO_PIN_CNF_PULL_Pos) |
(GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
(GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos);
NRF_GPIO->DIRSET = (1 << MOSI) | (1 << NCS) | (1<<SCLK);
NRF_GPIO->DIRCLR = (1 << MISO);
NRF_GPIO->OUTSET = (1 << NCS) | (1<<MISO);
}
static void gt_read(uint32_t a,uint8_t * buf,size_t len)
{
uint32_t c;
uint8_t v;
NRF_GPIO->OUTCLR = (1 << SCLK);
d();
NRF_GPIO->OUTCLR = (1 << NCS);
//NRF_GPIO->OUTSET = (1 << NCS);
d();
a |= READ << 24;
for (c=0x80000000;c;c>>=1) {
if (c&a)
NRF_GPIO->OUTSET = (1 << MOSI);
else
NRF_GPIO->OUTCLR = (1 << MOSI);
d();
NRF_GPIO->OUTSET = (1 << SCLK);
d();
NRF_GPIO->OUTCLR = (1 << SCLK);
d();
}
while (len--) {
v=0;
for (c=0x80;c;c>>=1) {
if (NRF_GPIO->IN & (1<<MISO)) v|=c;
NRF_GPIO->OUTSET = (1 << SCLK);
d();
NRF_GPIO->OUTCLR = (1 << SCLK);
d();
}
*(buf++)=v;
}
d();
NRF_GPIO->OUTSET = (1 << NCS);
d();
}
void gt_read_8x8(uint32_t c,uint8_t *d,size_t l)
{
if (c<0x20) c=0x20;
if (c>0x7e) c=0x20;
c-=0x20;
c*=8;
c+=768;
gt_read(c,d,l);
}
|