本帖最后由 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电平 | 数据采样边沿 | | | | | | | | | | | | | | | | | | | | |
(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操作;
- 读写函数使用寄存器配置;
|