我正在尝试使用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;
}
任何建议。
答案 0 :(得分:1)
在我的脑海中,SPI_CR1_SPE
中应启用SPI_CR1_SSI
和/或SPI4->CR1
。 HAL_SPI_Init()
没有设置任何一项,但是HAL SPI传输功能设置了,如果您使用自己的传输代码,则应该自己进行设置。
更新
如果启用SPE
中的SSI
和enableChip
位,则将永远不会调用它,因为它不是没有括号的函数调用。
这两行
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
将从1
变为0
。