实现功能: 两个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); //返回一个数据
下面我们将用代码来具体实现两个单片机之间的数据收发,并且通过判断收发数据是否正确来执行相应的操作。
评论(0)
您还未登录,请登录后发表或查看评论