Servus, ich benutze das STM32F429 DiscoveryII (mit STM32F429ZIT6UV) und möchte die selben Daten über 3 unterschiedliche SPI Kanäle parallel senden. Ich sende im Interruptmode mit Baudrateprescaler_32 -> also mit 2,5MBit/s. Ich benute die SPI Kanäle 1,4,5 im send only master mode und führe die HAL_SPI_Transmit_IT dreimal nacheinander aus. Ebenfalls sind die Kanäle identisch parametriert. Ich bin gespannt, was ich falsch mache;) Bei weiteren Fragen, Anregungen,... nur her damit. Viele Grüße Julian
Nutzt du die cube lib? bzw. zeig den Code ... Die Cube lib wartet bei manchen Bussen (bei SPI bin ich nicht sicher) innerhalb des Interrupts auf das senden der lezten Bytes. Also evtl. nicht dein Fehler sondern ST :-) mfg DerDan
Julian B. schrieb: > Ich bin gespannt, was ich falsch mache;) Du sendest die Daten mit Hilfe der CPU (TX-INT), und glaubst das diese nur für deine SPI Transmission da ist. Meine Glaskugel sagt: Das ist kein Fehler, du hast noch andere INTs aktiviert. Einer hatte gerade für die ca. 10us(Bild) die CPU anderweitig beschäftigt! >Bei weiteren Fragen, Anregungen,... nur her damit. Wenn du eine DMA Senderoutine nimmst, sollte diese Effekt nicht auftreten. ohne weitere Infos kann man sonst nicht viel sagen.....
Hi, vielen Dank schon mal für den Input. Ja ich benutze die Cube Lib, anbei ist mein Code. Bis auf den Ticktimer sind aber sonst alle Interrupts raus.
1 | /* Includes ------------------------------------------------------------------*/
|
2 | #include "stm32f4xx_hal.h" |
3 | |
4 | /* USER CODE BEGIN Includes */
|
5 | #include "stm32f429i_discovery.h" //for easy use of Buttons and LEDs on discovery Board |
6 | /* USER CODE END Includes */
|
7 | |
8 | /* Private variables ---------------------------------------------------------*/
|
9 | SPI_HandleTypeDef hspi1; |
10 | SPI_HandleTypeDef hspi4; |
11 | SPI_HandleTypeDef hspi5; |
12 | |
13 | SDRAM_HandleTypeDef hsdram1; |
14 | |
15 | /* USER CODE BEGIN PV */
|
16 | /* Size of buffer */
|
17 | #define BUFFERSIZE1 (COUNTOF(aTxBuffer1))
|
18 | /* Exported macro ------------------------------------------------------------*/
|
19 | #define COUNTOF(__BUFFER__) (sizeof(__BUFFER__) / sizeof(*(__BUFFER__)))
|
20 | /* Buffer used for transmission */
|
21 | uint16_t aTxBuffer = 0; //Transmit Buffer in transmit function HAL_SPI_Transmit() for all SPIchannels |
22 | uint16_t aTxBuffer1[] = {0x0016,0x0027,0x00FF,0xFFFF,0x0000,0x0283}; //Data Buffer for SPI1 |
23 | HAL_SPI_StateTypeDef state, state2; |
24 | uint32_t ErrorCode; |
25 | /* USER CODE END PV */
|
26 | |
27 | /* Private function prototypes -----------------------------------------------*/
|
28 | void SystemClock_Config(void); |
29 | static void MX_GPIO_Init(void); |
30 | static void MX_FMC_Init(void); |
31 | static void MX_SPI1_Init(void); |
32 | static void MX_SPI4_Init(void); |
33 | static void MX_SPI5_Init(void); |
34 | |
35 | /* USER CODE BEGIN PFP */
|
36 | |
37 | static void Error_Handler(void); |
38 | void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi); |
39 | |
40 | /* USER CODE END PFP */
|
41 | |
42 | /* USER CODE BEGIN 0 */
|
43 | |
44 | /* USER CODE END 0 */
|
45 | |
46 | int main(void) |
47 | {
|
48 | |
49 | /* USER CODE BEGIN 1 */
|
50 | |
51 | /* USER CODE END 1 */
|
52 | |
53 | /* MCU Configuration----------------------------------------------------------*/
|
54 | |
55 | /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
|
56 | HAL_Init(); |
57 | |
58 | /* Configure the system clock */
|
59 | SystemClock_Config(); |
60 | |
61 | /* Initialize all configured peripherals */
|
62 | MX_GPIO_Init(); |
63 | MX_FMC_Init(); |
64 | MX_SPI1_Init(); |
65 | MX_SPI4_Init(); |
66 | MX_SPI5_Init(); |
67 | |
68 | /* USER CODE BEGIN 2 */
|
69 | /* --------------------------------------Configure LED3 and LED4 */
|
70 | BSP_LED_Init(LED3); |
71 | BSP_LED_Init(LED4); |
72 | |
73 | /* Configure USER Button */
|
74 | BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO); |
75 | |
76 | /* Wait for USER Button press before starting the Communication */
|
77 | while (BSP_PB_GetState(BUTTON_KEY) != 1) |
78 | {
|
79 | BSP_LED_Toggle(LED3); |
80 | HAL_Delay(40); |
81 | }
|
82 | BSP_LED_Off(LED3); |
83 | |
84 | if (HAL_SPI_Transmit_IT(&hspi1, (uint8_t*)aTxBuffer1, BUFFERSIZE1) != HAL_OK){ |
85 | |
86 | }
|
87 | if (HAL_SPI_Transmit_IT(&hspi4, (uint8_t*)aTxBuffer1, BUFFERSIZE1) != HAL_OK){ |
88 | |
89 | }
|
90 | if (HAL_SPI_Transmit_IT(&hspi5, (uint8_t*)aTxBuffer1, BUFFERSIZE1) != HAL_OK){ |
91 | |
92 | }
|
93 | while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY){ |
94 | |
95 | }
|
96 | |
97 | /* USER CODE END 2 */
|
98 | |
99 | /* USER CODE BEGIN 3 */
|
100 | /* Infinite loop */
|
101 | while (1) |
102 | {
|
103 | }
|
104 | /* USER CODE END 3 */
|
105 | |
106 | }
|
107 | |
108 | /** System Clock Configuration
|
109 | */
|
110 | void SystemClock_Config(void) |
111 | {
|
112 | |
113 | RCC_OscInitTypeDef RCC_OscInitStruct; |
114 | RCC_ClkInitTypeDef RCC_ClkInitStruct; |
115 | |
116 | __PWR_CLK_ENABLE(); |
117 | |
118 | __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); |
119 | |
120 | RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; |
121 | RCC_OscInitStruct.HSEState = RCC_HSE_ON; |
122 | RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; |
123 | RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; |
124 | RCC_OscInitStruct.PLL.PLLM = 8; |
125 | RCC_OscInitStruct.PLL.PLLN = 336; |
126 | RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; |
127 | RCC_OscInitStruct.PLL.PLLQ = 7; |
128 | HAL_RCC_OscConfig(&RCC_OscInitStruct); |
129 | |
130 | RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1 |
131 | |RCC_CLOCKTYPE_PCLK2; |
132 | RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; |
133 | RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; |
134 | RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; |
135 | RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; |
136 | HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); |
137 | |
138 | }
|
139 | |
140 | /* SPI1 init function */
|
141 | void MX_SPI1_Init(void) |
142 | {
|
143 | |
144 | hspi1.Instance = SPI1; |
145 | hspi1.Init.Mode = SPI_MODE_MASTER; |
146 | hspi1.Init.Direction = SPI_DIRECTION_2LINES; |
147 | hspi1.Init.DataSize = SPI_DATASIZE_16BIT; |
148 | hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; |
149 | hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; |
150 | hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT; |
151 | hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; |
152 | hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; |
153 | hspi1.Init.TIMode = SPI_TIMODE_DISABLED; |
154 | hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED; |
155 | HAL_SPI_Init(&hspi1); |
156 | |
157 | }
|
die weiteren beiden SPI init functions sind die selben, nur für SPI4&5, GPIO inits habe ich Euch mal erspart. Vielen Dank für die Hilfe
Dear Julian, I suggest to use DMA transfer. In attachement, you can find tested example, based on STM32F429I-DISCO board, SPI3,SPI4,SPI5 were used. Please, generate project source by CubeMX tool and attached project.ioc file and then follow the attached main.c file. Best regards, Bartosz ST-Support Antwort;) Alles klar
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.