-
Notifications
You must be signed in to change notification settings - Fork 0
/
dualshock-drive.c
61 lines (50 loc) · 1.23 KB
/
dualshock-drive.c
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
//
// DualShock Library
// ATmega8系 SPIペリフェラル使用
//
// created: 2013/10/23
//
#include <avr/io.h>
#include <util/delay.h>
#include "dualshock-drive.h"
// 通信時の1byte間の間隔(単位:us)
#define DUALSHOCK_DRIVE_DELAY_TIME 200
// SPI SEL端子制御用
#define DUALSHOCK_DRIVE_PORT PORTB
#define DUALSHOCK_DRIVE_DDR DDRB
#define DUALSHOCK_DRIVE_PIN PINB
#define DUALSHOCK_DRIVE_PIN_SEL PB2
// ----- 初期化処理 -----
void dualshock_drive_init()
{
// Using SPI
// SPI Master mode
// LSB first
// SPI Clock mode 3
// SCK = F_CPU / 128
SPCR = _BV(SPE)|_BV(MSTR)|_BV(DORD)|_BV(CPOL)|_BV(CPHA)|_BV(SPR1)|_BV(SPR0);
SPSR = 0;
// SEL端子制御ポート初期化
DUALSHOCK_DRIVE_PORT |= _BV(DUALSHOCK_DRIVE_PIN_SEL);
DUALSHOCK_DRIVE_DDR |= _BV(DUALSHOCK_DRIVE_PIN_SEL);
}
// ----- SEL端子Low出力 -----
void dualshock_drive_begin()
{
DUALSHOCK_DRIVE_PORT &= ~_BV(DUALSHOCK_DRIVE_PIN_SEL);
}
// ----- SEL端子High出力 -----
void dualshock_drive_end()
{
DUALSHOCK_DRIVE_PORT |= _BV(DUALSHOCK_DRIVE_PIN_SEL);
}
// ----- 1byte送受信&待機 -----
unsigned char dualshock_drive_put_get(unsigned char dat)
{
unsigned char res;
SPDR = dat;
while (!(SPSR & _BV(SPIF)));
res = SPDR;
_delay_us(DUALSHOCK_DRIVE_DELAY_TIME);
return res;
}