【发布时间】:2016-10-05 23:09:58
【问题描述】:
我目前正在开发 STM32L476RG Nucleo 板,并且正在尝试与 SPI2 总线通信。
似乎我正在使用 MOSI 引脚发送数据,但 SCK 引脚上没有任何内容。
这是我的初始化代码和发送数据代码:
在main.c中:
/初始化 SPI 的函数/
void MX_SPI2_Init(void)
{
hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.Direction = SPI_DIRECTION_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLED;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
hspi2.Init.CRCPolynomial = 7;
hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi2.Init.NSSPMode = SPI_NSS_PULSE_DISABLED;
HAL_SPI_Init(&hspi2);
}
/通过 SPI 向从机发送数据的函数/
void ADAS1000_SetRegisterValue(unsigned char regAddress,
unsigned long regVal)
{
unsigned char writeCmd[4] = {0, 0, 0, 0};
writeCmd[0] = 0x80 + regAddress; // Write bit and register address.
writeCmd[1] = (unsigned char)((regVal & 0xFF0000) >> 16);
writeCmd[2] = (unsigned char)((regVal & 0x00FF00) >> 8);
writeCmd[3] = (unsigned char)((regVal & 0x0000FF) >> 0);
HAL_SPI_Transmit(&hspi2, &(writeCmd[0]), (uint16_t) sizeof(writeCmd[0]), 50);
HAL_Delay(500);
HAL_SPI_Transmit(&hspi2, &(writeCmd[1]), (uint16_t) sizeof(writeCmd[1]), 50);
HAL_Delay(500);
HAL_SPI_Transmit(&hspi2, &(writeCmd[2]), (uint16_t) sizeof(writeCmd[2]), 50);
HAL_Delay(500);
HAL_SPI_Transmit(&hspi2, &(writeCmd[3]), (uint16_t) sizeof(writeCmd[3]), 50);
HAL_Delay(500);
}
在 hal_msp.c 中:
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(hspi->Instance==SPI2)
{
/* Peripheral clock enable */
__SPI2_CLK_ENABLE();
/**SPI2 GPIO Configuration
PC2 ------> SPI2_MISO
PC3 ------> SPI2_MOSI
PB10 ------> SPI2_SCK
PB12 ------> SPI2_NSS
*/
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
如果您有任何想法或建议,感谢您的帮助!
编辑
void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
__GPIOC_CLK_ENABLE();
__GPIOA_CLK_ENABLE();
__GPIOB_CLK_ENABLE();
}
【问题讨论】:
-
您是否在尝试配置之前启用了 SPI2 时钟?您说您启用了 GPIO 的时钟,但您在尝试配置它们之前是否这样做了?您也可以考虑暂时将有问题的引脚设置为普通 GPIO 输出并在软件中缓慢切换,以验证您已正确定位它以进行探测,它没有短路或损坏等。您在哪里接信号?您的电路板将 PB13 显示为标记为 SPI2 SCK,但它确实将 PB10 显示为 Arduino 风格的 D6(任一引脚都可以配置为此功能)
-
嗨,克里斯!感谢您的帮助!我在配置它们之前确实启用了 SPI2 和 GPIOs 时钟,并且我已经检查了我的 SCK 引脚是否作为普通 GPIO 工作 我只是尝试使用 PB10 作为 SPI2 SCK,但它仍然不起作用......我真的很困惑,我不知道该怎么办:/
-
我在使用 NSS 引脚作为 Alt 函数的 STM32 SPI 实现中遇到了问题。在进行任何 SPI 操作之前,我总是必须将引脚设置为 out 并手动将引脚断言为低电平。 STM32F1、F2 和 F4 就是这种情况。不确定 L 系列是否是这种情况。
-
CLK线上有外接上拉电阻吗?
-
您是否在测试未连接?你在和什么交流?会不会是另一个设备也配置为主模式,因此试图同时驱动时钟线?
标签: c embedded clock stm32 spi