主机发送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; } } } ``` |
HAL库SPI DMA批量传输数据量最大为2^16,有没有办法改成上限为2^32
关于外部事件(EXTI0)触发SPI读取数据
STM32 SPI从机用DMA方式实现全双工,数据传输过程中出错。
关于VN9D5D20F芯片的SPI 的信号脚SDO设计疑问
L9663驱动开发
SPI 通信,既有单字节数据传输,又有多字节数据传输,该如正确使用 DMA?
STM32F405使用LL库建立SPI通讯报溢出是什么原因?
cubemx安装HAL库时要账号登录,点击注册,显示错误,ST官网点击注册也是显示错误,请问是什么问题?
L9663如何使用上行缓冲区发送同步脉冲
ST25R3916有快速读取吗?
[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的通讯协议。
好的,感谢老哥帮忙
不谢,有问题发帖就好。