discovery 和 bluenrg-ms 之间的 SPI 连接
SPI connection between discovery and bluenrg-ms
我正在使用 stm32f4 探索板 (stm43f407xx) 进行项目,我想与 SPBTLE-RF(IDB05A1 板)通信。
我正在使用带有预分频器 8 的 SPI2(我有 168Mhz,apb1 以 42Mhz 运行,所以时钟是 5.25Mhz),数据表说 bluenrg-ms 中的 spi 时钟工作高达 8Mhz,但我无法通信用芯片。
我试过一块 nucleo 板(spi1 预分频器 4),它工作得很好,所以硬件没问题,然后我试过两块发现板,但没有成功。
我仔细检查了所有连接,发现的软件与仅针对引脚填充和时钟修改的 nucleo 板相同。
有人使用过这个硬件或者可以提出一些建议吗?
我已经解决了!现在我解释一下,我忘了声明正确的中断处理程序,因为 bluenrg 使用 5 线 SPI 和一个必须由中断处理的 IRQ 引脚。
有趣的是,我使用的是预分频器 16,否则它不起作用,我不知道为什么,因为使用预分频器 8,SPI2 的时钟频率低于最大 8Mhz。
这是我的时钟初始化代码:
void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
我正在使用 stm32f4 探索板 (stm43f407xx) 进行项目,我想与 SPBTLE-RF(IDB05A1 板)通信。
我正在使用带有预分频器 8 的 SPI2(我有 168Mhz,apb1 以 42Mhz 运行,所以时钟是 5.25Mhz),数据表说 bluenrg-ms 中的 spi 时钟工作高达 8Mhz,但我无法通信用芯片。
我试过一块 nucleo 板(spi1 预分频器 4),它工作得很好,所以硬件没问题,然后我试过两块发现板,但没有成功。
我仔细检查了所有连接,发现的软件与仅针对引脚填充和时钟修改的 nucleo 板相同。
有人使用过这个硬件或者可以提出一些建议吗?
我已经解决了!现在我解释一下,我忘了声明正确的中断处理程序,因为 bluenrg 使用 5 线 SPI 和一个必须由中断处理的 IRQ 引脚。
有趣的是,我使用的是预分频器 16,否则它不起作用,我不知道为什么,因为使用预分频器 8,SPI2 的时钟频率低于最大 8Mhz。 这是我的时钟初始化代码:
void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}