1 | /** I N C L U D E S **********************************************************/
|
2 | #include "main.h"
|
3 | #include "hcpl-0872.h"
|
4 | #include "spi.h"
|
5 |
|
6 |
|
7 | volatile signed int ad_wert1[3];
|
8 | volatile signed int signed_ad_wert[3];
|
9 |
|
10 |
|
11 | void HCPL_0872_Init(void)
|
12 | {
|
13 | int config1, config2, config3;
|
14 |
|
15 | /* SPI1 befehle-konfigurieren, in Mater Mode, CLK von Master 10MHZ, SS off, SDO on,
|
16 | SDI NC */
|
17 | config1 = ENABLE_SCK_PIN &
|
18 | ENABLE_SDO_PIN & //ENABLE_SDO_PIN
|
19 | SPI_MODE16_OFF& //SPI_MODE16_OFF
|
20 | SPI_SMP_OFF & //SPI_SMP_OFF
|
21 | SPI_CKE_ON & //SPI_CKE_ON
|
22 | SLAVE_ENABLE_OFF &
|
23 | CLK_POL_ACTIVE_HIGH & //CLK_POL_ACTIVE_HIGH
|
24 | MASTER_ENABLE_ON &
|
25 | SEC_PRESCAL_4_1 &
|
26 | PRI_PRESCAL_4_1;
|
27 |
|
28 | config2 = FRAME_ENABLE_OFF &
|
29 | FRAME_SYNC_OUTPUT &
|
30 | FRAME_POL_ACTIVE_HIGH &
|
31 | FRAME_SYNC_EDGE_COINCIDE &
|
32 | FIFO_BUFFER_ENABLE;
|
33 |
|
34 | config3 = SPI_ENABLE &
|
35 | SPI_IDLE_CON &
|
36 | SPI_RX_OVFLOW_CLR;
|
37 |
|
38 | OpenSPI1(config1, config2, config3);
|
39 |
|
40 |
|
41 | CS=1;
|
42 | SS_CLAT=1;
|
43 |
|
44 |
|
45 | HCPL_reset = 0;
|
46 | delay_ms(10);
|
47 | HCPL_reset = 1;
|
48 | delay_ms(10);
|
49 | HCPL_reset = 0;
|
50 | delay_ms(10);
|
51 |
|
52 |
|
53 | }
|
54 |
|
55 |
|
56 | void HCPL_0872_config (void)
|
57 | {
|
58 | unsigned int buffer;
|
59 |
|
60 |
|
61 | SS_CLAT=1;
|
62 | delay_us(100);
|
63 |
|
64 |
|
65 | SS_CLAT=0;
|
66 | delay_us(1); //Setup Time from Data (min 200ns)
|
67 | WriteSPI1(0b01011001); //V phase, Conversion MODE1, Offset
|
68 | while (!SPI1STATbits.SPIRBF);
|
69 | buffer = SPI1BUF;
|
70 | SS_CLAT=1;
|
71 |
|
72 | HCPL_0872_read(V_phase);
|
73 |
|
74 | SS_CLAT=0;
|
75 | delay_us(1); //Setup Time from Data (min 200ns)
|
76 | WriteSPI1(0b11000001); //V phase, Set Conversion MODE4
|
77 | while (!SPI1STATbits.SPIRBF);
|
78 | buffer = SPI1BUF;
|
79 | SS_CLAT=1;
|
80 |
|
81 |
|
82 | SS_CLAT=0;
|
83 | delay_us(1); //Setup Time from Data (min 200ns)
|
84 | WriteSPI1(0b01011000); //U phase, Conversion MODE1, Offset
|
85 | while (!SPI1STATbits.SPIRBF);
|
86 | buffer = SPI1BUF;
|
87 | SS_CLAT=1;
|
88 |
|
89 | HCPL_0872_read(U_phase);
|
90 |
|
91 | SS_CLAT=0;
|
92 | delay_us(1); //Setup Time from Data (min 200ns)
|
93 | WriteSPI1(0b11000000); //U phase, Set Conversion MODE4
|
94 | while (!SPI1STATbits.SPIRBF);
|
95 | buffer = SPI1BUF;
|
96 | SS_CLAT=1;
|
97 |
|
98 |
|
99 |
|
100 |
|
101 |
|
102 | // WriteSPI1(0b01010000); //Conversion MODE1
|
103 | // WriteSPI1(0b00110000); //Conversion MODE2
|
104 | // WriteSPI1(0b11100000); //Conversion MODE3
|
105 | // WriteSPI1(0b11000000); //Conversion MODE4
|
106 | // WriteSPI1(0b10100000); //Conversion MODE5
|
107 |
|
108 |
|
109 | // WriteSPI1(0b00000011); //Pretrigger MODE0
|
110 | // WriteSPI1(0b01000011); //Pretrigger MODE1
|
111 | // WriteSPI1(0b11000011); //Pretrigger MODE2
|
112 |
|
113 | }
|
114 |
|
115 |
|
116 |
|
117 | void HCPL_0872_read (unsigned int channel)
|
118 | {
|
119 | unsigned int i=0,j=0;
|
120 | signed long temp[2];
|
121 |
|
122 | UV_select = channel;
|
123 | delay_us(1); //Setup Time from CHAN (min 20ns)
|
124 |
|
125 | CS=0;
|
126 | delay_us(1); //Setup Time from Data (min 200ns)
|
127 |
|
128 | #if defined YASKAWA_TESTADAPTER_CIMR
|
129 | while (!SDATA_HIGH) //wait for SDATA High
|
130 | {if (i > 250) break; i++;}
|
131 | SPI2BUF = 0x0000;
|
132 |
|
133 | while (!SPI2STATbits.SPIRBF)
|
134 | {if (j > 250) break; j++;}
|
135 |
|
136 | #elif defined YASKAWA_TESTADAPTER_SGDH
|
137 | while (!SDATA_HIGH) {if (i > 250) break; i++;} //wait for SDATA High
|
138 | SPI2BUF = 0x0000;
|
139 |
|
140 | while (!SPI2STATbits.SPIRBF);
|
141 |
|
142 | #elif defined SANYO_DENKI_TESTADAPTER
|
143 | while (!SDATA_HIGH); // {if (i > 250) break; i++;}
|
144 | SPI2BUF = 0x0000;
|
145 |
|
146 | while (!SPI2STATbits.SPIRBF);
|
147 |
|
148 | #endif
|
149 |
|
150 |
|
151 | if (channel==0)
|
152 | {
|
153 | ad_wert1[0] = SPI2BUF & 0x7FFF; // U Phase. Es werden nur 15Bits benotigt
|
154 | }
|
155 | else
|
156 | {
|
157 | ad_wert1[1] = SPI2BUF & 0x7FFF; // V Phase. Es werden nur 15Bits benotigt signed_ad_wert[1] = ((ad_wert1[0] - 16384) * 11) / 10;
|
158 | }
|
159 |
|
160 | CS=1;
|
161 |
|
162 |
|
163 | #if defined SANYO_DENKI_TESTADAPTER
|
164 |
|
165 | switch(Sanyo_Denki_Version)
|
166 | {
|
167 | case 0:
|
168 | signed_ad_wert[0] = ((ad_wert1[0] - 16384) * 11) / 10;
|
169 | signed_ad_wert[1] = ((ad_wert1[1] - 16384) * 11) / 10;
|
170 | break;
|
171 |
|
172 | case 1:
|
173 | signed_ad_wert[0] = ((ad_wert1[0] - 16384) * 22) / 10;
|
174 | signed_ad_wert[1] = ((ad_wert1[1] - 16384) * 22) / 10;
|
175 | break;
|
176 |
|
177 | default:
|
178 | break;
|
179 | }
|
180 | #else
|
181 | signed_ad_wert[0] = ((80000/16384) * (ad_wert1[0] - 16384));
|
182 | signed_ad_wert[1] = ((80000/16384) * (ad_wert1[1] - 16384));
|
183 | #endif
|
184 |
|
185 | QF_INT_UNLOCK(); //Interrupt einschalten
|
186 |
|
187 | }
|