Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
92 / 19 / 3
Регистрация: 11.04.2015
Сообщений: 1,000
Записей в блоге: 1
1

Две платы Нуклео по SPI. Дубль два

15.12.2018, 16:17. Показов 1607. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток всем ! Я скачал образцы от производителя ( библиотека STM32CubeL1 ) и попробовал запустить пример для SPI ( режимы Full Duplex и polling ) на двух моих платах Nucleo-L152re. Подсоединил все как сказано в файле readme. ( ножки MOSI, MISO, CLK и GND напрямую к таким же лапкам на второй плате ).

Так вот. Не заработало. Думаю, что изза того, что в SPI нет способов синхронизации начала передачи данных ( между запуском мастера и запуском слейва проходит некоторое время и в итоге приходит мусор )

Как можно это исправить ? Код выложу позднее...

Добавлено через 19 минут
Вот код производителя...

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
/* Includes ------------------------------------------------------------------*/
#include "main.h"
 
/** @addtogroup STM32L1xx_HAL_Examples
  * @{
  */
 
/** @addtogroup SPI_FullDuplex_ComPolling
  * @{
  */ 
 
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Uncomment this line to use the board as master, if not it is used as slave */
//#define MASTER_BOARD
 
/* Private variables ---------------------------------------------------------*/
/* SPI handler declaration */
SPI_HandleTypeDef SpiHandle;
 
/* Buffer used for transmission */
uint8_t aTxBuffer[] = "****SPI - Two Boards communication based on Polling **** SPI Message ******** SPI Message ******** SPI Message ****";
 
/* Buffer used for reception */
uint8_t aRxBuffer[BUFFERSIZE];
 
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void Error_Handler(void);
static uint16_t Buffercmp(uint8_t *pBuffer1, uint8_t *pBuffer2, uint16_t BufferLength);
 
/* Private functions ---------------------------------------------------------*/
 
/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
  /* STM32L1xx HAL library initialization:
       - Configure the Flash prefetch
       - Systick timer is configured by default as source of time base, but user 
         can eventually implement his proper time base source (a general purpose 
         timer for example or other time source), keeping in mind that Time base 
         duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and 
         handled in milliseconds basis.
       - Set NVIC Group Priority to 4
       - Low Level Initialization
     */
  HAL_Init();
 
  /* Configure LED2 */
  BSP_LED_Init(LED2);
  /* Configure the system clock to 32 MHz */
  SystemClock_Config();
 
  /*##-1- Configure the SPI peripheral #######################################*/
  /* Set the SPI parameters */
  SpiHandle.Instance               = SPIx;
 
  SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
  SpiHandle.Init.Direction         = SPI_DIRECTION_2LINES;
  SpiHandle.Init.CLKPhase          = SPI_PHASE_1EDGE;
  SpiHandle.Init.CLKPolarity       = SPI_POLARITY_LOW;
  SpiHandle.Init.CRCCalculation    = SPI_CRCCALCULATION_DISABLE;
  SpiHandle.Init.CRCPolynomial     = 7;
  SpiHandle.Init.DataSize          = SPI_DATASIZE_8BIT;
  SpiHandle.Init.FirstBit          = SPI_FIRSTBIT_MSB;
  SpiHandle.Init.NSS               = SPI_NSS_SOFT;
  SpiHandle.Init.TIMode            = SPI_TIMODE_DISABLE;
 
#ifdef MASTER_BOARD
  SpiHandle.Init.Mode = SPI_MODE_MASTER;
#else
  SpiHandle.Init.Mode = SPI_MODE_SLAVE;
#endif /* MASTER_BOARD */
 
  if(HAL_SPI_Init(&SpiHandle) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }
 
#ifdef MASTER_BOARD
  /* Configure User push-button */
  BSP_PB_Init(BUTTON_USER, BUTTON_MODE_GPIO);
  /* Wait for User push-button press before starting the Communication */
  while (BSP_PB_GetState(BUTTON_USER) != GPIO_PIN_RESET)
  {
    BSP_LED_Toggle(LED2);
    HAL_Delay(100);
  }
  BSP_LED_Off(LED2);
#endif /* MASTER_BOARD */
 
  /*##-2- Start the Full Duplex Communication process ########################*/  
  /* While the SPI in TransmitReceive process, user can transmit data through 
     "aTxBuffer" buffer & receive data through "aRxBuffer" */
  /* Timeout is set to 5S */
  
  switch(HAL_SPI_TransmitReceive(&SpiHandle, (uint8_t*)aTxBuffer, (uint8_t *)aRxBuffer, BUFFERSIZE, 5000))
  {
    case HAL_OK:
      /* Communication is completed ___________________________________________ */
      /* Compare the sent and received buffers */
      if (Buffercmp((uint8_t *)aTxBuffer, (uint8_t *)aRxBuffer, BUFFERSIZE))
      {
        /* Transfer error in transmission process */
        Error_Handler();
      }
      /* Turn LED2 on: Transfer in transmission/Reception process is correct */
      BSP_LED_On(LED2);
      break;
 
    case HAL_TIMEOUT:
      /* An Error Occur ______________________________________________________ */
    case HAL_ERROR:
      /* Call Timeout Handler */
      Error_Handler();
      break;
    default:
      break;
  }
 
  /* Infinite loop */
  while (1)
  {
  }
}
 
/**
  * @brief  This function is executed in case of error occurrence.
  * @param  None
  * @retval None
  */
static void Error_Handler(void)
{
  while(1)
  {
    /* Turn LED2 on */
    BSP_LED_Toggle(LED2);
    HAL_Delay(1000);
  }
}
 
/**
  * @brief  System Clock Configuration
  *         The system Clock is configured as follow :
  *            System Clock source            = PLL (HSI)
  *            SYSCLK(Hz)                     = 32000000
  *            HCLK(Hz)                       = 32000000
  *            AHB Prescaler                  = 1
  *            APB1 Prescaler                 = 1
  *            APB2 Prescaler                 = 1
  *            HSI Frequency(Hz)              = 16000000
  *            PLLMUL                         = 6
  *            PLLDIV                         = 3
  *            Flash Latency(WS)              = 1
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 
  /* Enable HSE Oscillator and Activate PLL with HSE as source */
  RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState            = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLL_MUL6;
  RCC_OscInitStruct.PLL.PLLDIV          = RCC_PLL_DIV3;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
 
  /* Set Voltage scale1 as MCU will run at 32MHz */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  
  /* Poll VOSF bit of in PWR_CSR. Wait until it is reset to 0 */
  while (__HAL_PWR_GET_FLAG(PWR_FLAG_VOS) != RESET) {};
 
  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
  clocks dividers */
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }
}
/**
  * @brief  Compares two buffers.
  * @param  pBuffer1, pBuffer2: buffers to be compared.
  * @param  BufferLength: buffer's length
  * @retval 0  : pBuffer1 identical to pBuffer2
  *         >0 : pBuffer1 differs from pBuffer2
  */
static uint16_t Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)
{
  while (BufferLength--)
  {
    if((*pBuffer1) != *pBuffer2)
    {
      return BufferLength;
    }
    pBuffer1++;
    pBuffer2++;
  }
 
  return 0;
}
 
#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
 
  /* Infinite loop */
  while (1)
  {
  }
}
#endif
 
/**
  * @}
  */
 
/**
  * @}
  */
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Добавлено через 2 минуты
Вот его readme файл...

@par Example Description

This example shows how to ensure SPI data buffer transmission/reception in Polling
mode between two boards.

_________________________ _________________________
| ______________| |______________ |
| |SPI3 | | SPI3| |
| | | | | |
| | CLK(PC10)|______________________|(PC10)CLK | |
| | | | | |
| | MISO(PC11)|______________________|(PC11)MISO | |
| | | | | |
| | MOSI(PC12)|______________________|(PC12)MOSI | |
| | | | | |
| |______________| |______________| |
| __ | | |
| |__| | | |
| USER | | |
| GND|______________________|GND |
| | | |
|_STM32L1 Master _________| |_STM32L1 Slave __________|

HAL architecture allows user to easily change code to move to IT or DMA mode.
To see others communication modes please check following examples:
SPI\SPI_FullDuplex_ComDMA
SPI\SPI_FullDuplex_ComIT

At the beginning of the main program the HAL_Init() function is called to reset
all the peripherals, initialize the Flash interface and the systick.
Then the SystemClock_Config() function is used to configure the system
clock (SYSCLK) to run at 32 MHz.

The SPI peripheral configuration is ensured by the HAL_SPI_Init() function.
This later is calling the HAL_SPI_MspInit()function which core is implementing
the configuration of the needed SPI resources according to the used hardware (CLOCK &
GPIO). You may update this function to change SPI configuration.

The SPI communication is then initiated.
The HAL_SPI_TransmitReceive() function allows the reception and the
transmission of a predefined data buffer at the same time (Full Duplex Mode)
The user can choose between Master and Slave through "#define MASTER_BOARD"
in the "main.c" file.
If the Master board is used, the "#define MASTER_BOARD" must be uncommented.
If the Slave board is used the "#define MASTER_BOARD" must be commented.

For this example the aTxBuffer is predefined and the aRxBuffer size is same as aTxBuffer.

In a first step after the user press the User push-button, SPI Master starts the
communication by sending aTxBuffer and receiving aRxBuffer through
HAL_SPI_TransmitReceive(), at the same time SPI Slave transmits aTxBuffer
and receives aRxBuffer through HAL_SPI_TransmitReceive().
The end of this step is monitored through the HAL_SPI_GetState() function
result.
Finally, aRxBuffer and aTxBuffer are compared through Buffercmp() in order to
check buffers correctness.

STM32 board's LEDs can be used to monitor the transfer status:
- LED2 toggles quicly on master board waiting user button to be pressed.
- LED2 turns ON if transmission/reception is complete and OK.
- LED2 toggle slowly when there is a timeout or an error in transmission/reception process.

@note SPIx instance used and associated resources can be updated in "main.h"
file depending hardware configuration used.

@note Timeout is set to 5 Seconds which means that if no communication occurs
during 5 Seconds, a Timeout Error will be generated.

@note You need to perform a reset on Slave board, then perform it on Master board
to have the correct behaviour of this example.

@note Care must be taken when using HAL_Delay(), this function provides accurate delay (in milliseconds)
based on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from
a peripheral ISR process, then the SysTick interrupt must have higher priority (numerically lower)
than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
To change the SysTick interrupt priority you have to use HAL_NVIC_SetPriority() function.

@note The application need to ensure that the SysTick time base is always set to 1 millisecond
to have correct HAL operation.

@par Directory contents

- SPI/SPI_FullDuplex_ComPolling/Inc/stm32l1xx_hal_conf.h HAL configuration file
- SPI/SPI_FullDuplex_ComPolling/Inc/stm32l1xx_it.h SPI interrupt handlers header file
- SPI/SPI_FullDuplex_ComPolling/Inc/main.h Header for main.c module
- SPI/SPI_FullDuplex_ComPolling/Src/stm32l1xx_it.c SPI interrupt handlers
- SPI/SPI_FullDuplex_ComPolling/Src/main.c Main program
- SPI/SPI_FullDuplex_ComPolling/Src/system_stm32l1xx.c STM32L1xx system source file
- SPI/SPI_FullDuplex_ComPolling/Src/stm32l1xx_hal_msp.c HAL MSP file


@par Hardware and Software environment

- This example runs on STM32L1xx devices.

- This example has been tested with STM32L152RE-Nucleo Rev C board and can be
easily tailored to any other supported device and development board.

- STM32L152RE-Nucleo Rev C Set-up:
- Connect master CLK (PC10 connected to pin1 on CN7 connector) to Slave CLK (PC10 connected to pin1 on CN7 connector)
- Connect master MISO (PC11 connected to pin2 on CN7 connector) to Slave MISO (PC11 connected to pin2 on CN7 connector)
- Connect master MOSI (PC12 connected to pin3 on CN7 connector) to Slave MOSI (PC12 connected to pin3 on CN7 connector)
- Connect Maset board GND to Slave Board GND

@par How to use it ?

In order to make the program work, you must do the following:
- Open your preferred toolchain
- Rebuild all files and load your image into target memory
o Uncomment "#define MASTER_BOARD" and load the project in Master Board
o Comment "#define MASTER_BOARD" and load the project in Slave Board
- Run the example

* <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
*/
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2018, 16:17
Ответы с готовыми решениями:

SeggerIDE, линух и платы нуклео с STM32F746ZG
Перепрошил на плате отладчик в сеггер. ПРоект помигать диодиком. В линухе при заливке проекта...

Как послать пульс с платы Нуклео ?
Здравствуйте ! Делаю небольшой проект, подключаю к плате Nucleo-L152RE ультразвуковой датчик...

Погода. Тема дубль два
Я знаю что тема уже была, в разделе дельфи для начинающих, но я ничего не понял + мне нужно сделать...

QTableView + Double Click дубль два
Добрый вечер. Собственно говоря такой вопрос: Нужно в одном QTableView отлавливать и...

7
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
16.12.2018, 07:52 2
Лучший ответ Сообщение было отмечено max_sk как решение

Решение

Цитата Сообщение от max_sk Посмотреть сообщение
ножки MOSI, MISO, CLK и GND напрямую к таким же лапкам на второй плате
ну а где пятая ножка? CS(Chip Select), она та как раз и нужна для синхронизации
Цитата Сообщение от max_sk Посмотреть сообщение
Думаю, что изза того, что в SPI нет способов синхронизации начала передачи данных
есть
Цитата Сообщение от max_sk Посмотреть сообщение
между запуском мастера и запуском слейва проходит некоторое время и в итоге приходит мусор
слейв не нужно запускать, он должен быть включен всегда "слушать" линию
мастер выставил CS(установил 0) слейв это поймал и знает что сейчас пойдут данные

Добавлено через 2 минуты
max_sk, картинку поправь, ничего не понятно
лучше если прикрепишь в графическом формате
1
92 / 19 / 3
Регистрация: 11.04.2015
Сообщений: 1,000
Записей в блоге: 1
21.12.2018, 22:20  [ТС] 3
Есть продвижение !

Оказывается, вопреки теории, надо подсоединять пять ножек - MISO к MISO, MOSI к MOSI, NSS к NSS и CLK к CLK. Но кроме этого оказывается нужно подсоединить еще и GND к GND ! Тогда начинают отправляться и приниматься верные данные. Правда, временами мусор все таки проскальзывает. Буду думать почему...

ValeryS, не могу поправить картинку. Удалите, пожалуйста, пост с картинкой, он несущественен.

Добавлено через 44 минуты
Все, сделал !!!

Оказывается, мусор поступал потому, что пока я выводил результат через HAL_UART_Transmit(), в буффер прибывали еще данные. Выкладываю код.

Вот код мастера :

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32l1xx_hal.h"
 
/* USER CODE BEGIN Includes */
#define BUFFERSIZE 15
/* USER CODE END Includes */
 
/* Private variables ---------------------------------------------------------*/
SPI_HandleTypeDef hspi3;
 
UART_HandleTypeDef huart2;
 
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t aTxBuffer[]="SPI-1234567890";
uint8_t aRxBuffer[BUFFERSIZE];
/* USER CODE END PV */
 
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_SPI3_Init(void);
 
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
static uint16_t MyBuffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);
static void MyError_Handler(void);
/* USER CODE END PFP */
 
/* USER CODE BEGIN 0 */
 
/* USER CODE END 0 */
 
/**
  * @brief  The application entry point.
  *
  * @retval None
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
 
  /* USER CODE END 1 */
 
  /* MCU Configuration----------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
 
  /* USER CODE BEGIN Init */
 
  /* USER CODE END Init */
 
  /* Configure the system clock */
  SystemClock_Config();
 
  /* USER CODE BEGIN SysInit */
 
  /* USER CODE END SysInit */
 
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_SPI3_Init();
  /* USER CODE BEGIN 2 */
  while( HAL_GPIO_ReadPin( GPIOC, GPIO_PIN_13) != GPIO_PIN_RESET ){
      HAL_GPIO_TogglePin( GPIOA, GPIO_PIN_5);
      HAL_Delay(1000);
  }
  
  HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
  
  
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
 
  /* USER CODE END WHILE */
     
  /* USER CODE BEGIN 3 */
   switch(HAL_SPI_TransmitReceive(&hspi3, (uint8_t*)aTxBuffer, (uint8_t *)aRxBuffer, BUFFERSIZE, 5000))
  {
    case HAL_OK:
      /* Communication is completed ___________________________________________ */
      /* Compare the sent and received buffers */
      if (MyBuffercmp((uint8_t *)aRxBuffer, "Slave Send 000", BUFFERSIZE)){
          HAL_UART_Transmit(&huart2, "Slave Send 000\r\n", 16, 100);
        /* Transfer error in transmission process */
      //  MyError_Handler();
      }
      /* Turn LED2 on: Transfer in transmission/Reception process is correct */
      HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
      break;
 
    case HAL_TIMEOUT:
      /* An Error Occur ______________________________________________________ */
    case HAL_ERROR:
      /* Call Timeout Handler */
      MyError_Handler();
      break;
    default:
      break;
  }
  //HAL_Delay(1000);
  }
  /* USER CODE END 3 */
 
}
Вот код слейва :

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32l1xx_hal.h"
 
/* USER CODE BEGIN Includes */
#define BUFFERSIZE 15
/* USER CODE END Includes */
 
/* Private variables ---------------------------------------------------------*/
SPI_HandleTypeDef hspi3;
 
UART_HandleTypeDef huart2;
 
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t aTxBuffer[]="Slave Send 000";
uint8_t aRxBuffer[BUFFERSIZE];
/* USER CODE END PV */
 
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_SPI3_Init(void);
 
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
static uint16_t MyBuffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);
static void MyError_Handler(void);
/* USER CODE END PFP */
 
/* USER CODE BEGIN 0 */
 
/* USER CODE END 0 */
 
/**
  * @brief  The application entry point.
  *
  * @retval None
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
 
  /* USER CODE END 1 */
 
  /* MCU Configuration----------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
 
  /* USER CODE BEGIN Init */
 
  /* USER CODE END Init */
 
  /* Configure the system clock */
  SystemClock_Config();
 
  /* USER CODE BEGIN SysInit */
 
  /* USER CODE END SysInit */
 
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_SPI3_Init();
  /* USER CODE BEGIN 2 */
  //HAL_Delay(5000);
  
  
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
 
  /* USER CODE END WHILE */
 
  /* USER CODE BEGIN 3 */
      switch(HAL_SPI_TransmitReceive(&hspi3, (uint8_t*)aTxBuffer, (uint8_t *)aRxBuffer, BUFFERSIZE, 5000))
      {
          case HAL_OK:
      /* Communication is completed ___________________________________________ */
      /* Compare the sent and received buffers */
          if (MyBuffercmp((uint8_t *)aRxBuffer, "SPI-1234567890", BUFFERSIZE)){
        /* Transfer error in transmission process */
      //  MyError_Handler();
              HAL_UART_Transmit(&huart2, "SPI-1234567890\r\n", 16, 100);
          }
      /* Turn LED2 on: Transfer in transmission/Reception process is correct */
      HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
      break;
 
    case HAL_TIMEOUT:
      /* An Error Occur ______________________________________________________ */
    case HAL_ERROR:
      /* Call Timeout Handler */
      MyError_Handler();
      break;
    default:
      break;
  }
  //HAL_Delay(1000);
  }
  /* USER CODE END 3 */
 
}
0
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,574
Записей в блоге: 6
22.12.2018, 14:53 4
Цитата Сообщение от max_sk Посмотреть сообщение
MISO к MISO, MOSI к MOSI
Выход к выходу и вход ко входу? Ничего не перепутали?
Цитата Сообщение от max_sk Посмотреть сообщение
оказывается нужно подсоединить еще и GND к GND
Еще забыли упомянуть что необходимо обязательно подать питание на плату.
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
22.12.2018, 14:57 5
Цитата Сообщение от locm Посмотреть сообщение
Выход к выходу и вход ко входу? Ничего не перепутали?
нет ничего
MOSI Master Out Slave In
MISO Master In Slave Out
мастер у нас один
это не USART где нужно перекрещивать Rx Tx
1
92 / 19 / 3
Регистрация: 11.04.2015
Сообщений: 1,000
Записей в блоге: 1
23.12.2018, 21:53  [ТС] 6
Добрый вечер всем ! Играюсь с проектом. Иногда данные идут чисто, иногда с помехами. Как мне кажется, есть вибрация проводов, изза чего данные искажаются. Как избежать этого ? С вибрацией кнопок я знаком, а как устранить помехи от вибрации проводов ?
0
92 / 19 / 3
Регистрация: 11.04.2015
Сообщений: 1,000
Записей в блоге: 1
01.03.2019, 18:09  [ТС] 7
Пока идут детали по почте для проекта Говорящий будильник, хочу все таки попробовать добиться устойчивой передачи данных по SPI. Потому что в новом проекте тоже есть SPI. А то я тут перезапустил ётот проект, и у меня снова пошел мусор...


Я пользуюсь перемычками female-female. Может будут идеи как добиться устойчивой и верной передачи инфы ? Паять и перепаивать каждый раз платы не хотелось бы...

Добавлено через 1 час 51 минуту
Мне тут сказали, что перемычки тут ни при чем. И посоветовали поработать со скоростью передачи данных. Как вы думаете, может помочь ?

Добавлено через 3 часа 11 минут
После того, как выставил в Кубе прескалер от PCLK так, чтобы частота была наименьшей, т.е. /16, передача данных стала устойчивой. Осталась проблема запуска плат, т.е. если во время старта данные пошли искаженными, то они и будут передаваться так до самого конца. Что можно сделать с этим ?

Добавлено через 12 минут
Хммм… Функция HAL_SPI_TransmitReceive() начинает заполнять буффер еще до того, как Мастер послал пульс и начал передачу. Надо как то разобраться с этим...
0
92 / 19 / 3
Регистрация: 11.04.2015
Сообщений: 1,000
Записей в блоге: 1
02.03.2019, 11:43  [ТС] 8
Таки решил эту проблему - связал лапку NSS слейва с лапкой PA6 мастера, через которую управляю запуском передачи данных. Теперь все работает отлично !!!
0
02.03.2019, 11:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2019, 11:43
Помогаю со студенческими работами здесь

indexOf, пропись ручкой, дубль два
В общем, при написании при помощи циклов программа приобрела такой вид: using System; using...

Спойлер на сайте, дубль два (закрыть по умолчанию)
Всем привет!) Ребята, недавно помог хороший человек и реализовал спойлр на сайте. ссылка на тему...

Как из одной формы запустить Sub в другой форме? (Дубль два)
Есть две формы: frmMain и frmNew. На frmMain есть Sub Refr. Мне нужно из кода формы frmNew...

Почему один SEO инструмент нашел две внутренние ссылки на один page (дубль)
почему один SEO инструмент нашел две внутренние ссылки на один page (дубль), причем часть одной...

Два дисплея на ST7920 по SPI
Доброго времени суток! Подскажите, можно ли подключить два дисплея 128х64 по SPI звездой, то есть...

Два Nucleo board'a по SPI
У меня есть два одинаковых Нуклео борда. Хочу их соединить по SPI. Но сначала непонятно как их...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru