blob: ca681e909abd5a22eae56cda71d96413fb9486de (
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
|
#include "swspi.h"
#ifdef SWSPI_RPI
#include <bcm2835.h>
#define GPIO_INP(gpio) bcm2835_gpio_fsel(gpio, BCM2835_GPIO_FSEL_INPT)
#define GPIO_OUT(gpio) bcm2835_gpio_fsel(gpio, BCM2835_GPIO_FSEL_OUTP)
#define GPIO_SET(gpio) bcm2835_gpio_write(gpio, HIGH)
#define GPIO_CLR(gpio) bcm2835_gpio_write(gpio, LOW)
#define GPIO_GET(gpio) (bcm2835_gpio_lev(gpio) != LOW)
#define DELAY(delay) usleep(delay)
#endif //SWSPI_RPI
#ifdef SWSPI_AVR
#include "Arduino.h"
#define GPIO_INP(gpio) pinMode(gpio, INPUT)
#define GPIO_OUT(gpio) pinMode(gpio, OUTPUT)
#define GPIO_SET(gpio) digitalWrite(gpio, HIGH)
#define GPIO_CLR(gpio) digitalWrite(gpio, LOW)
#define GPIO_GET(gpio) (digitalRead(gpio) != LOW)
#define DELAY(delay) delayMicroseconds(delay)
#endif //SWSPI_AVR
#if (SWSPI_POL != 0)
#define SWSPI_SCK_UP GPIO_CLR(SWSPI_SCK)
#define SWSPI_SCK_DN GPIO_SET(SWSPI_SCK)
#else
#define SWSPI_SCK_UP GPIO_SET(SWSPI_SCK)
#define SWSPI_SCK_DN GPIO_CLR(SWSPI_SCK)
#endif
void swspi_init()
{
GPIO_INP(SWSPI_MISO);
GPIO_OUT(SWSPI_MOSI);
GPIO_OUT(SWSPI_SCK);
GPIO_OUT(SWSPI_CS);
GPIO_CLR(SWSPI_MOSI);
SWSPI_SCK_DN;
GPIO_SET(SWSPI_CS);
}
#if (SWSPI_MOSI == SWSPI_MISO)
void swspi_tx(unsigned char tx)
{
GPIO_OUT(SWSPI_MOSI);
unsigned char i = 0; for (; i < 8; i++)
{
if (tx & 0x80) GPIO_SET(SWSPI_MOSI);
else GPIO_CLR(SWSPI_MOSI);
DELAY(SWSPI_DEL);
SWSPI_SCK_UP;
DELAY(SWSPI_DEL);
SWSPI_SCK_DN;
tx <<= 1;
}
}
unsigned char swspi_rx()
{
GPIO_INP(SWSPI_MISO);
unsigned char rx = 0;
unsigned char i = 0; for (; i < 8; i++)
{
rx <<= 1;
DELAY(SWSPI_DEL);
SWSPI_SCK_UP;
DELAY(SWSPI_DEL);
rx |= GPIO_GET(SWSPI_MISO)?1:0;
SWSPI_SCK_DN;
}
return rx;
}
#else //(SWSPI_MOSI == SWSPI_MISO)
unsigned char swspi_txrx(unsigned char tx)
{
unsigned char rx = 0;
unsigned char i = 0; for (; i < 8; i++)
{
rx <<= 1;
if (tx & 0x80) GPIO_SET(SWSPI_MOSI);
else GPIO_CLR(SWSPI_MOSI);
DELAY(SWSPI_DEL);
SWSPI_SCK_UP;
DELAY(SWSPI_DEL);
rx |= GPIO_GET(SWSPI_MISO)?1:0;
SWSPI_SCK_DN;
tx <<= 1;
}
return rx;
}
#endif //(SWSPI_MOSI == SWSPI_MISO)
void swspi_start()
{
GPIO_CLR(SWSPI_CS);
}
void swspi_stop()
{
GPIO_SET(SWSPI_CS);
}
|