gpt4 book ai didi

c - STM32 SPI通信

转载 作者:行者123 更新时间:2023-11-30 14:45:19 26 4
gpt4 key购买 nike

我正在尝试使用 STM32F411VE 进行 SPI 通信。我在 SPI 通信方面遇到一些问题。我正在跟踪这个特定代码的发送和接收

http://www.handsonembedded.com/stm32f103-spl-tutorial-5/

我正在使用 SPI4。我的 SPI 初始化是这样的:

/* SPI4 init function */
void MX_SPI4_Init(void)
{

hspi4.Instance = SPI4;
hspi4.Init.Mode = SPI_MODE_MASTER;
hspi4.Init.Direction = SPI_DIRECTION_2LINES;
hspi4.Init.DataSize = SPI_DATASIZE_8BIT;
hspi4.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi4.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi4.Init.NSS = SPI_NSS_SOFT;
hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi4.Init.TIMode = SPI_TIMODE_DISABLE;
hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi4.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi4) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}

}

这是代码:

uint8_t SPISend(uint8_t data)
{
SPI4->DR = data;
while (!(SPI4->SR & SPI_SR_TXE));
while (!(SPI4->SR & SPI_SR_RXNE));
while (!(SPI4->SR & SPI_SR_BSY));
return(SPI4->DR);
}

在这个特定的SPISend()方法中,控件永远不会到达末尾。它陷入了循环 while (!(SPI4->SR & SPI_SR_TXE));

我的函数调用是这样的:

void write8(char reg, unsigned char data)
{
uint8_t retVal;
enableChip;
reg|=0x80;
retVal = SPISend(reg);
retVal = SPISend(data);
disableChip;
}

任何建议。

最佳答案

在我的脑海中,应该在SPI4->CR1中启用SPI_CR1_SPE和/或SPI_CR1_SSIHAL_SPI_Init() 不会设置其中之一,但 HAL SPI 传输函数会设置,如果您使用自己的传输代码,则应该自己进行设置。

更新

如果您在 enableChip 中启用 SPESSI 位,它将永远不会被调用,因为它不是一个没有括号。

这两行

SPI4->DR = data;
while (!(SPI4->SR & SPI_SR_TXE));

顺序错误。您首先等待TXE != 0,这意味着发送器队列已准备好接收更多数据,然后写入数据。

这里是第二行

while (!(SPI4->SR & SPI_SR_RXNE));
while (!(SPI4->SR & SPI_SR_BSY));

可能会是一个无限循环,因为当 SPI_SR_RXNE 变为 1 时,或此后不久,SPI_SR_BSY 将从 更改10

关于c - STM32 SPI通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53122936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com