实现功能: 两个C8T6单片机通过2.4G模块进行通信,实现数据的收发,并执行相应的操作。

所需材料: C8T6单片机( 两个) 2.4G模块( 两个) USB转TTL (一个,用于在PC端观察收到的数据)

具体实现

一、2.4G引脚及引脚配置

在这里插入图片描述

简要说明:

CE: 2.4G 片选信号

CSN:SPI 片选信号

其中片选信号的作用大致是:使能器件

SCK、MOSI、MISO是SPI的通信引脚

//-------------------
IRQ:中断信号线(现在理解为标志位,检查数据是否发送完成、有效时为低电平,)当IRQ引脚为低电平时,即数据传输完成。

在本实验例程中用到的引脚

CE: B12
CSN:B10
SCK:B13
MOSI:B15
MISO:B14
IRQ:B11

二、2.4G通信方式

(1)SPI通信

2.4G模块是用的是SPI通信方式 首先你要知道SPI通信的特点

SPI特点: 全双工(可以同时完成发送和接收,也就是主给从发送数据的同时,从也给主返回一个应答信号)

所以在程序设计时:

如果只进行写操作,主机忽略接收到的字节;反之,

若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

(2)SPI通信的一些介绍

(2.1)SPI采用4线传输

①CE:片选信号,由片选引脚可以使我们的单片机可以和多个SPI外设进行通信,

比如: 外设0---->PA0 外设1------>PA1 外设2------>PA2等等,当我们单片机将上述的引脚选择性拉低时,就可以和对应的外设
进行通信。(应该最多是一对六) == ???==

②SCK: 时钟线,输出串行同步时钟,可以改变其时钟极性(CHOL)和时钟相位(CPHA)

如果 CPOL=1,串行同步时钟的空闲状态为高电平。

如果 CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样

注意:SPI主模块和从模块时钟配置要一样。

在这里插入图片描述

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//第二个跳变沿数据被采样

③MISO 主设备数据输入,从设备数据输出。

④MOSI 主设备数据输出,从设备数据输入。

(2.2)SPI通信清楚这几点

当我们要配置SPI通信的时候,头脑中应该有以下几点内容:

①SPIX引脚

SPI1

在这里插入图片描述

SPI2

在这里插入图片描述

注意: SPIX_NSS是SPI的硬件片选引脚,而我们采用的是软件片选(即引脚可以自己设置)

②SPI引脚模式配置:

在这里插入图片描述

具体代码实现:

在这里插入图片描述

三、SPI重点掌握这一点

重点需要掌握的是SPI中的读写函数:

// SPI读写一个字节
// TxData:要写入的字节
// 返回值:读取到的字节
//-----------------------------------------------------------------------
u8 SPI2_ReadWriteByte(u8 TxData)
{        
    u8 TxWait = 0;
    u8 RxWait = 0;
    
    // 等待发送缓存为空
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET)
    {
        TxWait++;
        if(TxWait>250)    // 等待时间过长则放弃本次读写
        return 0;
    }    

    SPI_I2S_SendData(SPI2, TxData); // SPI2写一个字节
    
    // 等待接收缓存为空
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET)
    {
        RxWait++;
        if(RxWait>250)    // 等待时间过长则放弃本次读写
        return 0;
    }          
    
    return SPI_I2S_ReceiveData(SPI2); // 将读到的字节返回                        
}

①功能及分析:

功能:发送一个字节,并且返回一个字节

在这个函数里面,其中有两个是判断语句(等待语句)

发送等待------->数据是否发送成功

接受等待------->是否接受到发送的数据

在正常情况下,这个语句中有效的语句其实就是下面两句:

SPI_I2S_SendData(SPI2, TxData); //发送一个数据
return SPI_I2S_ReceiveData(SPI2); //返回一个数据

下面我们将用代码来具体实现两个单片机之间的数据收发,并且通过判断收发数据是否正确来执行相应的操作。