
主机发送0xa2,从机接收主机发送的数据,判断接收到的数据是不是0xa2,如果从机接收到的数据是0xa2,从机发送:0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c给主机.但是主机接到的是:0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b. ``` uint16_t SPI2_ReadWriteByte(uint16_t TxData) { while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); // 等待发送区空 SPI_I2S_SendData(SPI2, TxData); // 通过外设SPIx发送一个byte数据 while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);// 等待接收完一个byte return SPI_I2S_ReceiveData(SPI2); // 返回通过SPIx最近接收的数据 } uint8_t SPI_TxBuffer[12] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c}; void SPI2_IRQHandler(void) { if(LL_SPI_IsActiveFlag_RXNE(SPI2)==SET){ SPI_IT_Rec=SPI2->DR; if(SPI_IT_Rec == 0xa2){ for(uint8_t i=0;i<12;++i){ SPI_RxBuffer[i]= ReadWriteData(SPI_TxBuffer[i]); } SPI_Flag = 1; } } } ``` |
STM32U3 IIC通信后,SPI+GPDMA 进入循环发送,DMA无法使能 寄存器USEF=1
STM32G070CBT6使用硬件SPI无法读出W25Q128的ID
STM32的TIM触发SPI的DMA发送使用NSS时MSSI的问题
ST25R3916有快速读取吗?
32bit SPI使用DMA 初次不触发SPI中断 第二次发送不触发DMA中断
STM32c031c6 SPI Slave Transmit Only模式的疑问
USB Device + FatFS + 外挂 flash
I2C从模式编程之空闲状态
stm32mp257_spidev如何在arm中正常使用?
简单聊聊STM32的SPI外设
[md]我使用的是全双工模式,MISO,MOSI都用到了.我主机发送了0xA2,后面连续发送了12个0x00,用来接收从机回复的12个数据.主机发送0xA2,同时也接收到了从机在DR中写入的默认值0x00.当主机发送第一个0x00时,接收到的还是0x00.主机发送第二个0x00,接收到的才时0x01.
从机的逻辑时,接收主机发送的数据,判断数据是不是0xA2,如果是0xA2,for循环发送0x01-0x0C
如果再中断一次接收到的数据就会是:0x0c,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b
楼主,SIP读取时,需要主机产生信号再进行读取,写入也是类似。每次发送完一个数据都要先读取。在开启中断前,先把数据读取完毕后,再开启。另外,终端中尽量不要写这种死循环的代码,一旦发生异常,中断就出不来了。你这样的使用还不如直接用查询的方式读取。
[md]主机发送A2命令时时钟就会开启了,这时从机的移位寄存器中的值会被主机读取到.您的意思是从机不在中断中进行读取主机发送的数据吗?
首先你的主机,读取的时候,也是由你来产生的CLK。对方在收到A2命令后,需要通过写入空数据让从机将数据传输出来。
发送A2时使用SPI2_ReadWriteByte这个函数即可。楼主,你用的是双线还是三线模式?建议看看SPI通讯协议。
如同楼上TX所说,SPI全双工通讯时,主发送的同时也收到从发的信息,因为时钟是由主提供的。所以楼主注意这个细节,调整一下判断逻辑就可以了。
楼主,我不太明白的你的设计思路。主机和从机的程序都是你写的是吗?如果都是自己写的,注意一下时序。可以用逻辑分析仪或者示波器抓波形,自己理解一下SPI的通讯过程。
[md]第一次发送0xA2:
第二次发送0xA2:
[md]第二次发送A2时,看一下寄存器的值是不是0C,说明在上次通讯完成前,还是有没有及时读取的数据。楼主用的SPI器件是什么?
[md]F103VET6做的从机
那应该是你逻辑的问题,建议看一下SPI的通讯协议。
好的,感谢老哥帮忙
不谢,有问题发帖就好。