Skip to content

Commit 732b1a5

Browse files
committed
add KIT EPC9186
1 parent 67194b5 commit 732b1a5

File tree

4 files changed

+558
-0
lines changed

4 files changed

+558
-0
lines changed

hwconf/ipm/EPC9186/hw_EPC9186.c

Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,246 @@
1+
/*
2+
Copyright 2019 Benjamin Vedder [email protected]
3+
4+
This program is free software: you can redistribute it and/or modify
5+
it under the terms of the GNU General Public License as published by
6+
the Free Software Foundation, either version 3 of the License, or
7+
(at your option) any later version.
8+
9+
This program is distributed in the hope that it will be useful,
10+
but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
GNU General Public License for more details.
13+
14+
You should have received a copy of the GNU General Public License
15+
along with this program. If not, see <http://www.gnu.org/licenses/>.
16+
*/
17+
18+
#include "hw.h"
19+
20+
#include "ch.h"
21+
#include "hal.h"
22+
#include "stm32f4xx_conf.h"
23+
// #include "utils.h"
24+
#include "utils_math.h"
25+
// #include <math.h>
26+
// #include "mc_interface.h"
27+
28+
// Variables
29+
static volatile bool i2c_running = false;
30+
31+
// I2C configuration
32+
static const I2CConfig i2cfg = {
33+
OPMODE_I2C,
34+
100000,
35+
STD_DUTY_CYCLE
36+
};
37+
38+
void hw_init_gpio(void) {
39+
// GPIO clock enable
40+
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
41+
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
42+
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
43+
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
44+
45+
// LEDs
46+
palSetPadMode(GPIOB, 0,
47+
PAL_MODE_OUTPUT_PUSHPULL |
48+
PAL_STM32_OSPEED_HIGHEST);
49+
palSetPadMode(GPIOB, 1,
50+
PAL_MODE_OUTPUT_PUSHPULL |
51+
PAL_STM32_OSPEED_HIGHEST);
52+
53+
// GPIOA Configuration: Channel 1 to 3 as alternate function push-pull
54+
palSetPadMode(GPIOA, 8, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
55+
PAL_STM32_OSPEED_HIGHEST |
56+
PAL_STM32_PUDR_FLOATING);
57+
palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
58+
PAL_STM32_OSPEED_HIGHEST |
59+
PAL_STM32_PUDR_FLOATING);
60+
palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
61+
PAL_STM32_OSPEED_HIGHEST |
62+
PAL_STM32_PUDR_FLOATING);
63+
64+
palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
65+
PAL_STM32_OSPEED_HIGHEST |
66+
PAL_STM32_PUDR_FLOATING);
67+
palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
68+
PAL_STM32_OSPEED_HIGHEST |
69+
PAL_STM32_PUDR_FLOATING);
70+
palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
71+
PAL_STM32_OSPEED_HIGHEST |
72+
PAL_STM32_PUDR_FLOATING);
73+
74+
// Hall sensors
75+
palSetPadMode(HW_HALL_ENC_GPIO1, HW_HALL_ENC_PIN1, PAL_MODE_INPUT_PULLUP);
76+
palSetPadMode(HW_HALL_ENC_GPIO2, HW_HALL_ENC_PIN2, PAL_MODE_INPUT_PULLUP);
77+
palSetPadMode(HW_HALL_ENC_GPIO3, HW_HALL_ENC_PIN3, PAL_MODE_INPUT_PULLUP);
78+
79+
// nFault pin
80+
palSetPadMode(GPIOB, 7, PAL_MODE_INPUT_PULLUP);
81+
82+
// // Phase filters
83+
// palSetPadMode(PHASE_FILTER_GPIO, PHASE_FILTER_PIN,
84+
// PAL_MODE_OUTPUT_PUSHPULL |
85+
// PAL_STM32_OSPEED_HIGHEST);
86+
// PHASE_FILTER_OFF();
87+
88+
// // Current filter
89+
// palSetPadMode(GPIOD, 2,
90+
// PAL_MODE_OUTPUT_PUSHPULL |
91+
// PAL_STM32_OSPEED_HIGHEST);
92+
93+
// CURRENT_FILTER_OFF();
94+
95+
// // AUX pin
96+
// AUX_OFF();
97+
// palSetPadMode(AUX_GPIO, AUX_PIN,
98+
// PAL_MODE_OUTPUT_PUSHPULL |
99+
// PAL_STM32_OSPEED_HIGHEST);
100+
101+
// ADC Pins
102+
palSetPadMode(GPIOA, 0, PAL_MODE_INPUT_ANALOG);
103+
palSetPadMode(GPIOA, 1, PAL_MODE_INPUT_ANALOG);
104+
palSetPadMode(GPIOA, 2, PAL_MODE_INPUT_ANALOG);
105+
palSetPadMode(GPIOA, 3, PAL_MODE_INPUT_ANALOG);
106+
palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG);
107+
palSetPadMode(GPIOA, 6, PAL_MODE_INPUT_ANALOG);
108+
109+
palSetPadMode(GPIOC, 0, PAL_MODE_INPUT_ANALOG);
110+
palSetPadMode(GPIOC, 1, PAL_MODE_INPUT_ANALOG);
111+
palSetPadMode(GPIOC, 2, PAL_MODE_INPUT_ANALOG);
112+
palSetPadMode(GPIOC, 3, PAL_MODE_INPUT_ANALOG);
113+
palSetPadMode(GPIOC, 4, PAL_MODE_INPUT_ANALOG);
114+
palSetPadMode(GPIOC, 5, PAL_MODE_INPUT_ANALOG);
115+
}
116+
117+
void hw_setup_adc_channels(void) {
118+
// ADC1 regular channels
119+
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_15Cycles );
120+
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 2, ADC_SampleTime_15Cycles );
121+
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 3, ADC_SampleTime_15Cycles );
122+
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 4, ADC_SampleTime_15Cycles );
123+
ADC_RegularChannelConfig(ADC1, ADC_Channel_Vrefint, 5, ADC_SampleTime_15Cycles );
124+
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 6, ADC_SampleTime_15Cycles );
125+
126+
// ADC2 regular channels
127+
ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_15Cycles );
128+
ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 2, ADC_SampleTime_15Cycles );
129+
ADC_RegularChannelConfig(ADC2, ADC_Channel_6, 3, ADC_SampleTime_15Cycles );
130+
ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 4, ADC_SampleTime_15Cycles );
131+
ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 5, ADC_SampleTime_15Cycles );
132+
ADC_RegularChannelConfig(ADC2, ADC_Channel_9, 6, ADC_SampleTime_15Cycles );
133+
134+
// ADC3 regular channels
135+
ADC_RegularChannelConfig(ADC3, ADC_Channel_2, 1, ADC_SampleTime_15Cycles );
136+
ADC_RegularChannelConfig(ADC3, ADC_Channel_12, 2, ADC_SampleTime_15Cycles );
137+
ADC_RegularChannelConfig(ADC3, ADC_Channel_3, 3, ADC_SampleTime_15Cycles );
138+
ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 4, ADC_SampleTime_15Cycles );
139+
ADC_RegularChannelConfig(ADC3, ADC_Channel_1, 5, ADC_SampleTime_15Cycles );
140+
ADC_RegularChannelConfig(ADC3, ADC_Channel_2, 6, ADC_SampleTime_15Cycles );
141+
142+
// Injected channels
143+
ADC_InjectedChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_15Cycles );
144+
ADC_InjectedChannelConfig(ADC2, ADC_Channel_11, 1, ADC_SampleTime_15Cycles );
145+
ADC_InjectedChannelConfig(ADC3, ADC_Channel_12, 1, ADC_SampleTime_15Cycles );
146+
ADC_InjectedChannelConfig(ADC1, ADC_Channel_10, 2, ADC_SampleTime_15Cycles );
147+
ADC_InjectedChannelConfig(ADC2, ADC_Channel_11, 2, ADC_SampleTime_15Cycles );
148+
ADC_InjectedChannelConfig(ADC3, ADC_Channel_12, 2, ADC_SampleTime_15Cycles );
149+
ADC_InjectedChannelConfig(ADC1, ADC_Channel_10, 3, ADC_SampleTime_15Cycles );
150+
ADC_InjectedChannelConfig(ADC2, ADC_Channel_11, 3, ADC_SampleTime_15Cycles );
151+
ADC_InjectedChannelConfig(ADC3, ADC_Channel_12, 3, ADC_SampleTime_15Cycles );
152+
}
153+
154+
void hw_start_i2c(void) {
155+
i2cAcquireBus(&HW_I2C_DEV);
156+
157+
if (!i2c_running) {
158+
palSetPadMode(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN,
159+
PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) |
160+
PAL_STM32_OTYPE_OPENDRAIN |
161+
PAL_STM32_OSPEED_MID1 |
162+
PAL_STM32_PUDR_PULLUP);
163+
palSetPadMode(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN,
164+
PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) |
165+
PAL_STM32_OTYPE_OPENDRAIN |
166+
PAL_STM32_OSPEED_MID1 |
167+
PAL_STM32_PUDR_PULLUP);
168+
169+
i2cStart(&HW_I2C_DEV, &i2cfg);
170+
i2c_running = true;
171+
}
172+
173+
i2cReleaseBus(&HW_I2C_DEV);
174+
}
175+
176+
void hw_stop_i2c(void) {
177+
i2cAcquireBus(&HW_I2C_DEV);
178+
179+
if (i2c_running) {
180+
palSetPadMode(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN, PAL_MODE_INPUT);
181+
palSetPadMode(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN, PAL_MODE_INPUT);
182+
183+
i2cStop(&HW_I2C_DEV);
184+
i2c_running = false;
185+
186+
}
187+
188+
i2cReleaseBus(&HW_I2C_DEV);
189+
}
190+
191+
/**
192+
* Try to restore the i2c bus
193+
*/
194+
void hw_try_restore_i2c(void) {
195+
if (i2c_running) {
196+
i2cAcquireBus(&HW_I2C_DEV);
197+
198+
palSetPadMode(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN,
199+
PAL_STM32_OTYPE_OPENDRAIN |
200+
PAL_STM32_OSPEED_MID1 |
201+
PAL_STM32_PUDR_PULLUP);
202+
203+
palSetPadMode(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN,
204+
PAL_STM32_OTYPE_OPENDRAIN |
205+
PAL_STM32_OSPEED_MID1 |
206+
PAL_STM32_PUDR_PULLUP);
207+
208+
palSetPad(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN);
209+
palSetPad(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN);
210+
211+
chThdSleep(1);
212+
213+
for(int i = 0; i < 16; i++) {
214+
palClearPad(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN);
215+
chThdSleep(1);
216+
palSetPad(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN);
217+
chThdSleep(1);
218+
}
219+
220+
// Generate start then stop condition
221+
palClearPad(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN);
222+
chThdSleep(1);
223+
palClearPad(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN);
224+
chThdSleep(1);
225+
palSetPad(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN);
226+
chThdSleep(1);
227+
palSetPad(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN);
228+
229+
palSetPadMode(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN,
230+
PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) |
231+
PAL_STM32_OTYPE_OPENDRAIN |
232+
PAL_STM32_OSPEED_MID1 |
233+
PAL_STM32_PUDR_PULLUP);
234+
235+
palSetPadMode(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN,
236+
PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) |
237+
PAL_STM32_OTYPE_OPENDRAIN |
238+
PAL_STM32_OSPEED_MID1 |
239+
PAL_STM32_PUDR_PULLUP);
240+
241+
HW_I2C_DEV.state = I2C_STOP;
242+
i2cStart(&HW_I2C_DEV, &i2cfg);
243+
244+
i2cReleaseBus(&HW_I2C_DEV);
245+
}
246+
}

0 commit comments

Comments
 (0)