打印
[单片机芯片]

CH32L103 SPI应用

[复制链接]
3576|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
L-MCU|  楼主 | 2024-7-26 09:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 L-MCU 于 2024-7-26 09:44 编辑

1、SPI介绍
关于CH32L103的SPI特征介绍以及功能描述,具体可看CH32L103应用手册,在此不再赘述。SPI,全称Serial Peripheral interface,即串行外设接口。SPI使用4条线进行通信,具体如下:
CS:片选信号,由主设备控制。
SCLK:时钟信号,由主设备产生。
MISO:主设备数据输入,从设备数据输出。
MOSI:主设备数据输出,从设备数据输入。
SPI支持全双工通信,可同时进行数据发送和接收,可用于驱动TFT显示屏、SD卡、无线通信模块等。
  
2、SPI通信协议
在进行SPI初始化时,需要配置SPI的数据方向、工作模式(主或从模式)、数据长度(8位或16位)、时钟极性和时钟相位、软件控制NSS或硬件控制NSS、时钟分频,此外还需要配置帧格式控制位是先发送LSB还是先发送MSB
(1)数据方向
可配置为两线全双工模式、两线仅接收模式、单线收或单线发模式;
(2)工作模式
可配置为主或从模式
(3)数据宽度
可配置为8位或者16位
(4)时钟极性(CPOL)和时钟相位(CPHA)介绍:
时钟极性CPOL:可配置为高或低
时钟极性配置为高(CPOL=1),同步时钟(SCLK)的空闲状态电平为高电平;
时钟极性配置为低(CPOL=0),同步时钟(SCLK)的空闲状态电平为低电平;
时钟相位CPHA:可配置为1或0
时钟相位配置为1,数据采样在同步时钟(SCLK)的第2个跳变沿(偶数边沿采样);
时钟相位配置为0,数据采样在同步时钟(SCLK)的第1个跳变沿(奇数边沿采样);
通过配置时钟极性(CPOL)和时钟相位(CPHA),可使SPI工作在4中工作模式下,如下表:
SPI模式
时钟极性(CPOL)
时钟相位(CPHA)
空闲状态SCLK电平
数据采样边沿
0
0
0
低电平
奇数边沿
1
0
1
低电平
偶数边沿
2
1
0
高电平
奇数边沿
3
1
1
高电平
偶数边沿
(5)片选信号控制配置
可选软件控制或硬件控制。当片选信号线拉低,对应的设备被选中,主机与被选中设备之间开始进行通信,当通信结束后,可将片选信号线拉高。
(6)时钟分频设置
SPI外设是挂载在PB1和PB2总线上的,其中,SPI1挂载在PB2总线,SPI2挂载在PB1总线。则SPI的时钟=PBx总线时钟/分频
(7)MSB与LSB
MSB,即Most Significant Bit--最高有效位。以0x0101为例,先发送MSB,则用二进制表示为0000 0001 0000 0001
LSB,即Least Significant Bit--最低有效位。以0x0101为例,先发送LSB,则用二进制表示为1000 0000 1000 0000

以上就是对SPI初始化配置项的介绍,下图为EVT SPI全双工通信的数据抓包图,使用SPI1,设置数据宽度为16位,设置CPOL为0,CPHA为0,时钟256分频,LSB。
上图数据为硬件片选下全双工通信。
数据位宽配置的是16位,因此MOSI和MISO两根信号线上的数据都是按照16位宽进行数据传输的;
CPOL配置的是0,即空闲状态下的时钟电平是低电平,因此未进行数据传输时时钟信号电平状态为0,可以看截图信号开始部分,电平状态为低电平,下图看的更明显;
CPHA配置的是0,即数据采样在同步时钟(SCLK)的第1个跳变沿(奇数边沿采样),如上图,在上升沿进行数据采样;
有效位配置为LSB,且在上升沿进行数据采样,16位数据宽度,因此采样数据为:
1000 0000 1000 0000,即为0x0101

3、SPI应用
在CH32L103 EVT中提供了几种基本的SPI使用示例,如下图,除此之外,SPI还常被用于驱动SD卡、LCD屏、无线通信模块等。
附件例程为SPI操作SD卡、LCD例程,可以参考一下。

4、SPI使用注意事项
(1)关于硬件SPI使用硬件CS说明
目前使用片选方式时,一般使用软件方式,通过操作GPIO拉高或拉低。
当使用硬件方式时,除了需要在结构体中配置为硬件模式,还应将片选引脚配置为复用推挽模式,并调用SPI_SSOutputCmd函数,开启对应SPI的硬件片选输出功能。
注意:当配置SPI为主模式且使用硬件NSS时,置MSTR位和SPE位,需要保证NSS此时已经是高。即在配置SPI设备为主设备且启用SPI之前,SSOE要置位,要调用SPI_SSOutputCmd函数且ENABLE,如下图。
关于硬件SPI使用硬件NSS片选引脚时,当选择设备拉低之后,无法自动拉高恢复高电平。即数据发送完成后,NSS引脚不会自动拉高,需要通过SPI_SSOutputCmd( SPI1, DISABLE )函数或SPI_Cmd( SPI1, DISABLE )函数关于SPI模块来恢复高电平。
注意,关闭SPI模块后,NSS引脚也就失去了内部输出控制,此时输出处于悬空状态,引脚电平未知。建议可以加一个上拉电阻,NSS引脚在被释放后会拉高。

(2)关于SPI DMA驱动SD卡发送和接收函数配置
关于SPI通过DMA驱动SD卡读出和写入数据,配置发送和接收函数时注意DMA发送和接收要同步配置,否则接收和发送可能会存在问题,具体可见附件例程。

(3)关于提高SPI读写SD卡速度以及驱屏刷新率的方法
  • 提高SPI时钟;
  • 使用DMA操作;
  • 读写函数使用寄存器配置;


CH32L103 SPI.zip

1.68 MB

使用特权

评论回复
沙发
tpgf| | 2024-8-1 11:50 | 只看该作者
spi通讯方式和iic通讯方式可以互相转换吗

使用特权

评论回复
板凳
晓伍| | 2024-8-11 10:05 | 只看该作者
当数据量过大的时候spi全双工模式会导致单片机死机吗

使用特权

评论回复
地板
八层楼| | 2024-8-11 17:11 | 只看该作者
spi通讯方式的抗干扰能力怎么样

使用特权

评论回复
5
观海| | 2024-8-12 08:18 | 只看该作者
spi的数据宽度和单片机的位数有对应关系吗

使用特权

评论回复
6
guanjiaer| | 2024-8-12 13:41 | 只看该作者
spi通讯必须要有时钟信号吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

26

帖子

0

粉丝