河北工程stm32的si4432无线通讯系统课设.docx
- 文档编号:9961590
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:13
- 大小:172.43KB
河北工程stm32的si4432无线通讯系统课设.docx
《河北工程stm32的si4432无线通讯系统课设.docx》由会员分享,可在线阅读,更多相关《河北工程stm32的si4432无线通讯系统课设.docx(13页珍藏版)》请在冰豆网上搜索。
河北工程stm32的si4432无线通讯系统课设
信息与电气工程学院
电子技术系统设计三级项目
(2014/2015学年第一学期)
题目:
基于stm32的si4432无限通讯系统设计
学生姓名:
学号:
指导教师:
设计周数:
设计成绩:
一、课程设计目的及要求
1、课设目的
以stm32单片机为控制核心,利用si4432无线模块实现数据的双向传输,通过led对数据的正常通信状态进行指示。
2、课设要求
(1)画出电路原理图;
(2)确定元器件及元件参数;
(3)SCH文件生成与打印输出;
(4)搭建电路硬件,实现其功能;
(5)编写设计报告:
写出设计全过程,附上有关资料和电路图,有总结体会
二、项目设计正文
1、摘要
随着现代社会信息与技术的高速发展,普通的传感技术以无法满足人们对信息获取的需要,智能化无线传感器网络越来越受到众人的青睐和瞩目。
短距离无线通信的应用已经越来越广泛,如何在保证通信质量和安全的前提下,降低系统能耗,减少硬件成本成为制约其发展的关键问题。
本文设计了一种基于无线收发芯片Si4432和stm32单片机的无线射频收发系统。
该系统由发送模块和接收模块组成。
发送模块主要将要发送的数据经stm32处理后,通过Si4432发送出去;在接收模块中,Si4432则将数据正确接收后通过程序设计,以让led灯实现一闪一闪的效果显示出来,从而实现短距离的无线通信。
该系统可在休眠与唤醒两种模式下工作,降低了系统整体能耗,实现了低功耗、小体积、高灵敏度的无线数据传输,可应用于工业控制、智能建筑、远程监控等多个领域,具有广阔的应用前景。
3、控制芯片stm32f103系列
STM32F103xx增强型系列使用高性能的ARMCortex-M332位的RISC内核,工作频率为72MHz,内置高速存储器(高达128K字节的闪存和20K字节的SRAM),丰富的增强I/O端口和联接到两条APB总线的外设。
所有型号的器件都包含2个12位的ADC、3个通用16位定时器和一个PWM定时器,还包含标准和先进的通信接口:
多达2个I2C和SPI、3个USART、一个USB和一个CAN。
STM32F103xx增强型系列工作于-40°C至+105°C的温度范围,供电电压2.0V至3.6V,一系列的省电模式保证低功耗应用的要求。
完整的STM32F103xx增强型系列产品包括从36脚至100脚的五种不同封装形式;根据不同的封装形式,器件中的外设配置不尽相同。
下面给出了该系列产品中所有外设的基本介绍。
这些丰富的外设配置,使得STM32F103xx增强型微控制器适合于多种应用场合:
●电机驱动和应用控制
●医疗和手持设备
●PC外设和GPS平台
●工业应用:
可编程控制器、变频器、打印机和扫描仪
●警报系统,视频对讲,和暖气通风空调系统
3、无线收发芯片Si4432
Si4432芯片是SiliconLabs公司推出的一款高集成度、低功耗、多频段的EZRadioPRO系列无线收发芯片。
其工作电压为1.9~3.6V,20引脚QFN封装(4mm×4mm),可工作在315、433、868、915MHz四个频段;内部集成分集式天线、功率放大器、唤醒定时器、数字调制解调器、64字节的发送和接收数据FIFO,以及可配置的GPIO等。
Si4432在使用时所需的外部元件很少,1个30MHz的晶振、几个电容和电感就可组成一个高可靠性的收发系统,设计简单,且成本低。
Si4432的接收灵敏度达到-117dB,可提供极佳的链路质量,在扩大传输范围的同时将功耗降至最低;最小滤波带宽达8kHz,具有极佳的频道选择性;在240~960MHz频段内,不加功率放大器时的最大输出功率就可达+20dBm,设计良好时收发距离最远可达2km。
Si4432可适用于无线数据通信、无线遥控系统、小型无线网络、小型无线数据终端、无线抄表、门禁系统、无线遥感监测、水文气象监控、机器人控制、无线RS485、S232数据通信等诸多领域。
3.1si4432的主要引脚
stm32可以通过内置增强型SPI对Si4432的内部寄存器进行读写操作,灵活配置各项参数。
通过SPI接口完成对Si4432的初始化配置、读写数据、访问FIFO等操作。
使用4线SPI,即SDI、SDO、SCKL和nSEL。
SDI用于从stm32到Si4432的串行数据传输;SDO用于从Si4432到stm32的串行数据传输;SCK用于同步C8051F930和Si4432之间在SDI和SDO线上的串行数据传输;nSEL作为片选信号,只有片选信号为低电平时,对Si4432的操作才有效。
Si4432的13~16脚是标准的SPI接口,17脚(nIRQ)是中断状态输出引脚。
当FIFO溢出、有有效的数据包发送或接收、CRC错误、检测到前导位和同步字、上电复位等情况发生,且相应的中断被使能时,17脚都会产生一个低电平以通知C8051F930有中断产生。
20脚(SDN)决定了Si4432芯片的工作状态。
当SDN接地(SDN=0)时,芯片处于常规工作模式;接高电平(SDN=1)时,芯片处于掉电模式。
掉电模式下寄存器中的内容会丢失,且不允许SPI访问,但芯片的电流损耗只有10nA,功耗很低,因此适合要求极低功耗的应用。
在连接到电源后,在SDN的下降沿上电复位,根据指令转换到其他工作模式。
为了达到较好的通信效果,Si4432的接收低噪声放大器匹配电路和发射功率放大器匹配电路的阻容参数,应严格按照数据手册提供的参数选型。
相关引脚的说明参考si4432中文手册如下:
SDI
串行数据输入引脚0–VDDv,数字输入,这引脚为4线串行数据总线提供串行数据流。
SDO
0-VDDv数字输出提供内部控制寄存器串行读回功能。
SCLK
串行时钟输入引脚0–VDDv,数字输入,这个引脚提供4线串行数据总线串行数据时钟功能,数据在时钟的上升沿跳变送入芯片。
nSEL
穿行接口选择输入引脚:
0-VDDv,数字输入,这个引脚为4线串行数据总线提供选择/使能功能这个信号
也用于表示突发读/写模式,
nIRQ
普通单片机中断状态输出引脚,当RFIC提出任何事件的中断则nIRQ将会变高:
nIRQ=“1”,更多部分信
息,请查看中断事件控制逻辑寄存器,控制器能够通过读相应的SPI确定中断状态寄存器,地址03h和04h.
SDN
关闭输入引脚0-VDDV数字输入,在所有模式除关闭模式外SDN=“0”,当SDN=“1”芯片将完全关闭
并且寄存器的内容将丢失。
3.2si4432与stm32连接原理图
3.4无线发送程序设计思路
无线发送程序流程如图3所示。
完成stm32、SPI和Si4432的初始化后,配置寄存器写入相应的初始化RF控制字。
接下来,通过配置Si4432的寄存器3eh来设置包的长度,通过SPI连续写寄存器7fh,往TXFIFO里写入需要发送的数据。
然后打开“发送完中断允许”标志,将其他中断都禁止。
当有数据包发送完时,引脚nIRQ会被拉低以产生一个低电平从而通知C8051F930数据包已发送完毕。
完成中断使能后,使能发送功能,数据开始发送。
等待nIRQ引脚因中断产生而使电平拉低,当nIRQ引脚变为低时读取中断状态并拉高nIRQ,否则继续等待。
如果数据发送成功,指示灯会变亮。
一次数据发送成功后,进入下一次数据循环发送状态。
3.5无线接收程序设计思路
无线接收程序流程如图4所示程序完成stm32、SPI接口和Si4432的初始化后,配置寄存器写入相应的初始化RF控制字。
通过访问寄存器7fh从RXFIFO中读取接收到的数据。
相应的控制字设置好之后,若引脚nIRQ变成低电平,则表示Si4432准备好接收数据。
完成这些初始化配置后,通过寄存器4bh读取包长度信息。
4.引脚配置及初始化程序
1、进行SPI的设置,将NSEL配置到PA3端口上,将SDN配置到PA2端口上,将NIRQ配置到PA1端口上,具体设置如下:
#include"spi.h"
//SPI初始化函数
voidSPI1_Init(void){
GPIO_InitTypeDefGPIO_InitStructure;
SPI_InitTypeDefSPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1,ENABLE);
//GPIOA时钟使能//SPI1时钟使能
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//GPIOA567复用推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA
GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);//GPIOA567上拉
//LOW2有反应测试多次注意接口按紧,GPIOA567分别接至Si4432的clk、sdo、sdi
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//设置SPI
//单向或者双向的数据模式:
SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//设置为主SPI
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;//串行同步时钟的空闲状态为低电平
SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//串行同步时钟的第1个跳变沿(上升或//下降)数据被采样
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//NSS信号由硬件(NSS管脚)还是//软件(使用SSI位)管理:
内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;
//定义波特率预分频的值:
波特率预分频值为256
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;//指定数据传输从MSB位还是//LSB位开始:
数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial=7;//CRC值计算的多项式
SPI_Init(SPI1,&SPI_InitStructure);//根据SPI_InitStruct中指定的参数初始化外设//SPIx寄存器
SPI_Cmd(SPI1,ENABLE);//使能SPI外设
SPI1_ReadWriteByte(0xff);//启动传输
}
//设置速度函数
voidSPI1_SetSpeed(u8SPI_BaudRatePrescaler)
{
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
SPI1->CR1&=0XFFC7;
SPI1->CR1|=SPI_BaudRatePrescaler;//设置SPI1速度
SPI_Cmd(SPI1,ENABLE);
}
////SPIx读写一个字节
//TxData:
要写入的字节
//返回值:
读取到的字节
//函数说明:
由于主机SPI通信时,在发送和接受时是同时进行的,即发送完了一个字//节的数据后,也应当接受到一个字节的数据,stm32先等待已发送的数据是否发送完,如//果没有发送完成,并且进入循环200次,则表示发送错误,返回收到的值0;如果发送完//成,stm32从SPI1总线发送TxData
//stm32在等待接收的数据是否接收完成,如果没有接收完成,并且进入循环200次,//则表示接收错误,则返回0,如果接收完成了,则返回STM32读取的最新的数据
u8SPI1_ReadWriteByte(u8TxData)
{
u8retry=0;
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET)//检查指定//的SPI标志位设置与否:
发送缓存空标志位
{
retry++;
if(retry>200)return0;
}
SPI_I2S_SendData(SPI1,TxData);//通过外设SPIx发送一个数据
retry=0;
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET)//检查指//定的SPI标志位设置与否:
接受缓存非空标志位
{
retry++;
if(retry>200)return0;
}
returnSPI_I2S_ReceiveData(SPI1);//返回通过SPIx最近接收的数据}
voidGPIOSet(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//A,C时钟使能
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//PA3=NSEL推挽
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//PA2=SI_SDN推挽
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//PA1=SI_NIRQ产生中断时为高
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入//浮空:
GPIO_Mode_IN_FLOATING
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
SPI1_Init();//初始化SPI
SPI1_SetSpeed(SPI_BaudRatePrescaler_256);
}
2、进行LED的配置,将其配置到PB0端口上,具体设置如下:
#include"led.h"
#include"stm32f10x.h"
//对IO口的配置
voidled_Init(void){
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB时钟,配//置寄存器RCC_APB2ENR
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//对应PB0
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//速度
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_0);//设置IO口为高电平,reset为低电平
}
4.1设置u8SI4432_ReadReg(u8addr)读取寄存器函数
u8SI4432_ReadReg(u8addr)//函数写入一个8位的寄存器值。
{
uint8_ttemp=0;
SI4432_NSEL=0;
SPI1_ReadWriteByte(addr);//发送读取寄存器地址
temp=SPI1_ReadWriteByte(0Xff);
SI4432_NSEL=1;
returntemp;
}
4.2设置voidSI4432_WriteReg(u8addr,u8value)写入寄存器函数
voidSI4432_WriteReg(u8addr,u8value)函数将一个新的值写入器件的寄存器。
如果只写一个寄存器,则必须写入一个16位的值:
一个为寄存器的8位地址,后面跟一个8位的寄存器值。
要写寄存器。
5、参考文献
1、Si4432编程指南(中文)
2、Si4432.中文v3
三、项目设计总结
通过本次课设,我们基本实现了无线通讯,掌握其基本原理。
在一开始,通过学习stm32的视频资料结合以前学习的单片机知识,以及不断的查询资料,看程序代码,相互交流,经历了很多次失败,最终,在我们的的共同努力下,终于实现了课设的要求。
通过这次测试技术的实验,使我学到了不少实用的知识,更重要的是,做实验的过程,思考问题的方法,这与做其他的实验是通用的,真正使我们受益匪浅.
项目设计
评语
项目设计
成绩
指导教师
(签字)
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 河北 工程 stm32 si4432 无线通讯 系统