1 | #include <hw_types.h>
|
2 | #include <driverlib/sysctl.h>
|
3 | #include <driverlib/ssi.h>
|
4 | #include <hw_memmap.h>
|
5 | #include <driverlib/gpio.h>
|
6 |
|
7 | #include "system.h"
|
8 | #include "comm.h"
|
9 | #include "spi.h"
|
10 | #include "timer.h"
|
11 |
|
12 | #define softSPI 0 // SPI Übertragung durch Soft-SPI wenn 1
|
13 |
|
14 | #if softSPI
|
15 | //#define SDC_CLK GPIOPinWrite (GPIO_PORTA_BASE, SPI0_CLK, 0);
|
16 | //#define SDC_DI GPIOPinWrite (GPIO_PORTA_BASE, SPI0_MISO, 0);
|
17 | //#define SDC_DO GPIOPinWrite (GPIO_PORTA_BASE, SPI0_MOSI, 0);
|
18 | #endif
|
19 |
|
20 | unsigned long uldat;
|
21 |
|
22 | void write_char (char c) {
|
23 |
|
24 | #if SPI
|
25 |
|
26 | #if softSPI
|
27 | volatile char a;
|
28 | unsigned int i;
|
29 |
|
30 | for (a = 8; a > 0; a--) {
|
31 | // SDC_CLK = 0; // 380 ns
|
32 | GPIOPinWrite (GPIO_PORTA_BASE, SPI0_CLK, 0);
|
33 | // wait_usec (1);
|
34 | for (i=0;i<20;i++);
|
35 | // SDC_DO = (dat & (1 << (a - 1))) ? 1 : 0; // 540 ns
|
36 | GPIOPinWrite (GPIO_PORTA_BASE, SPI0_MOSI, (c & (1 << (a - 1))) ? 1 : 0);// SDC_CLK = 1; // 200 ns
|
37 | GPIOPinWrite (GPIO_PORTA_BASE, SPI0_CLK, 1);
|
38 | // wait_usec (1);
|
39 | for (i=0;i<200;i++);
|
40 | }
|
41 | // SDC_CLK = 0;
|
42 | GPIOPinWrite (GPIO_PORTA_BASE, SPI0_CLK, 0);
|
43 | // SDC_DI = 1;
|
44 | GPIOPinWrite (GPIO_PORTA_BASE, SPI0_MOSI, 1);
|
45 |
|
46 | #else
|
47 | SSIDataPut (SSI0_BASE, c);
|
48 | #endif
|
49 |
|
50 | #elif UART
|
51 |
|
52 | #endif
|
53 | }
|
54 |
|
55 | char read_char (void) {
|
56 | volatile unsigned char dat;
|
57 | // unsigned long uldat;
|
58 | volatile unsigned int a, b;
|
59 |
|
60 | a = 0;
|
61 | b = 0;
|
62 | uldat = 0xff;
|
63 | dat = 0;
|
64 |
|
65 | #ifdef SPI
|
66 | SSIDataPut (SSI0_BASE, 0x55);
|
67 | SSIDataGet (SSI0_BASE, &uldat);
|
68 | #elif UART
|
69 |
|
70 | #endif
|
71 |
|
72 | // zwei Dummy Befehle
|
73 | a = a + 6;
|
74 | b = a + 8;
|
75 | // Wenn diese beiden Dummy Befehle eingefügt werden, sehe ich das
|
76 | // Acknowledge nach dem nachfolgenden Befehl "dat = ..."
|
77 |
|
78 | dat = (unsigned char)uldat;
|
79 | return (dat);
|
80 | } // ohne Dummy-Befehle sehe ich hier die 0x06 im SPI Empfangsregister
|
81 |
|
82 | char acknowledge (void) {
|
83 | char ack;
|
84 | volatile unsigned int i;
|
85 |
|
86 | for (i = 0; i < 100; i++) {
|
87 | }
|
88 |
|
89 | ack = read_char ();
|
90 | return (ack);
|
91 | }
|
92 |
|
93 | char write_cmd (char *cmd) {
|
94 | char ack;
|
95 | unsigned char i;
|
96 |
|
97 | // CS_LOW;
|
98 | GPIOPinWrite (GPIO_PORTA_BASE, SPI0_CS, 0);
|
99 |
|
100 | for (i = 0; i < (cmd[1] + 3); i++) {
|
101 | write_char (cmd[i]);
|
102 | }
|
103 |
|
104 | // ack = acknowledge ();
|
105 | ack = read_char ();
|
106 |
|
107 | // CS_HIGH;
|
108 | GPIOPinWrite (GPIO_PORTA_BASE, SPI0_CS, SPI0_CS);
|
109 |
|
110 | return ack;
|
111 | }
|