这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» STM32» 如何使用STM32的SPI单总线?

共7条 1/1 1 跳转至

如何使用STM32的SPI单总线?

工程师
2021-03-29 22:47:36 打赏

spi的单线双向数据模式就是 MISO和MOSI只是用其中一根线进行数据交换。


在主机模式下,之前按照双线双向,先写一个假数据,然后接着读取一个字节,后来才发现这样是错的。

再后来,示波器上面看到了,只要切换到接收模式(单线双向模式下),原来CLK信号是一直就在输出了,源源不断(也就导致一直在不停接收数据),除非停止spi或者切回发送模式。

那么问题就是,如果需要使用随机单字节接收,是需要先停止spi,然后切换到接收模式,然后在使能spi,马上查看接收状态,是否接收完毕一字节,完毕则关闭spi。


上述的流程对于慢速的波特率情况下验证了没问题,波特率稍快后就不行了,因为判断接收完毕一字节的时候开销的时间可能会导致另外一个字节又开始接收了。

那如何使用STM32的SPI单总线?






关键词: SPI SPI BUS 单总线

工程师
2021-03-29 23:22:04 打赏
2楼

这种用IO口模拟最方便了,时钟始终由主机输出,主机发送时,主机data输出(从机输入),主机接收时,主机data输入(从机输出)。
最好双方约定都是开漏输出(外部上拉电阻),这样就不用来回切换输出输入了,统一为开漏输出。


工程师
2021-03-29 23:25:48 打赏
3楼

估计就是这么设计的,四线模式下,你读数据也是要发送数据的,只不过发送的数据是dummy 数据,要不然产生不了sclk。当工作在两线模式下,sclk 只能不停的发送。这个是我的理解,不清楚具体是不是这样。


工程师
2021-03-29 23:29:05 打赏
4楼

//以下内容需按实际更改
#define SPI_TX1_OFF LL_SPI_SetTransferDirection(SPI2,LL_SPI_HALF_DUPLEX_RX)//把GPIO(MOSI)配置成开漏--输入模式
#define SPI_TX1_ON LL_SPI_SetTransferDirection(SPI2,LL_SPI_HALF_DUPLEX_TX)//把GPIO(MOSI)配置成推挽--输出模式(50MHz)

uint16_t SPIx_ReadWriteByte(uint16_t byte)
{ uint16_t retry = 0;
while(((SPI2->SR&1<<1)== 0) )//发送缓冲区非空
{
if( ++retry > 30 )
return 0;//延迟一段时间后返回
}
SPI2->DR = byte; //发送数据
retry = 0;
while( ( (SPI2->SR&1<<0) == 0 ))//接收缓冲区为空
{
if( ++retry > 30 )
return 0;//延迟一段时间后返回
}
__NOP();
retry=(SPI2->DR) &0x7fff;
return retry; //读一下缓冲区,清标志
}
uint16_t ReadValue(uint16_t u16RegValue)
{
uint16_t u16Data;
SPI_CS1_ENABLE;
SPI_TX1_ON;
SPIx_ReadWriteByte(u16RegValue);
SPI_TX1_OFF;
//发送 0xFFFF 是无用的,是为了有时钟
u16Data = ( SPIx_ReadWriteByte(0xffff) & 0x7FFF )>>1 ;//0x12/0xff*100k
SPI_CS1_DISABLE;
SPI_TX1_ON;
return(u16Data);
}
这是STM32G431的半双工读写代码,不同芯片写跟读的#define不一样,按实际修改就可以(STM32F072的修改可以,其它系列没用过)


高工
2021-03-30 08:18:26 打赏
5楼

看了


高工
2021-04-07 11:24:27 打赏
6楼

用过这样的程序


工程师
2021-04-10 00:00:10 打赏
7楼

做的非常不错的


共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]