Skip to content

Commit 16b63ba

Browse files
committed
Merge pull request #275 from dbestm/master
[NUCLEO_F030R8] add more pins for I2C, SPI, ADC
2 parents 99a8b21 + 5b12db1 commit 16b63ba

File tree

3 files changed

+96
-38
lines changed

3 files changed

+96
-38
lines changed

libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F030R8/analogin_api.c

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,20 @@
3737
static const PinMap PinMap_ADC[] = {
3838
{PA_0, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN0
3939
{PA_1, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN1
40+
{PA_2, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN2
41+
{PA_3, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN3
4042
{PA_4, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN4
43+
{PA_5, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN5
44+
{PA_6, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN6
45+
{PA_7, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN7
4146
{PB_0, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN8
42-
{PC_1, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN11
47+
{PB_1, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN9
4348
{PC_0, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN10
49+
{PC_1, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN11
50+
{PC_2, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN12
51+
{PC_3, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN13
52+
{PC_4, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN14
53+
{PC_5, ADC_1, STM_PIN_DATA(GPIO_Mode_AN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF)}, // ADC_IN15
4454
{NC, NC, 0}
4555
};
4656

@@ -105,18 +115,48 @@ static inline uint16_t adc_read(analogin_t *obj) {
105115
case PA_1:
106116
ADC_ChannelConfig(adc, ADC_Channel_1, ADC_SampleTime_7_5Cycles);
107117
break;
118+
case PA_2:
119+
ADC_ChannelConfig(adc, ADC_Channel_2, ADC_SampleTime_7_5Cycles);
120+
break;
121+
case PA_3:
122+
ADC_ChannelConfig(adc, ADC_Channel_3, ADC_SampleTime_7_5Cycles);
123+
break;
108124
case PA_4:
109125
ADC_ChannelConfig(adc, ADC_Channel_4, ADC_SampleTime_7_5Cycles);
110126
break;
127+
case PA_5:
128+
ADC_ChannelConfig(adc, ADC_Channel_5, ADC_SampleTime_7_5Cycles);
129+
break;
130+
case PA_6:
131+
ADC_ChannelConfig(adc, ADC_Channel_6, ADC_SampleTime_7_5Cycles);
132+
break;
133+
case PA_7:
134+
ADC_ChannelConfig(adc, ADC_Channel_7, ADC_SampleTime_7_5Cycles);
135+
break;
111136
case PB_0:
112137
ADC_ChannelConfig(adc, ADC_Channel_8, ADC_SampleTime_7_5Cycles);
113138
break;
114-
case PC_1:
115-
ADC_ChannelConfig(adc, ADC_Channel_11, ADC_SampleTime_7_5Cycles);
139+
case PB_1:
140+
ADC_ChannelConfig(adc, ADC_Channel_9, ADC_SampleTime_7_5Cycles);
116141
break;
117142
case PC_0:
118143
ADC_ChannelConfig(adc, ADC_Channel_10, ADC_SampleTime_7_5Cycles);
119144
break;
145+
case PC_1:
146+
ADC_ChannelConfig(adc, ADC_Channel_11, ADC_SampleTime_7_5Cycles);
147+
break;
148+
case PC_2:
149+
ADC_ChannelConfig(adc, ADC_Channel_12, ADC_SampleTime_7_5Cycles);
150+
break;
151+
case PC_3:
152+
ADC_ChannelConfig(adc, ADC_Channel_13, ADC_SampleTime_7_5Cycles);
153+
break;
154+
case PC_4:
155+
ADC_ChannelConfig(adc, ADC_Channel_14, ADC_SampleTime_7_5Cycles);
156+
break;
157+
case PC_5:
158+
ADC_ChannelConfig(adc, ADC_Channel_15, ADC_SampleTime_7_5Cycles);
159+
break;
120160
default:
121161
return 0;
122162
}

libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F030R8/i2c_api.c

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,16 @@
4242
#define LONG_TIMEOUT ((int)0x8000)
4343

4444
static const PinMap PinMap_I2C_SDA[] = {
45+
{PB_7, I2C_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_OD, GPIO_PuPd_UP, GPIO_AF_1)},
4546
{PB_9, I2C_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_OD, GPIO_PuPd_UP, GPIO_AF_1)},
47+
{PB_11, I2C_2, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_OD, GPIO_PuPd_UP, GPIO_AF_1)},
4648
{NC, NC, 0}
4749
};
4850

4951
static const PinMap PinMap_I2C_SCL[] = {
52+
{PB_6, I2C_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_OD, GPIO_PuPd_UP, GPIO_AF_1)},
5053
{PB_8, I2C_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_OD, GPIO_PuPd_UP, GPIO_AF_1)},
54+
{PB_10, I2C_2, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_OD, GPIO_PuPd_UP, GPIO_AF_1)},
5155
{NC, NC, 0}
5256
};
5357

@@ -66,9 +70,9 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
6670
if (obj->i2c == I2C_1) {
6771
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
6872
}
69-
//if (obj->i2c == I2C_2) {
70-
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
71-
//}
73+
if (obj->i2c == I2C_2) {
74+
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
75+
}
7276

7377
// Configure I2C pins
7478
pinmap_pinout(scl, PinMap_I2C_SCL);
@@ -196,39 +200,23 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
196200

197201
if (length == 0) return 0;
198202

199-
// TODO: the stop is always sent even with I2C_SoftEnd_Mode. To be corrected.
200-
201203
// Configure slave address, nbytes, reload, end mode and start or stop generation
202-
//if (stop) {
204+
if (stop) {
203205
I2C_TransferHandling(i2c, address, length, I2C_AutoEnd_Mode, I2C_Generate_Start_Write);
204-
//}
205-
//else {
206-
// I2C_TransferHandling(i2c, address, length, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
207-
//}
206+
207+
}
208+
else {
209+
I2C_TransferHandling(i2c, address, length, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
210+
}
208211

209212
// Write all bytes
210213
for (count = 0; count < length; count++) {
211214
if (i2c_byte_write(obj, data[count]) != 1) {
212-
i2c_stop(obj);
215+
if(!stop) i2c_stop(obj);
213216
return 0;
214217
}
215218
}
216219

217-
/*
218-
if (stop) {
219-
// Wait until STOPF flag is set
220-
timeout = LONG_TIMEOUT;
221-
while (I2C_GetFlagStatus(i2c, I2C_ISR_STOPF) == RESET) {
222-
timeout--;
223-
if (timeout == 0) {
224-
return 0;
225-
}
226-
}
227-
// Clear STOPF flag
228-
I2C_ClearFlag(i2c, I2C_ICR_STOPCF);
229-
}
230-
*/
231-
232220
return count;
233221
}
234222

@@ -274,10 +262,10 @@ void i2c_reset(i2c_t *obj) {
274262
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
275263
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
276264
}
277-
//if (obj->i2c == I2C_2) {
278-
// RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE);
279-
// RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE);
280-
//}
265+
if (obj->i2c == I2C_2) {
266+
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE);
267+
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE);
268+
}
281269
}
282270

283271
#if DEVICE_I2CSLAVE
@@ -286,14 +274,17 @@ void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask) {
286274
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
287275
uint16_t tmpreg;
288276

277+
// reset own address enable
278+
i2c->OAR1 &=~ I2C_OAR1_OA1EN;
279+
289280
// Get the old register value
290281
tmpreg = i2c->OAR1;
291282
// Reset address bits
292283
tmpreg &= 0xFC00;
293284
// Set new address
294285
tmpreg |= (uint16_t)((uint16_t)address & (uint16_t)0x00FE); // 7-bits
295286
// Store the new register value
296-
i2c->OAR1 = tmpreg;
287+
i2c->OAR1 = tmpreg | I2C_OAR1_OA1EN;
297288
}
298289

299290
void i2c_slave_mode(i2c_t *obj, int enable_slave) {
@@ -307,8 +298,27 @@ void i2c_slave_mode(i2c_t *obj, int enable_slave) {
307298
#define WriteAddressed 3 // the master is writing to this slave (slave = receiver)
308299

309300
int i2c_slave_receive(i2c_t *obj) {
310-
// TO BE DONE
311-
return(0);
301+
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
302+
int event = 0;
303+
int timeout;
304+
305+
// Wait until address match
306+
timeout = FLAG_TIMEOUT;
307+
while (I2C_GetFlagStatus(i2c, I2C_ISR_ADDR) == RESET) {
308+
timeout--;
309+
if (timeout == 0) {
310+
return 0;
311+
}
312+
}
313+
// Check direction
314+
if (i2c->ISR & I2C_ISR_DIR) {
315+
event = ReadAddressed;
316+
}
317+
else event = WriteAddressed;
318+
// Clear adress match flag to generate an acknowledge
319+
i2c->ICR |= I2C_ICR_ADDRCF;
320+
321+
return event;
312322
}
313323

314324
int i2c_slave_read(i2c_t *obj, char *data, int length) {

libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F030R8/spi_api.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,22 +38,30 @@
3838

3939
static const PinMap PinMap_SPI_MOSI[] = {
4040
{PA_7, SPI_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_0)},
41+
{PB_5, SPI_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_0)},
42+
{PB_15, SPI_2, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_0)},
4143
{NC, NC, 0}
4244
};
4345

4446
static const PinMap PinMap_SPI_MISO[] = {
4547
{PA_6, SPI_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_0)},
48+
{PB_4, SPI_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_0)},
49+
{PB_14, SPI_2, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_0)},
4650
{NC, NC, 0}
4751
};
4852

4953
static const PinMap PinMap_SPI_SCLK[] = {
5054
{PA_5, SPI_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_0)},
55+
{PB_3, SPI_1, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_0)},
56+
{PB_13, SPI_2, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_0)},
5157
{NC, NC, 0}
5258
};
5359

5460
// Only used in Slave mode
5561
static const PinMap PinMap_SPI_SSEL[] = {
56-
{PB_6, SPI_1, STM_PIN_DATA(GPIO_Mode_IN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0)}, // Generic IO, not real H/W NSS pin
62+
{PA_4, SPI_1, STM_PIN_DATA(GPIO_Mode_IN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0)},
63+
{PA_15, SPI_1, STM_PIN_DATA(GPIO_Mode_IN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0)},
64+
{PB_12, SPI_2, STM_PIN_DATA(GPIO_Mode_IN, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0)},
5765
{NC, NC, 0}
5866
};
5967

@@ -121,7 +129,7 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
121129
else { // Slave
122130
pinmap_pinout(ssel, PinMap_SPI_SSEL);
123131
obj->mode = SPI_Mode_Slave;
124-
obj->nss = SPI_NSS_Soft;
132+
obj->nss = SPI_NSS_Hard;
125133
}
126134

127135
init_spi(obj);

0 commit comments

Comments
 (0)