离线
TA的每日心情 | 慵懒 2021-7-23 17:16 |
---|
签到天数: 17 天 [LV.4]
|
有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 草帽王子 于 2021-9-10 17:40 编辑
CH32V103应用教程——SPI-全双工通信,软件控制NSS模式
本章教程主要在SPI双线全双工模式下进行主从收发实验,并采用软件控制NSS方式。
1、SPI简介及相关函数介绍
关于SPI主从模式下的全双工发送和接收数据,其软件配置过程如下:
1、设置SPI控制寄存器1(SPIx_CTLR1)位6 SPE位置1,启用SPI;
2、在SPI数据寄存器(SPIx_DATAR)中写入第一个要发送的数据,此操作会清除SPI状态寄存器(SPI_SR)位1 TXE标志;
3、当SPI状态寄存器(SPI_SR)位1 TXE标志为1(表示发送缓冲区为空),写入第二个要发送的数据;当SPI状态寄存器(SPI_SR)位0 RXNE标志为1(表示接收缓冲区非空),读SPI数据寄存器(SPIx_DATAR)中的数据并同时清除RXNE标志位。重复上述操作,发送后续数据并同时接收后续数据(n-1个);
4、等待SPI状态寄存器(SPI_SR)位0 RXNE标志为1(表示接收缓冲区非空),接收最后一个数据;
5、等待SPI状态寄存器(SPI_SR)位1 TXE标志位为1,在位7BSY标志位置0(SPI不在通讯)后关闭SPI模块。
注:也可以在响应RXNE或TXE标志的上升沿产生的中断的处理程序中实现这个过程。
关于CH32V103 SPI具体信息,可参考CH32V103应用手册。SPI标准库函数在第十五章节已介绍,在此不再赘述。
2、硬件设计
本章教程主要进行SPI主从模式下的全双工发送和接收数据,需用到两个开发板,且由于采用全双工模式,因此主设备和从设备均要使用MOSI引脚和MISO引脚以及SCK引脚进行通讯。此处使用外设为SPI1,主设备和从设备MOSI对应引脚均为PA7引脚、MISO对应引脚均为PA6引脚,将主设备PA6、PA7引脚与从设备PA6、PA7引脚一一对应连接起来,此外还需将两个开发板SPI1对应的SCK引脚PA5连接起来。
此外,由于两个开发板需要同时进行上电传输,因此将两个开发板的3.3V引脚和GND引脚进行连接。
3、软件设计
本章教程主要进行SPI主从模式下的全双工发送和接收数据,具体程序如下:
spi.h文件
- #ifndef __SPI_H
- #define __SPI_H
- #include "ch32v10x_conf.h"
- /* SPI Mode Definition */
- #define HOST_MODE 0
- #define SLAVE_MODE 1
- /* SPI Communication Mode Selection */
- #define SPI_MODE HOST_MODE
- //#define SPI_MODE SLAVE_MODE
- #define Size 18
- extern u16 TxData[Size];
- extern u16 RxData[Size];
- void SPI_FullDuplex_Init(void);
- #endif
复制代码
spi.c文件
- #include "spi.h"
- /* Global Variable */
- u16 TxData[Size] = { 0x0101, 0x0202, 0x0303, 0x0404, 0x0505, 0x0606,
- 0x1111, 0x1212, 0x1313, 0x1414, 0x1515, 0x1616,
- 0x2121, 0x2222, 0x2323, 0x2424, 0x2525, 0x2626 };
- u16 RxData[Size];
- /*******************************************************************************
- * Function Name : SPI_FullDuplex_Init
- * Description : Configuring the SPI for full-duplex communication.
- * Input : None
- * Return : None
- *******************************************************************************/
- void SPI_FullDuplex_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- SPI_InitTypeDef SPI_InitStructure;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE );
- #if (SPI_MODE == HOST_MODE)
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init( GPIOA, &GPIO_InitStructure );
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init( GPIOA, &GPIO_InitStructure );
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init( GPIOA, &GPIO_InitStructure );
- #elif (SPI_MODE == SLAVE_MODE)
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init( GPIOA, &GPIO_InitStructure );
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init( GPIOA, &GPIO_InitStructure );
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init( GPIOA, &GPIO_InitStructure );
- #endif
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //全双工模式
- #if (SPI_MODE == HOST_MODE)
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
- #elif (SPI_MODE == SLAVE_MODE)
- SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
- #endif
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件控制NSS
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
- SPI_InitStructure.SPI_CRCPolynomial = 7;
- SPI_Init( SPI1, &SPI_InitStructure );
- SPI_Cmd( SPI1, ENABLE );
- }
复制代码
spi.c文件主要包括1个函数:SPI_FullDuplex_Init函数。SPI_FullDuplex_Init函数主要进行SPI1全双工通信模式下的主机和从机配置。首先,由于采用全双工通信方式,且采用软件控制NSS引脚,因此需要对主机和从机的SCK引脚、MOSI引脚和MISO引脚进行GPIO初始化配置。此外,还需要进行主机和从机配置,此配置可根据CH32V103应用手册主模式和从模式配置步骤进行,主要对SPI通信的通信方向、主从模式、数据帧大小、时钟极性、时钟相位、NSS引脚使用方式、波特率等进行配置,可对照手册参考标准库函数ch32v10x_spi.c文件中SPI_Init函数进行配置。
main.c文件
main.c文件主要进行主机和从机下的数据发送和接收。并将接收数据与发送数据进行对比,当发送数据与接收数据相同,输出same,若不同,输出different。
4、下载验证
将编译好的程序分别在主机模式和从机模式下下载到两个开发版,并将主机的引脚与从机的引脚一一对应进行连接,开发板上电后,串口打印如下:
主机打印:
从机打印:
49、SPI-全双工模式,软件控制NSS.rar
49、SPI-全双工模式,软件控制NSS.rar
(474.87 KB, 下载次数: 10)
链接:https://pan.baidu.com/s/11zewNhVrvJKVuqqCQTm0QQ
提取码:53d9
复制这段内容后打开百度网盘手机App,操作更方便哦
完
|
上一篇: 第四十九章:SPI-单工通信(1条时钟线和1条单向数据线)下一篇: 第五十一章:SPI-全双工通信,硬件控制NSS模式
|