查看: 988|回复: 0
收起左侧

第四十九章:SPI-单工通信(1条时钟线和1条单向数据线)

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-4-28 20:23:14 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 草帽王子 于 2021-9-10 17:39 编辑

    CH32V103应用教程——
    SPI-单工通信(1条时钟线和1条单向数据线),主机接收从机发送


    本章教程主要在SPI单工通信方式下进行1条时钟线和1条单向数据线配置,并进行主机接收从机发送。


    1、SPI简介及相关函数介绍

    关于SPI单工通信模式下1条时钟线和1条单向数据线配置介绍,在第46章已经进行介绍,在此不再赘述。
    关于CH32V103 SPI具体信息,可参考CH32V103应用手册。SPI标准库函数在第十五章节已介绍,在此不再赘述。


    2、硬件设计

    本章教程主要在SPI单工通信模式下选择1条时钟线和1条单向数据线进行主机发送从机接收实验,需用到两个开发板,且由于采用1条时钟线和1条单向数据线配置,因此主设备和从设备均使用MISO引脚进行通讯。此处使用外设为SPI1,主设备和从设备MISO对应引脚均为PA6引脚,将主设备PA6引脚与从设备PA6引脚连接起来,此外还需将两个开发板SPI1对应的SCK引脚PA5连接起来。

    此外,由于两个开发板需要同时进行上电传输,因此将两个开发板的3.3V引脚和GND引脚进行连接。


    3、软件设计

    本章教程主要进行SPI单工通信模式1条时钟线和1条双向数据线配置下的主机接收从机发送实验,具体程序如下:
    spi.h文件
    1. <blockquote>#ifndef __SPI_H
    复制代码

    spi.h文件主要进行相关宏定义和函数声明;
    spi.c文件
    1. <blockquote>#include "spi.h"
    复制代码

    spi.c文件主要包括两个函数:SPI_1Lines_HalfDuplex_Init函数和SPI1_IRQHandler函数。SPI_1Lines_HalfDuplex_Init函数主要进行SPI1单工通信模式1条时钟线和1条单向数据线配置下的主机接收从机发送配置。

    首先,由于选择1条时钟线和1条单向数据线配置,在这种配置下,主机和从机均需要用到SCK引脚和MISO引脚,此处,由于用到SPI1,对应SCK引脚为PA5,MISO引脚为PA6,因此,在SPI_1Lines_HalfDuplex_Init函数中首先对主机和从机对应GPIO引脚进行初始化配置,此处需要注意,由于是主机接收从机发送,需要将主机PA6引脚设置为浮空输入模式,从机PA6引脚设置为复用推挽输出模式。

    此外,由于主机作为接收,从机作为发送,此处在SPI_1Lines_HalfDuplex_Init函数中需要对SPI进行主机接收和从机发送初始化配置,此配置可根据CH32V103应用手册主模式和从模式配置步骤进行,主要对SPI通信的通信方向、主从模式、数据帧大小、时钟极性、时钟相位、NSS引脚使用方式、波特率等进行配置,可对照手册参考标准库函数ch32v10x_spi.c文件中SPI_Init函数进行配置。

    此处需要注意的是,在SPI单工通信1条时钟线和1条单向数据线配置模式下,SPI可以作为只发送,或者作为只接收。
    只发送:此种模式类似于全双工模式(SPI控制寄存器1 BIDIMODE=0,RXONLY=0),数据在发送引脚(主模式时是MOSI、从模式时是MISO)上传输,而接收引脚(主模式时是MISO、从模式时是MOSI)可以作为通用的I/O使用。此时,软件不必理会接收缓冲器中的数据(如果读出数据寄存器,它不包含任何接收数据)。

    只接收:此种模式可通过将SPI控制寄存器1的RXONLY位置1配置为禁止输出(只接收模式),此时,发送引脚(主模式时是MOSI、从模式时是MISO)被释放,可以作为其它功能使用。

    在只接收情况下,SPI的配置方式为:
    在主模式时:使能SPI后,启动数据通信,当SPI控制寄存器1 SPE位置0后禁用SPI,停止接收。在这种模式下,SPI状态寄存器位7 BSY始终为1,因此不必读取BSY标志。

    在从模式时:只要NSS被拉低(或在NSS软件模式时, SPI控制寄存器1 SSI位为‘0’)同时SCK有时钟脉冲,SPI就一直在接收。
    SPI1_IRQHandler函数为SPI1中断服务函数,主要进行主机模式下的数据发送和从机模式下的数据接收。

    main.c文件
    1. /********************************** (C) COPYRIGHT *******************************
    2. * File Name          : main.c
    3. * Author             : WCH
    4. * Version            : V1.0.0
    5. * Date               : 2020/04/30
    6. * Description        : Main program body.
    7. *******************************************************************************/

    8. #include "debug.h"
    9. #include "spi.h"

    10. /*******************************************************************************
    11. * Function Name  : main
    12. * Description    : Main program.
    13. * Input          : None
    14. * Return         : None
    15. *******************************************************************************/
    16. int main(void)
    17. {
    18.     u8 i;

    19.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    20.     Delay_Init();
    21.     USART_Printf_Init(115200);
    22.     printf("SystemClk:%d\r\n",SystemCoreClock);

    23.     SPI_1Lines_HalfDuplex_Init();

    24. #if (SPI_MODE == SLAVE_MODE)
    25.     printf("SLAVE Mode\r\n");
    26.     Delay_Ms(1000);

    27. #endif

    28. #if (SPI_MODE == HOST_MODE)
    29.     printf("HOST Mode\r\n");
    30.     Delay_Ms(2000);
    31.     SPI_Cmd( SPI1, ENABLE );
    32.     SPI_I2S_ITConfig( SPI1, SPI_I2S_IT_RXNE , ENABLE );

    33. #endif

    34.     while(1)
    35.     {
    36. #if (SPI_MODE == SLAVE_MODE)
    37.         while( Txval<18 );

    38.         /* 等待TXE=1,BSY=0,等待发送完成,关闭SPI1 */
    39.         while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE ) != RESET )
    40.         {
    41.             if( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_BSY ) == RESET )
    42.             {
    43.                 SPI_Cmd( SPI1, DISABLE );       //关闭SPI1
    44.                 printf("Tx End\r\n");
    45.                 while(1);
    46.             }
    47.         }

    48. #elif (SPI_MODE == HOST_MODE)

    49.         while( Rxval<18 );

    50.         for( i=0; i<18; i++ )
    51.         {
    52.             printf( "Rxdata:%04x\r\n", RxData[i] );
    53.         }

    54.         while(1);

    55. #endif
    56.     }
    57. }

    复制代码


    4、下载验证


    将编译好的程序分别在主机模式和从机模式下下载到两个开发版,并将主机的PA6引脚与从机PA6引脚进行连接,开发板上电后,串口打印如下:

    主机打印:
    CH32V CH573单片机芯片-第四十九章:SPI-单工通信(1条时钟线和1条单向数据线)risc-v单片机中文社区(1)
    从机打印:
    CH32V CH573单片机芯片-第四十九章:SPI-单工通信(1条时钟线和1条单向数据线)risc-v单片机中文社区(2)
    48、SPI-单工通信(1条时钟线和1条单向
    CH32V CH573单片机芯片-第四十九章:SPI-单工通信(1条时钟线和1条单向数据线)risc-v单片机中文社区(3) 48、SPI-单工通信(1条时钟线和1条单向数据线),主机接收从机发送.rar.rar.rar (483.13 KB, 下载次数: 10)
    链接:https://pan.baidu.com/s/1dvHCBS5Hn5Ewg3j094SsgA
    提取码:5loe
    复制这段内容后打开百度网盘手机App,操作更方便哦







    上一篇:第四十八章:SPI-单工通信(1条时钟线和1条单向数据线)
    下一篇:第五十章:SPI-全双工通信,软件控制NSS模式
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-3-29 22:33 , Processed in 0.405956 second(s), 48 queries .

    快速回复 返回顶部 返回列表