stm32的spi通信问题:程序在前面都没问题,但到了发送接收的while里面就出不来了,帮忙看看有啥问题?急

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32的spi通信问题:程序在前面都没问题,但到了发送接收的while里面就出不来了,帮忙看看有啥问题?急相关的知识,希望对你有一定的参考价值。

void SPI1_Init(void)

SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; //(3)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //SPI CS //(4)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);

/* SPI1 configuration */
// W25X16: data input on the DIO pin is sampled on the rising edge of the CLK.
// Data on the DO and DIO pins are clocked out on the falling edge of CLK.
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);

/* Enable SPI1 */
SPI_Cmd(SPI1, ENABLE);


u8 SPI1_ReadWriteByte(void)


SPI_I2S_SendData(SPI1, 0x54); //通过外设SPI1发送一个数据

printf("\n\r 数据发送完毕。\n\r");

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //检查指定的SPI标志位设置与否:发送缓存空标志位

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); //检查指定的SPI标志位设置与否:接受缓存非空标志位

return SPI_I2S_ReceiveData(SPI1); //返回通过SPI1最近接收的数据

printf ("\n\r 接收数据成功。\n");

首先说明一点:你这个里面都没有使能时钟,怎么可能会正常运行呢。
还有一点:STM32先等待已发送的数据是否发送完成,如果没有发送完成,并且进入循环的话,说明数据发送错误,所以你这个地方顺序也有问题。应该是:
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //检查指定的SPI标志位设置与否:发送缓存空标志位
SPI_I2S_SendData(SPI1, 0x54); //通过外设SPI1发送一个数据
printf("\n\r 数据发送完毕。\n\r");
参考技术A 第三个数据每次的错误是一样的么?还是每次的错误是随机的?
每次发送和接收前前应该调用SPI_I2S_GetFlagStatus()吧?、
我是这样写的
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
txBuffer[i] = SPI_I2S_ReceiveData(SPI2);
-------------------------------------
软件必须遵循下述过程,发送和接收数据
1. 设置SPE位为’1’,使能SPI模块;
2. 在SPI_DR寄存器中写入第一个要发送的数据,这个操作会清除TXE标志;
3. 等待TXE=1,然后写入第二个要发送的数据。等待RXNE=1,然后读出SPI_DR寄存器并获得第一个接收到的数据,读SPI_DR的同时清除了RXNE位。重复这些操作,发送后续的数据同时接收n-1个数据;
4. 等待RXNE=1,然后接收最后一个数据;
5. 等待TXE=1,在BSY=0之后关闭SPI模块。
参考技术B 检查硬件,在发送第一条指令前也检查一下发送寄存器是否为空,最好有示波器看一下~

以上是关于stm32的spi通信问题:程序在前面都没问题,但到了发送接收的while里面就出不来了,帮忙看看有啥问题?急的主要内容,如果未能解决你的问题,请参考以下文章

STM32 & TLV5628 SPI 通信

STM32 SPI 与 HAL 通信

STM32和FPGA通过SPI进行通讯

STM32H7 SPI通信:FIFO管理问题

请教STM32的SPI通信中的CRC校验问题 SPI

stm32 spi全双工从机模式