173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

stm32fhalspi通讯

keros@mark 2023-03-18 资讯中心

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

首先说明一点:你这个里面都没有使能时钟,怎么可能会正常运行呢。

还有一点:STM32先等待已发送的数据是否发送完成,如果没有发送完成,并且进入循环的话,说明数据发送错误,所以你这个地方顺序也有问题。应该是:

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

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

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

STM32F767 HAL库SPI1无法发送和接收数据,求助原子大哥

原子大哥在哪里?呵呵

这个简单,下载个STM32F767的CUBE库,里面有现存的SPI工程,测试下。

做些比较,看看哪里配置有问题。当然硬件连接不能有问题。

你可以SPI自发自收,先排除硬件方面的问题。

stm32如何实现多台SPI通信

用DMA的SPI双机通信中几个很容易出错的点:

1)分频值:SPI的频率最高为18M,SPI1是在频率为72M的APB2上,而SPI2是在频率为36M的APB1上。如果芯片时钟频率为72M,那么SPI1的分频值为4,SPI2的分频值为2.

2)开DMA顺序:我在网上看到有人说要先开从机发送、再开主机发送、再开从机接收、最后开主机接收。我不知道为什么要这么开,而且这种开DMA方式是很难实现的,你可能要再加两根握手线判断对方到底开好DMA没有。我的程序“从机接收-从机发送-主机接收-主机发送”的顺序一样可行。

3)DMA中断:当数据发送到最后一个字节的第一位时,如果你开了DMA发送中断,就会进入DMA发送中断函数,这时候不能马上清楚标志位。必须要查询ISR寄存器判断剩下的7位数据是否也传输完毕,然后就是判断SR寄存器是否在忙。都完成以后才可清楚标志位、重新配置DMA数据长度,否则你后面的数据会出错。

4)上拉电阻:不加上拉偶尔会出错,这个出错并不是仿真能看出来的,我仿真每次都对,但是拔掉仿真器不停测试就发现数据出错了,5次重启能有1次错误。加了后数据异常稳定。不明白为何网上资料全没加上拉。

5)重设缓冲区地址:由于项目需要一个长度可变的缓冲区,所以我多次用了malloc和free进行分配缓冲区大小,这样就造成了缓冲区地址的不停改变,所以必须要失能DMA,然后重新配置DMA的缓冲区地址。

6)不用中断的主机发送过程:我看到网上的资料是主机使能DMA后,死等在那查询DMA是否传输完毕,这样就发挥不出DMA的作用了。SPI的频率是18M,而DMA据说大概是10M左右,如果用死等的方式,反而不如不用DMA。

所以,如果主机不用DMA中断的方式,那么可以写两个函数,一个是使能DMA,一个是判断DMA有没有传输完成。在这两个函数之间CPU就可以自己做自己的事情去了,反正主机有主动权。

多从机建议加243一类的三态驱动芯片,spi速度可以很快,并且稳定。如果允许的话,更好的办法是每个从机都加一个和主机隔离开,这样即使某个从机有问题也不会影响总线。

2个stm32怎么用spi通信

说几点注意的吧:

1、一个设置为主机模式,一个设置为丛机模式

2、将mosi、miso、nss、clk对应的连接起来就是了

3、波特率设置一样

4、配置spi,下面以配置SPI1主机模式为例如:

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//双线双向全双工

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//8位数据

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//空闲时钟为高电平

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//第2个时钟边沿读写数据

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//软件控制使能脚

SPI_SSOutputCmd(SPI1,ENABLE);

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;//SPI时钟频率

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//高位在前

SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC校验

SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//SPI1主机模式

SPI_Init(SPI1,SPI_InitStructure);

本文标签:stm32fhalspi通讯

产品列表
产品封装
友情链接