test.c


1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
#define XCK      PB0
5
#define XCK_DDR  DDRB
6
#define XCK_PORT PORTB
7
#define XCK_HI   XCK_PORT |=  (1<<XCK);
8
#define XCK_LO   XCK_PORT &= ~(1<<XCK);
9
#define CLOCK    _delay_ms(1); \
10
                 XCK_HI        \
11
                 _delay_ms(1); \
12
                 XCK_LO
13
14
#define TXD      PD1
15
#define TXD_DDR  DDRD
16
#define TXD_PORT PORTD
17
#define TXD_HI   TXD_PORT |=  (1<<TXD);
18
#define TXD_LO   TXD_PORT &= ~(1<<TXD);
19
20
#define RXD      PD0
21
#define RXD_DDR  DDRD
22
#define RXD_PORT PORTD
23
24
#define LE       PD7
25
#define LE_DDR   DDRD
26
#define LE_PORT  PORTD
27
#define LE_HI    LE_PORT |=  (1<<LE);
28
#define LE_LO    LE_PORT &= ~(1<<LE);
29
#define LATCH    _delay_ms(1); LE_HI _delay_ms(1); LE_LO _delay_ms(1);
30
31
#define OE       PD6
32
#define OE_DDR   DDRD
33
#define OE_PORT  PORTD
34
#define OE_HI    OE_PORT |=  (1<<OE);
35
#define OE_LO    OE_PORT &= ~(1<<OE);
36
37
#define CONFIG_CODE(value) (((value) << 2) + 0x03)
38
39
void softSPI (uint8_t data) {
40
  uint8_t i;
41
  for (i = 7; i >= 0; i--) {
42
    if ((data & (1<<i)) > 0)
43
      TXD_HI
44
    else
45
      TXD_LO
46
    CLOCK
47
  }
48
}
49
50
#define SPECIAL 0
51
#define NORMAL 1
52
void mode (uint8_t newmode) {
53
  LE_LO
54
  OE_HI
55
  CLOCK
56
  OE_LO
57
  CLOCK
58
  OE_HI
59
  CLOCK
60
  if (newmode == SPECIAL) {
61
    LE_HI
62
    CLOCK
63
    LE_LO
64
    CLOCK
65
  } else {
66
    CLOCK
67
    CLOCK
68
  }
69
}
70
71
int main (void) {
72
  XCK_DDR |= (1<<XCK);
73
  TXD_DDR |= (1<<TXD);
74
  RXD_DDR &= ~(1<<RXD);
75
  LE_DDR  |= (1<<LE);
76
  OE_DDR  |= (1<<OE);
77
  
78
  OE_HI
79
  LE_LO
80
  XCK_LO
81
  _delay_ms(10);
82
  
83
  softSPI (0xFF);
84
  softSPI (0xFF);
85
  LATCH
86
  OE_LO
87
  /*
88
  _delay_ms(1000);
89
  mode (SPECIAL);
90
  softSPI (CONFIG_CODE(10));
91
  LATCH
92
  mode (NORMAL);
93
  OE_LO
94
  */
95
  while(1);
96
  return 0;
97
}