电子系统实习报告Word下载.docx
《电子系统实习报告Word下载.docx》由会员分享,可在线阅读,更多相关《电子系统实习报告Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
支持快速唤醒和最低0.9V的供电;
有多种电源管理模式(如正常模式、空闲模式、休眠模式等),内部集成的2个内建欠压检测器分别适用于休眠模式和正常模式,典型休眠模式下电流仅为50nA。
C8051F930包含1个高效率直流升压转换器,最多提供65mW给内部微控制器和其他元器件,为了减少正常模式下的电池耗电,C8051F930的省电架构能将操作模式下的电流减小到170μA/MHz。
C8051F930可以通过内置增强型SPI对Si4432的内部寄存器进行读写操作,灵活配置各项参数。
通过SPI接口完成对Si4432的初始化配置、读写数据、访问FIFO等操作。
使用4线SPI,即MOSI、MISO、SCK和nSEL。
MOSI用于从C8051F930到Si4432的串行数据传输;
MI-SO用于从Si4432到C8051F930的串行数据传输;
SCK用于同步C8051F930和Si4432之间在MOSI和MISO线上的串行数据传输;
nSEL作为片选信号,只有片选信号为低电平时,对Si4432的操作才有效。
硬件设计原理图如图2所示。
Si4432的13~16脚是标准的SPI接口,17脚(nIRQ)是中断状态输出引脚。
当FIFO溢出、有有效的数据包发送或接收、CRC错误、检测到前导位和同步字、上电复位等情况发生,且相应的中断被使能时,17脚都会产生一个低电平以通知C8051F930有中断产生。
20脚(SDN)决定了Si4432芯片的工作状态。
当SDN接地(SDN=0)时,芯片处于常规工作模式;
接高电平(SDN=1)时,芯片处于掉电模式。
掉电模式下寄存器中的内容会丢失,且不允许SPI访问,但芯片的电流损耗只有10nA,功耗很低,因此适合要求极低功耗的应用。
在连接到电源后,在SDN的下降沿上电复位,根据指令转换到其他工作模式。
为了达到较好的通信效果,Si4432的接收低噪声放大器匹配电路和发射功率放大器匹配电路的阻容参数,应严格按照数据手册提供的参数选型。
前端的分集式电路采用SKY13267,其V1脚和V2脚分别连接Si4432的GPIO1和GPIO2。
通过这款交叉开关实现分集式天线发送和接收通道的自动切换。
四、参数选择:
PCB设计的注意事项
PCB设计对整个系统的性能影响很大。
以下是设计Si4432的PCB时需要注意的地方:
①为了消除走线间的感性效应,应在PCB上空余的地方尽量多布置一些过孔。
为了达到较好的射频通信效果,应对整个PCB都覆地铜。
当提供了一个较好的RF地之后,TX/RX区域的对地敷铜区有助于减少甚至避免辐射干扰。
②电源接入端要添加去耦电容,且尽量靠近Si4432芯片。
滤波电容也应该尽量靠近相应引脚,这样可以得到更好的滤波性能。
③Si4432的外围元件很少,应尽量使用体积小的0402封装贴片器件。
其中,电感属于关键器件,需选用高精度电感。
④Si4432的扼流电感L1应尽量靠近Tx引脚;
并联在RXn和RXp上的电感L2在PCB平面上应与L1垂直布局,Tx通道上的电感L1、L3、L4、L5的方向需保证互相垂直以减少耦合;
Tx通道和RXn/p通道之间未布线的区域应以接地的覆铜隔离开来,Tx通道匹配电路的布线区应尽可能不要占用太大的板上区域。
⑤晶振的选择参照以下参数:
等效串联电阻是60Ω,负载电容是12pF,频率准确度是±
20×
10-6。
让晶振与芯片的晶振接入引脚尽量靠近,并用地线把时钟区隔离起来。
⑥设计PCB时,QFN封装的Si4432芯片底部接地。
在Si4432芯片底部打9个12mil(1000mail="
25"
.4mm)大小的接地过孔,以确保良好的接地和散热能力,增强通信可靠性。
⑦板上的走线尽可能不要经过Tx/RXn/p区域,以防止匹配网络的耦合效应。
制作完成实物图
五、软件设计:
#include"
config.h"
si4432.h"
#defineSPI_CS(1<
<
7)//P0.8,你按自己的实际结法改一改
#defineCS_Low()(IO0CLR|=SPI_CS)//
#defineCS_High()(IO0SET|=SPI_CS)
#defineBeep(1<
22)
#defineBeep_Low()(IO0CLR|=Beep)//
#defineBeep_High()(IO0SET|=Beep)
#defineUART_BPS9600//串口通讯波特率
voidDelayNS(uint32dly)
{
uint32i;
for(;
dly>
0;
dly--)
for(i=0;
i<
5000;
i++);
}
/*
*********************************************************************************************************
**函数名称:
UART0_Init()
**函数功能:
串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率115200。
**入口参数:
无
**出口参数:
*/
voidUART0_Init(void)
uint16Fdiv;
U0LCR=0x83;
//DLAB=1,允许设置波特率
Fdiv=(Fpclk/16)/UART_BPS;
//设置波特率
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03;
UART0_SendByte()
向串口发送字节数据,并等待发送完毕,查询方式。
dat要发送的数据
voidUART0_SendByte(uint8dat)
U0THR=dat;
while((U0LSR&
0x40)==0);
//等待数据发送完毕
UART0_SendStr()
向串口发送一字符串
str要发送的字符串的指针
voidUART0_SendStr(uint8const*str)
while
(1)
{
if(*str=='
\0'
)break;
//遇到结束符,退出
UART0_SendByte(*str++);
//发送数据
}
voidBeepIni(void)
PINSEL1=PINSEL1&
&
(~(0x3<
12));
Beep_High();
voidSpiIni(void)
PINSEL0=(PINSEL0&
(~(0xFF<
8)))|(0x15<
8);
//注意是0x15,而不是0x55
SPCCR=0x52;
//设置SPI时钟为输入晶振的1/82
SPCR=(0<
3)|//
(0<
4)|//
(1<
5)|//设置SPI为主机模式
6)|//SPI数据传输为高位在前
7);
//禁止SPI中断
IO0DIR|=SPI_CS;
CS_High();
uint8SpiSendReceiveData(uint8data)
SPDR=data;
while(0==(SPSR&
0x80));
returnSPDR;
/*uint8Si4432_Register(uint8addr,uint8data)
uint8i;
CS_Low();
SpiSendReceiveData(addr);
i=SpiSendReceiveData(data);
returni;
}
voidSi4432_WriteRegister(uint8addr,uint8data)
chartempcmd,i;
tempcmd=(0x80|addr);
SpiSendReceiveData(tempcmd);
uint8Si4432_ReadRegister(uint8addr)
uint8tempcmd,i;
tempcmd=(0x7F&
addr);
i=SpiSendReceiveData(0x00);
voidSpiBurstWriteByte(uint8addr,uint8*sendbuffer,uint8length)
chartempcmd,i,j;
for(i=0;
length;
i++)
j=SpiSendReceiveData(sendbuffer[i]);
voidSpiBurstReadByte(uint8addr,uint8*receivebuffer,uint8length)
for(i=0;
receivebuffer[i]=SpiSendReceiveData(0x00);
/************************************************************************************
Si4432_Init()
si4432的初始化
************************************************************************************/
voidSi4432_Init(void)
{
Si4432_WriteRegister(OperatingFunctionControl1,0x80);
Si4432_WriteRegister(TXRampControl,0x7F);
Si4432_WriteRegister(AFCLoopGearshiftOverride,0x00);
Si4432_WriteRegister(FrequencyBandSelect,0x53);
//setfrequency
Si4432_WriteRegister(NominalCarrierFrequency1,0x4b);
//433MHZ
Si4432_WriteRegister(NominalCarrierFrequency0,0x00);
Si4432_WriteRegister(ModulationModeControl1,0x00);
Si4432_WriteRegister(ModulationModeControl2,0x23);
//asynchronousmodeGFSK
Si4432_WriteRegister(HeaderControl2,0x02);
//nohead;
syncword3and2
Si4432_WriteRegister(HeaderControl1,0x00);
Si4432_WriteRegister(PreambleLength,0x04);
//2byte
Si4432_WriteRegister(PreambleDetectionControl,0x10);
//8bit
Si4432_WriteRegister(SyncWord3,0x2d);
Si4432_WriteRegister(SyncWord2,0xd4);
//Si4432_WriteRegister(TransmitPacketLength),0x40);
Si4432_WriteRegister(DataAccessControl,0x88);
//enableTXhandling
Si4432_WriteRegister(IFFilterBandwidth,0x03);
//BW=90kHZ
Si4432_WriteRegister(ClockRecoveryOversamplingRatio,0xa1);
Si4432_WriteRegister(ClockRecoveryOffset2,0x20);
Si4432_WriteRegister(ClockRecoveryOffset1,0x4e);
Si4432_WriteRegister(ClockRecoveryOffset0,0xa5);
Si4432_WriteRegister(ClockRecoveryTimingLoopGain1,0x00);
Si4432_WriteRegister(ClockRecoveryTimingLoopGain0,0x36);
Si4432_WriteRegister(TXDataRate1,0x02);
//9600BPS
Si4432_WriteRegister(TXDataRate0,0x75);
Si4432_WriteRegister(FrequencyDeviation,0x48);
Si4432_WriteRegister(ClockRecoveryGearshiftOverride,0x13);
Si4432_WriteRegister(GPIO0Configuration,0x1f);
Si4432_WriteRegister(GPIO1Configuration,0x12);
//GPIO_1TXstate
Si4432_WriteRegister(GPIO2Configuration,0x15);
//GPIO_2RXstate
Si4432_WriteRegister(OperatingFunctionControl2,0x02);
Si4432_WriteRegister(OperatingFunctionControl2,0x00);
Si4432_WriteRegister(InterruptEnable1,0x02);
voidRF_R(uint8*d)
uint8index,yyy,ttt;
Si4432_WriteRegister(OperatingFunctionControl1,0x05);
while
(1)
yyy=Si4432_ReadRegister(InterruptStatus1);
if(yyy&
0x02)break;
Si4432_WriteRegister(OperatingFunctionControl1,0x01);
ttt=Si4432_ReadRegister(ReceivedPacketLength);
for(index=0;
index<
ttt;
index++)
d[index]=Si4432_ReadRegister(FIFOAccess);
voidRF_T(uint8*d,uint8l)
uint8i,temp;
Si4432_WriteRegister(OperatingFunctionControl2,0x01);
Si4432_WriteRegister(InterruptEnable1,0x00);
Si4432_WriteRegister(InterruptEnable2,0x00);
Si4432_WriteRegister(TransmitPacketLength,l);
for(i=0;
l;
i++)
temp=d[i];
Si4432_WriteRegister(FIFOAccess,temp);
Si4432_WriteRegister(OperatingFunctionControl1,0x09);
Si4432_WriteRegister(InterruptEnable1,0x04);
//
while((Si4432_ReadRegister(InterruptStatus1)&
0x04)==0);
////////////////////////////////////////////////////////
intmain(void)
{//addusersourcecode
uint8dat=0;
uint8testdata[33]="
刘荣啊,醒醒吧,你老了,是时候。
"
;
uint8getbuffer[128]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
//uint8senddata[2]={0xAA,0x55};
//uint8getdata[2]={0x0,0x0};
uint8i;
PINSEL0=0x00000005;
//设置I/O连接到UART0
UART0_Init();
SpiIni();
//Si4432_Init();
//SpiBurstWriteByte(0x00,testdata,32);
DelayNS(1000);
//SpiBurstReadByte(0x00,getbuffer,32);
//SpiBurstReadByte(0x00,getbuffer,128);
//RF_T(testdata,32);
//DelayNS(80000);
dat=Si4432_ReadRegister(0x06);
while
(1)
UART0_SendByte(dat);
/*while
(1)
for(i=0;
32;
UART0_SendByte(getbuffer[i]);
DelayNS(10000);
return0;
/*********************************************************************************************************
**EndOfFile
**********************