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 | }
|