Forum: Mikrocontroller und Digitale Elektronik STM32 HAL_SPI Problem: MOSI immer HIGH


von Stefan (Gast)


Lesenswert?

Hi,

ich arbeite mit CubeMX und Atollic TrueSTUDIO. Jetzt würde ich gerne per 
SPI einen MCP23S17 ansteuern. Leider gibt es Probleme mit dem SPI. 
Dieser ist über QubeMX komplett initialisiert (wenn ihr da infos 
benötigt reiche ich sie nach.)
Meine while{1} sieht folgendermaßen aus:
1
C-Code
2
  while (1)
3
  {
4
      uint8_t eins = 0xAA;
5
      uint8_t zwei = 0xAA;
6
      HAL_GPIO_WritePin(GPIOA,CS_EXP_Pin,0);
7
      HAL_SPI_TransmitReceive(&hspi1, &eins, &zwei, 1, 100);
8
      HAL_GPIO_WritePin(GPIOA,CS_EXP_Pin,1);
9
      HAL_Delay(1);
10
  }

Auf dem Oszi sehe ich den Takt der SCK Leitung aber MOSI bleibt immer 
auf HIGH egal was ich mache. Ich hab mittlerweile einiges probiert und 
gesucht aber bleibe ratlos.

Hier scheint jemand das selbe Problem gehabt zu haben. Leider ohne 
Lösung:
https://electronics.stackexchange.com/questions/274669/stm32-spi-cant-get-it-working

Ich hoffe mir kann hier Jemand weiterhelfen :-)

von Jim M. (turboj)


Lesenswert?

Der Fehler liegt im nicht geposteten Teil des Codes.

Schaltplan wäre auch nicht schlecht - manchmal vertut man sich mit den 
Pins.

von Max D. (max_d)


Lesenswert?

MISO = Mast In Slave Out
-> Wird vom Slave bedient.
Solange der STM den nicht high zwingt (abstecken probiert ?) hat der 
relativ wenig einfluss auf den traffic...

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Dann hier mal noch die durch CubeMX erstellten Funktionen:
1
static void MX_SPI1_Init(void)
2
{
3
4
  /* USER CODE BEGIN SPI1_Init 0 */
5
6
  /* USER CODE END SPI1_Init 0 */
7
8
  /* USER CODE BEGIN SPI1_Init 1 */
9
10
  /* USER CODE END SPI1_Init 1 */
11
  /* SPI1 parameter configuration*/
12
  hspi1.Instance = SPI1;
13
  hspi1.Init.Mode = SPI_MODE_MASTER;
14
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
15
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
16
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
17
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
18
  hspi1.Init.NSS = SPI_NSS_SOFT;
19
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
20
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
21
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
22
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
23
  hspi1.Init.CRCPolynomial = 10;
24
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
25
  {
26
    Error_Handler();
27
  }
28
  /* USER CODE BEGIN SPI1_Init 2 */
29
30
  /* USER CODE END SPI1_Init 2 */
31
32
}

In HAL_SPI_Init wird dann HAL_SPI_MspInit Aufgerufen.
1
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
2
{
3
4
  GPIO_InitTypeDef GPIO_InitStruct = {0};
5
  if(hspi->Instance==SPI1)
6
  {
7
  /* USER CODE BEGIN SPI1_MspInit 0 */
8
9
  /* USER CODE END SPI1_MspInit 0 */
10
    /* Peripheral clock enable */
11
    __HAL_RCC_SPI1_CLK_ENABLE();
12
  
13
    __HAL_RCC_GPIOB_CLK_ENABLE();
14
    /**SPI1 GPIO Configuration    
15
    PB3     ------> SPI1_SCK
16
    PB4     ------> SPI1_MISO
17
    PB5     ------> SPI1_MOSI 
18
    */
19
    GPIO_InitStruct.Pin = SCK_Pin|MOSI_Pin;
20
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
21
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
22
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
23
24
    GPIO_InitStruct.Pin = MISO_Pin;
25
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
26
    GPIO_InitStruct.Pull = GPIO_PULLUP;
27
    HAL_GPIO_Init(MISO_GPIO_Port, &GPIO_InitStruct);
28
29
    __HAL_AFIO_REMAP_SPI1_ENABLE();
30
31
  /* USER CODE BEGIN SPI1_MspInit 1 */
32
33
  /* USER CODE END SPI1_MspInit 1 */
34
  }
35
36
}

MX_SPI1_Init wird in der main aufgerufen und auch durchlaufen das hab 
ich per Debugger angeschaut. Der Schaltplan und das Layout müsste 
richtig sein hab ich mehrfach überprüft. Ich mess mim Oszi. auch direkt 
am µC Pin.

von Stefan (Gast)


Lesenswert?

Max D. schrieb:
> MISO = Mast In Slave Out

Es geht um MOSI nicht um MISO . Der Master sprich der µC müsste auf MOSI 
etwas senden tut dies aber nicht. Die Leitung ist immer HIGH. (Einen 
Kurzschluss oder so kann ich ausschließen. Wenn ich den Pin anstatt als 
SPI MOSI als GPIO deklariere kann ich ihn toggeln. Als der Pin an sich 
lässt sich durch den µC Ansteuern)

von John Doe (Gast)


Lesenswert?

Stefan schrieb:
>     GPIO_InitStruct.Pin = MISO_Pin;
>     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
>     GPIO_InitStruct.Pull = GPIO_PULLUP;
>     HAL_GPIO_Init(MISO_GPIO_Port, &GPIO_InitStruct);


MISO muss auch AF sein.

von Stefan (Gast)


Lesenswert?

John Doe schrieb:
> MISO muss auch AF sein.

Wie schon oben geschrieben es geht um MOSI nicht um MISO die 
Initialisierung von MISO kommt aus QubeMX ich vermute einfach mal das 
das richtig ist. Habs auch mal in AF geändert hat keinen Einfluss auf 
den nicht funktionierenden MOSI

von Stefan (Gast)


Lesenswert?

Nachtrag:

Wenn ich in CubeMC anstatt PB3-PB5 PA5-PA7 verwende für den SPI1 und 
dort an den Pins messe dann passt alles. Das Problem wird also etwas bei 
dem generierten Code sein.

von Jim M. (turboj)


Lesenswert?

Stefan schrieb:
> Wenn ich in CubeMC anstatt PB3-PB5 PA5-PA7 verwende für den SPI1 und
> dort an den Pins messe dann passt alles

Dann greift sich also jemand anderes den PBx Pin. Deshalb wollte ich 
oben den kompletten Source gepostet sehen. Ist das denn soo schwer zu 
verstehen...?

von Stefan (Gast)


Lesenswert?

Mit hal Treiber sind das halt einige Include files. Hier erst mal das 
komplette main.c
welche noch?
1
/* USER CODE BEGIN Header */
2
/**
3
  ******************************************************************************
4
  * @file           : main.c
5
  * @brief          : Main program body
6
  ******************************************************************************
7
  ** This notice applies to any and all portions of this file
8
  * that are not between comment pairs USER CODE BEGIN and
9
  * USER CODE END. Other portions of this file, whether 
10
  * inserted by the user or by software development tools
11
  * are owned by their respective copyright owners.
12
  *
13
  * COPYRIGHT(c) 2019 STMicroelectronics
14
  *
15
  * Redistribution and use in source and binary forms, with or without modification,
16
  * are permitted provided that the following conditions are met:
17
  *   1. Redistributions of source code must retain the above copyright notice,
18
  *      this list of conditions and the following disclaimer.
19
  *   2. Redistributions in binary form must reproduce the above copyright notice,
20
  *      this list of conditions and the following disclaimer in the documentation
21
  *      and/or other materials provided with the distribution.
22
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
23
  *      may be used to endorse or promote products derived from this software
24
  *      without specific prior written permission.
25
  *
26
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
30
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
34
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
  *
37
  ******************************************************************************
38
  */
39
/* USER CODE END Header */
40
41
/* Includes ------------------------------------------------------------------*/
42
#include "main.h"
43
44
/* Private includes ----------------------------------------------------------*/
45
/* USER CODE BEGIN Includes */
46
#include "PCA9685.h"
47
#include "MCP23S17.h"
48
#include "nextion.h"
49
#include "pwm.h"
50
/* USER CODE END Includes */
51
52
/* Private typedef -----------------------------------------------------------*/
53
/* USER CODE BEGIN PTD */
54
55
/* USER CODE END PTD */
56
57
/* Private define ------------------------------------------------------------*/
58
/* USER CODE BEGIN PD */
59
60
/* USER CODE END PD */
61
62
/* Private macro -------------------------------------------------------------*/
63
/* USER CODE BEGIN PM */
64
65
/* USER CODE END PM */
66
67
/* Private variables ---------------------------------------------------------*/
68
ADC_HandleTypeDef hadc1;
69
ADC_HandleTypeDef hadc2;
70
71
CAN_HandleTypeDef hcan;
72
73
I2C_HandleTypeDef hi2c1;
74
75
SPI_HandleTypeDef hspi1;
76
77
TIM_HandleTypeDef htim3;
78
79
UART_HandleTypeDef huart1;
80
UART_HandleTypeDef huart2;
81
UART_HandleTypeDef huart3;
82
83
/* USER CODE BEGIN PV */
84
85
/* USER CODE END PV */
86
87
/* Private function prototypes -----------------------------------------------*/
88
void SystemClock_Config(void);
89
static void MX_GPIO_Init(void);
90
static void MX_ADC1_Init(void);
91
static void MX_ADC2_Init(void);
92
static void MX_I2C1_Init(void);
93
static void MX_SPI1_Init(void);
94
static void MX_USART1_UART_Init(void);
95
static void MX_USART2_UART_Init(void);
96
static void MX_USART3_UART_Init(void);
97
static void MX_CAN_Init(void);
98
static void MX_TIM3_Init(void);
99
/* USER CODE BEGIN PFP */
100
101
/* USER CODE END PFP */
102
103
/* Private user code ---------------------------------------------------------*/
104
/* USER CODE BEGIN 0 */
105
106
/* USER CODE END 0 */
107
108
/**
109
  * @brief  The application entry point.
110
  * @retval int
111
  */
112
int main(void)
113
{
114
  /* USER CODE BEGIN 1 */
115
116
  /* USER CODE END 1 */
117
118
  /* MCU Configuration--------------------------------------------------------*/
119
120
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
121
  HAL_Init();
122
123
  /* USER CODE BEGIN Init */
124
125
  /* USER CODE END Init */
126
127
  /* Configure the system clock */
128
  SystemClock_Config();
129
130
  /* USER CODE BEGIN SysInit */
131
132
  /* USER CODE END SysInit */
133
134
  /* Initialize all configured peripherals */
135
  MX_GPIO_Init();
136
  MX_ADC1_Init();
137
  MX_ADC2_Init();
138
  MX_I2C1_Init();
139
  MX_SPI1_Init();
140
  MX_USART1_UART_Init();
141
  MX_USART2_UART_Init();
142
  MX_USART3_UART_Init();
143
  MX_CAN_Init();
144
  MX_TIM3_Init();
145
  /* USER CODE BEGIN 2 */
146
//    HAL_GPIO_WritePin(GPIOA,CS_EXP_Pin,1);
147
148
  /* USER CODE END 2 */
149
150
  /* Infinite loop */
151
  /* USER CODE BEGIN WHILE */
152
  while (1)
153
  {
154
    uint8_t eins = 0xAA;
155
    HAL_GPIO_WritePin(GPIOA,CS_EXP_Pin,GPIO_PIN_RESET);
156
    HAL_SPI_Transmit(&hspi1, &eins, 1, 1);
157
    HAL_GPIO_WritePin(GPIOA,CS_EXP_Pin,GPIO_PIN_SET);
158
159
    HAL_Delay(1);
160
    /* USER CODE END WHILE */
161
162
    /* USER CODE BEGIN 3 */
163
  }
164
  /* USER CODE END 3 */
165
}
166
167
/**
168
  * @brief System Clock Configuration
169
  * @retval None
170
  */
171
void SystemClock_Config(void)
172
{
173
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
174
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
175
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
176
177
  /** Initializes the CPU, AHB and APB busses clocks 
178
  */
179
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
180
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
181
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
182
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
183
  {
184
    Error_Handler();
185
  }
186
  /** Initializes the CPU, AHB and APB busses clocks 
187
  */
188
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
189
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
190
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
191
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
192
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
193
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
194
195
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
196
  {
197
    Error_Handler();
198
  }
199
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
200
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;
201
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
202
  {
203
    Error_Handler();
204
  }
205
}
206
207
/**
208
  * @brief ADC1 Initialization Function
209
  * @param None
210
  * @retval None
211
  */
212
static void MX_ADC1_Init(void)
213
{
214
215
  /* USER CODE BEGIN ADC1_Init 0 */
216
217
  /* USER CODE END ADC1_Init 0 */
218
219
  ADC_ChannelConfTypeDef sConfig = {0};
220
221
  /* USER CODE BEGIN ADC1_Init 1 */
222
223
  /* USER CODE END ADC1_Init 1 */
224
  /** Common config 
225
  */
226
  hadc1.Instance = ADC1;
227
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
228
  hadc1.Init.ContinuousConvMode = DISABLE;
229
  hadc1.Init.DiscontinuousConvMode = DISABLE;
230
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
231
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
232
  hadc1.Init.NbrOfConversion = 1;
233
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
234
  {
235
    Error_Handler();
236
  }
237
  /** Configure Regular Channel 
238
  */
239
  sConfig.Channel = ADC_CHANNEL_0;
240
  sConfig.Rank = ADC_REGULAR_RANK_1;
241
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
242
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
243
  {
244
    Error_Handler();
245
  }
246
  /* USER CODE BEGIN ADC1_Init 2 */
247
248
  /* USER CODE END ADC1_Init 2 */
249
250
}
251
252
/**
253
  * @brief ADC2 Initialization Function
254
  * @param None
255
  * @retval None
256
  */
257
static void MX_ADC2_Init(void)
258
{
259
260
  /* USER CODE BEGIN ADC2_Init 0 */
261
262
  /* USER CODE END ADC2_Init 0 */
263
264
  ADC_ChannelConfTypeDef sConfig = {0};
265
266
  /* USER CODE BEGIN ADC2_Init 1 */
267
268
  /* USER CODE END ADC2_Init 1 */
269
  /** Common config 
270
  */
271
  hadc2.Instance = ADC2;
272
  hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;
273
  hadc2.Init.ContinuousConvMode = DISABLE;
274
  hadc2.Init.DiscontinuousConvMode = DISABLE;
275
  hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;
276
  hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
277
  hadc2.Init.NbrOfConversion = 1;
278
  if (HAL_ADC_Init(&hadc2) != HAL_OK)
279
  {
280
    Error_Handler();
281
  }
282
  /** Configure Regular Channel 
283
  */
284
  sConfig.Channel = ADC_CHANNEL_1;
285
  sConfig.Rank = ADC_REGULAR_RANK_1;
286
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
287
  if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
288
  {
289
    Error_Handler();
290
  }
291
  /* USER CODE BEGIN ADC2_Init 2 */
292
293
  /* USER CODE END ADC2_Init 2 */
294
295
}
296
297
/**
298
  * @brief CAN Initialization Function
299
  * @param None
300
  * @retval None
301
  */
302
static void MX_CAN_Init(void)
303
{
304
305
  /* USER CODE BEGIN CAN_Init 0 */
306
307
  /* USER CODE END CAN_Init 0 */
308
309
  /* USER CODE BEGIN CAN_Init 1 */
310
311
  /* USER CODE END CAN_Init 1 */
312
  hcan.Instance = CAN1;
313
  hcan.Init.Prescaler = 16;
314
  hcan.Init.Mode = CAN_MODE_NORMAL;
315
  hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
316
  hcan.Init.TimeSeg1 = CAN_BS1_1TQ;
317
  hcan.Init.TimeSeg2 = CAN_BS2_1TQ;
318
  hcan.Init.TimeTriggeredMode = DISABLE;
319
  hcan.Init.AutoBusOff = DISABLE;
320
  hcan.Init.AutoWakeUp = DISABLE;
321
  hcan.Init.AutoRetransmission = DISABLE;
322
  hcan.Init.ReceiveFifoLocked = DISABLE;
323
  hcan.Init.TransmitFifoPriority = DISABLE;
324
  if (HAL_CAN_Init(&hcan) != HAL_OK)
325
  {
326
    Error_Handler();
327
  }
328
  /* USER CODE BEGIN CAN_Init 2 */
329
330
  /* USER CODE END CAN_Init 2 */
331
332
}
333
334
/**
335
  * @brief I2C1 Initialization Function
336
  * @param None
337
  * @retval None
338
  */
339
static void MX_I2C1_Init(void)
340
{
341
342
  /* USER CODE BEGIN I2C1_Init 0 */
343
344
  /* USER CODE END I2C1_Init 0 */
345
346
  /* USER CODE BEGIN I2C1_Init 1 */
347
348
  /* USER CODE END I2C1_Init 1 */
349
  hi2c1.Instance = I2C1;
350
  hi2c1.Init.ClockSpeed = 100000;
351
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
352
  hi2c1.Init.OwnAddress1 = 0;
353
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
354
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
355
  hi2c1.Init.OwnAddress2 = 0;
356
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
357
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
358
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
359
  {
360
    Error_Handler();
361
  }
362
  /* USER CODE BEGIN I2C1_Init 2 */
363
364
  /* USER CODE END I2C1_Init 2 */
365
366
}
367
368
/**
369
  * @brief SPI1 Initialization Function
370
  * @param None
371
  * @retval None
372
  */
373
static void MX_SPI1_Init(void)
374
{
375
376
  /* USER CODE BEGIN SPI1_Init 0 */
377
378
  /* USER CODE END SPI1_Init 0 */
379
380
  /* USER CODE BEGIN SPI1_Init 1 */
381
382
  /* USER CODE END SPI1_Init 1 */
383
  /* SPI1 parameter configuration*/
384
  hspi1.Instance = SPI1;
385
  hspi1.Init.Mode = SPI_MODE_MASTER;
386
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
387
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
388
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
389
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
390
  hspi1.Init.NSS = SPI_NSS_SOFT;
391
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
392
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
393
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
394
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
395
  hspi1.Init.CRCPolynomial = 10;
396
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
397
  {
398
    Error_Handler();
399
  }
400
  /* USER CODE BEGIN SPI1_Init 2 */
401
402
  /* USER CODE END SPI1_Init 2 */
403
404
}
405
406
/**
407
  * @brief TIM3 Initialization Function
408
  * @param None
409
  * @retval None
410
  */
411
static void MX_TIM3_Init(void)
412
{
413
414
  /* USER CODE BEGIN TIM3_Init 0 */
415
416
  /* USER CODE END TIM3_Init 0 */
417
418
  TIM_MasterConfigTypeDef sMasterConfig = {0};
419
  TIM_OC_InitTypeDef sConfigOC = {0};
420
421
  /* USER CODE BEGIN TIM3_Init 1 */
422
423
  /* USER CODE END TIM3_Init 1 */
424
  htim3.Instance = TIM3;
425
  htim3.Init.Prescaler = 100;
426
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
427
  htim3.Init.Period = 0;
428
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
429
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
430
  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
431
  {
432
    Error_Handler();
433
  }
434
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
435
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
436
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
437
  {
438
    Error_Handler();
439
  }
440
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
441
  sConfigOC.Pulse = 0;
442
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
443
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
444
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
445
  {
446
    Error_Handler();
447
  }
448
  /* USER CODE BEGIN TIM3_Init 2 */
449
450
  /* USER CODE END TIM3_Init 2 */
451
  HAL_TIM_MspPostInit(&htim3);
452
453
}
454
455
/**
456
  * @brief USART1 Initialization Function
457
  * @param None
458
  * @retval None
459
  */
460
static void MX_USART1_UART_Init(void)
461
{
462
463
  /* USER CODE BEGIN USART1_Init 0 */
464
465
  /* USER CODE END USART1_Init 0 */
466
467
  /* USER CODE BEGIN USART1_Init 1 */
468
469
  /* USER CODE END USART1_Init 1 */
470
  huart1.Instance = USART1;
471
  huart1.Init.BaudRate = 9600;
472
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
473
  huart1.Init.StopBits = UART_STOPBITS_1;
474
  huart1.Init.Parity = UART_PARITY_NONE;
475
  huart1.Init.Mode = UART_MODE_TX_RX;
476
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
477
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
478
  if (HAL_UART_Init(&huart1) != HAL_OK)
479
  {
480
    Error_Handler();
481
  }
482
  /* USER CODE BEGIN USART1_Init 2 */
483
484
  /* USER CODE END USART1_Init 2 */
485
486
}
487
488
/**
489
  * @brief USART2 Initialization Function
490
  * @param None
491
  * @retval None
492
  */
493
static void MX_USART2_UART_Init(void)
494
{
495
496
  /* USER CODE BEGIN USART2_Init 0 */
497
498
  /* USER CODE END USART2_Init 0 */
499
500
  /* USER CODE BEGIN USART2_Init 1 */
501
502
  /* USER CODE END USART2_Init 1 */
503
  huart2.Instance = USART2;
504
  huart2.Init.BaudRate = 115200;
505
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
506
  huart2.Init.StopBits = UART_STOPBITS_1;
507
  huart2.Init.Parity = UART_PARITY_NONE;
508
  huart2.Init.Mode = UART_MODE_TX_RX;
509
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
510
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
511
  if (HAL_UART_Init(&huart2) != HAL_OK)
512
  {
513
    Error_Handler();
514
  }
515
  /* USER CODE BEGIN USART2_Init 2 */
516
517
  /* USER CODE END USART2_Init 2 */
518
519
}
520
521
/**
522
  * @brief USART3 Initialization Function
523
  * @param None
524
  * @retval None
525
  */
526
static void MX_USART3_UART_Init(void)
527
{
528
529
  /* USER CODE BEGIN USART3_Init 0 */
530
531
  /* USER CODE END USART3_Init 0 */
532
533
  /* USER CODE BEGIN USART3_Init 1 */
534
535
  /* USER CODE END USART3_Init 1 */
536
  huart3.Instance = USART3;
537
  huart3.Init.BaudRate = 115200;
538
  huart3.Init.WordLength = UART_WORDLENGTH_8B;
539
  huart3.Init.StopBits = UART_STOPBITS_1;
540
  huart3.Init.Parity = UART_PARITY_NONE;
541
  huart3.Init.Mode = UART_MODE_TX_RX;
542
  huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
543
  huart3.Init.OverSampling = UART_OVERSAMPLING_16;
544
  if (HAL_UART_Init(&huart3) != HAL_OK)
545
  {
546
    Error_Handler();
547
  }
548
  /* USER CODE BEGIN USART3_Init 2 */
549
550
  /* USER CODE END USART3_Init 2 */
551
552
}
553
554
/**
555
  * @brief GPIO Initialization Function
556
  * @param None
557
  * @retval None
558
  */
559
static void MX_GPIO_Init(void)
560
{
561
  GPIO_InitTypeDef GPIO_InitStruct = {0};
562
563
  /* GPIO Ports Clock Enable */
564
  __HAL_RCC_GPIOC_CLK_ENABLE();
565
  __HAL_RCC_GPIOD_CLK_ENABLE();
566
  __HAL_RCC_GPIOA_CLK_ENABLE();
567
  __HAL_RCC_GPIOB_CLK_ENABLE();
568
569
  /*Configure GPIO pin Output Level */
570
  HAL_GPIO_WritePin(GPIOB, WAKE_SW_Pin|CS_RFID_Pin|T_LED_Pin|SLEEP_Pin, GPIO_PIN_RESET);
571
572
  /*Configure GPIO pin Output Level */
573
  HAL_GPIO_WritePin(GPIOA, PWRKEY_Pin|GPIO_PIN_11|SWIDO_Pin|CS_EXP_Pin, GPIO_PIN_RESET);
574
575
  /*Configure GPIO pin : BT_CMD_Pin */
576
  GPIO_InitStruct.Pin = BT_CMD_Pin;
577
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
578
  GPIO_InitStruct.Pull = GPIO_NOPULL;
579
  HAL_GPIO_Init(BT_CMD_GPIO_Port, &GPIO_InitStruct);
580
581
  /*Configure GPIO pins : BT_IO1_Pin T_BUTTON_Pin */
582
  GPIO_InitStruct.Pin = BT_IO1_Pin|T_BUTTON_Pin;
583
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
584
  GPIO_InitStruct.Pull = GPIO_NOPULL;
585
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
586
587
  /*Configure GPIO pins : WAKE_SW_Pin CS_RFID_Pin T_LED_Pin SLEEP_Pin */
588
  GPIO_InitStruct.Pin = WAKE_SW_Pin|CS_RFID_Pin|T_LED_Pin|SLEEP_Pin;
589
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
590
  GPIO_InitStruct.Pull = GPIO_NOPULL;
591
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
592
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
593
594
  /*Configure GPIO pins : PWRKEY_Pin PA11 SWIDO_Pin CS_EXP_Pin */
595
  GPIO_InitStruct.Pin = PWRKEY_Pin|GPIO_PIN_11|SWIDO_Pin|CS_EXP_Pin;
596
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
597
  GPIO_InitStruct.Pull = GPIO_NOPULL;
598
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
599
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
600
601
}
602
603
/* USER CODE BEGIN 4 */
604
605
/* USER CODE END 4 */
606
607
/**
608
  * @brief  This function is executed in case of error occurrence.
609
  * @retval None
610
  */
611
void Error_Handler(void)
612
{
613
  /* USER CODE BEGIN Error_Handler_Debug */
614
  /* User can add his own implementation to report the HAL error return state */
615
616
  /* USER CODE END Error_Handler_Debug */
617
}
618
619
#ifdef  USE_FULL_ASSERT
620
/**
621
  * @brief  Reports the name of the source file and the source line number
622
  *         where the assert_param error has occurred.
623
  * @param  file: pointer to the source file name
624
  * @param  line: assert_param error line source number
625
  * @retval None
626
  */
627
void assert_failed(uint8_t *file, uint32_t line)
628
{ 
629
  /* USER CODE BEGIN 6 */
630
  /* User can add his own implementation to report the file name and line number,
631
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
632
  /* USER CODE END 6 */
633
}
634
#endif /* USE_FULL_ASSERT */
635
636
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

von Stefan F. (Gast)


Lesenswert?

Packe doch einfach das ganze Projekt in ein ZIP (aber bitte ohne die 
Verzeichnisse Release, Debug, Drivers und Middlewares).

von Stefan (Gast)


Lesenswert?

Nach langem debuggen habe ich nun rausgefunden, dass das Problem bei der 
Initialisierung des ebenfalls verwendeten I2C auftritt. und zwar wenn 
folgender define aufgerufen wird.
1
__HAL_RCC_I2C1_CLK_ENABLE();

Wenn ich nur diesen einen Aufruf auskommentiere dann gehts.
1
#define __HAL_RCC_I2C1_CLK_ENABLE()   do { \
2
                                        __IO uint32_t tmpreg; \
3
                                        SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\
4
                                        /* Delay after an RCC peripheral clock enabling */\
5
                                        tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\
6
                                        UNUSED(tmpreg); \
7
                                      } while(0U)

von Stefan F. (Gast)


Lesenswert?

Stefan schrieb:
> Nach langem debuggen habe ich nun rausgefunden, dass das Problem bei der
> Initialisierung des ebenfalls verwendeten I2C auftritt.

PB5=SPI1_MOSI überlappt sich mit I2C1_SMBA.

Das Einschalten des Taktes für I2C1 alleine kann noch nicht das Problen 
sein. Aber, wenn du den Takt nicht einschaltest, hat auch I2C1_SMBA 
keine Funktion.

Irgendwo muss also noch Code sein, der die SMBUS Funktion aktiviert, und 
der ohne Clock unwirksam wird. Eventuell ist eine Register-Definition 
falsch.

Kontrolliere mal, ob irgend wer irgendwann im Register I2C_CR1 die Bits 
20, 21 oder 22 auf High setzt.

von Stefan (Gast)


Lesenswert?

@ Stefanus F. danke für deine Antwort ich bin auf der Suche. In QubeMX 
Ist SMBA ausgegraut da ich PB5 ja als MOSI für den SPI verwende. Naja 
kann ja trotzdem sein dass QubeMX da irgend nen bug hat.

von Stefan F. (Gast)


Lesenswert?

Stefan schrieb:
> kann ja trotzdem sein dass CubeMX da irgend nen bug hat

Wäre nicht das erste mal, aber das darf man hier ja nicht offen sagen.

Wie ist denn dein Eindruck von Cube HAL, hat es Deine Arbeit deutlich 
vereinfacht?

von pegel (Gast)


Lesenswert?

Hast du versucht PB5 als Ausgang zu setzen und eine LED blinken zu 
lassen?

von Stefan (Gast)


Lesenswert?

pegel schrieb:
> Hast du versucht PB5 als Ausgang zu setzen und eine LED blinken zu
> lassen?

ja siehe:

Stefan schrieb:
> Einen
> Kurzschluss oder so kann ich ausschließen. Wenn ich den Pin anstatt als
> SPI MOSI als GPIO deklariere kann ich ihn toggeln

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

@Stefanus F.
generell finde ich QubeMX ganz gut da ich eigentlich eher Harware mache 
und nur etwas Software komme ich damit schneller ans Ziel.

Leider bin ich mit meinem Problem noch nicht weiter. Ich hab jetzt mal 
ein reduziertes Projekt gemacht und angehängt in dem nur SPI und I2C 
drin sind und wo das Problem auch besteht. Vielleicht findet einer von 
euch den Fehler ich bin völlig ratlos.

von Stefan F. (Gast)


Lesenswert?

Stefanus F. schrieb:
> Packe doch einfach das ganze Projekt in ein ZIP
> (aber bitte ohne die Verzeichnisse Release, Debug, Drivers und Middlewares).

Was war daran so unverständlich? Jetzt hast du doch einfach alle 
Verzeichnisse gepackt.

von Stefan F. (Gast)



Lesenswert?

Der Fehler wird Dir bereits in CubeMX angezeigt!

von Stefan (Gast)


Lesenswert?

Stefanus F. schrieb:
> Was war daran so unverständlich? Jetzt hast du doch einfach alle
> Verzeichnisse gepackt.

Ja hab ich extra damit nichts fehlt.

Stefanus F. schrieb:
> Der Fehler wird Dir bereits in CubeMX angezeigt!

das ist doch nur eine Warnung, dass man nicht alle Funktionen nutzen 
kann. Beim SPI ist auch eine Warnung da ich den SS als GPIO definiert 
habe. SPI und I2C sollten doch trotzdem gleichzeitig nutzbar sein oder 
täusche ich mich da?

von Stefan F. (Gast)


Lesenswert?

Ich wüsste auch gerne mal, warum das CubeMX Projekt für den 
STM32F103C8T6 ist, aber oben in 
Beitrag "Re: STM32 HAL_SPI Problem: MOSI immer HIGH" ein 
STM32F030 genannt wurde. Das trägt natürlich nicht gerade dazu bei, 
Klarheit zu schaffen.

Welcher STM32 ist es denn nun wirklich?

von Stefan (Gast)


Lesenswert?

Stefanus F. schrieb:
> Ich wüsste auch gerne mal, warum das CubeMX Projekt für den
> STM32F103C8T6

In Layout und Schaltplan ist ein STM32F103C8T6 wie im QubeMX Projekt. 
Auf dem Bild ist der falsche Value eingetragen sorry.

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Stefan schrieb:
> SPI und I2C sollten doch trotzdem gleichzeitig nutzbar sein oder
> täusche ich mich da?

Die Meldung dazu sagt was anderes. Siehe Screenshot.

Und das steht im Errata:

Kapitel 2.8.7: Conflict between the SPI1 MOSI signal and the I2C1 SMBA 
signal (even if SMBA is not used).

https://www.st.com/content/ccc/resource/technical/document/errata_sheet/7d/02/75/64/17/fc/4d/fd/CD00190234.pdf/files/CD00190234.pdf/jcr:content/translations/en.CD00190234.pdf

CubeMX berücksichtigt die Hinweise aus dem Errata. Das habe ich auch an 
anderen Stellen schon bemerkt.

PS: Es heisst CubeMX, nicht QubeMX

von Stefan (Gast)


Lesenswert?

Stefanus F. schrieb:
> Die Meldung dazu sagt was anderes. Siehe Screenshot.

Die Meldung sagt meiner meinung nach nur aus, dass SMBA nicht genutzt 
werden kann weil der Pin belegt ist. Wenn etwas generell nicht geht 
wirft QubeMX einen Fehler und gibt nicht nur ne Warnung. Wenn du auf I2C 
klickst siehts du das SMBA rot hinterlegt ist.

von Stefan F. (Gast)


Lesenswert?

Noch ein Zitat aus dem Errata:

"When using SPI1 remapped, the I2C1 clock must be disabled."

Es geht nicht, finde Dich damit ab.

> Die Meldung sagt meiner meinung nach nur aus, dass SMBA nicht genutzt
> werden kann weil der Pin belegt ist.

Nein, schau Dir die Meldung bezüglich SPI an. Dort steht, welcher Pin 
nicht genutzt werden kann. Bei I2C steht, dass die ganze Schnittstelle 
im Konflikt steht.

Man muss lernen, die Meldungen seiner Werkzeuge zu verstehen. Das ist 
wie beim Navi im Auto, es dauert eine Weile.

von Stefan (Gast)


Lesenswert?

Stefanus F. schrieb:
> Es geht nicht, finde Dich damit ab.

Dem scheint wohl so. Verdammt....

Stefanus F. schrieb:
> Kapitel 2.8.7: Conflict between the SPI1 MOSI signal and the I2C1 SMBA
> signal (even if SMBA is not used).

Wie findet man sowas? Ich würde mir da in Zukunft gerne selbst 
weiterhelfen können ohne euch hier bemühen zu müssen.

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Stefan schrieb:
> Wie findet man sowas?

Über die Webseiten des Herstellers, die Links sind rechts oben hinter 
der Schaltfläche "Resources" versteckt.

Ich empfehle Dir meine Zusammenstellung der Links auf 
http://stefanfrings.de/stm32/index.html

Ich hatte schon ganz zu Anfang ins Errata geguckt, aber in das falsche 
wegen deinem Schaltplan.

Die Errata Dokumente sind wichtig für deine Haare :-)

von Stefan (Gast)


Lesenswert?

Stefanus F. schrieb:
> Die Errata Dokumente sind wichtig für deine Haare :-)

Bei den Haaren ist nichts mehr zu retten ;-)
Danke dir für deine Mühe!!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.