本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
源码主函数:
#include "compiler_defs.h"
#include "C8051F930_defs.h"
#include "Si4432.h"
#include "8051SPI.h"
#include "stdio.h"
char spi_in = 0x41;
void HW_Init (void)
{
XBR0 = 0x03; // UART0使能位置1,启动串口;SPI0使能开启SCK、MISO 和MOSI(对SPI0)连到端口引脚
XBR1 = 0x60; // SPI1三线或四线连接到P1.0-1.2引脚,T1定时器输入连到端口引脚
XBR2 = 0x40; // 交叉开关使能以及弱上拉使能
OSCICN |= 0x80; // 内部24.4224MHz振荡器晶振使能
CLKSEL = 0x00; // 选择精确的内部时钟为系统时钟
SCON0 = 0x10; // 波特率可编程的8位UART
TH1 = 0x96; // 设置波特率为9600,波特率=0.5*(时钟频率/(256-TH1)) [TH1=0x96=150]
CKCON = 0x00; // 定时器1使用系统时钟的12分频,约为2MHz左右
TL1 = TH1;
TMOD |= 0x20; // 方式2,常数自动装载的8位定时计数器
TR1 = 1; // 启动定时器1
ES0 = 1; // 开UART0中断
}
void main (void)
{
PCA0MD &= ~0x40; // 关闭看门狗
HW_Init(); // C8051芯片硬件初始化
SetHwMasterSpi(); // 8051的SPI端口初始化,8051作为主芯片,4432为从芯片
RfInitHw(); // RF芯片硬件初始化
EA = 1; // 打开CPU中断
RFRxOn(); // 打开RF接收状态
while(1)
{
char spi_in = 0x41;
SPI1DAT = spi_in; //write data into the SPI register
while( SPIF1 == 0); //wait for sending the data
SPIF1 = 0;
}
}
初始化子函数:
void HW_Init (void)
{
XBR0 = 0x03; // UART0使能位置1,启动串口;SPI0使能开启SCK、MISO 和MOSI(对SPI0)连到端口引脚
XBR1 = 0x60; // SPI1三线或四线连接到P1.0-1.2引脚,T1定时器输入连到端口引脚
XBR2 = 0x40; // 交叉开关使能以及弱上拉使能
OSCICN |= 0x80; // 内部24.4224MHz振荡器晶振使能
CLKSEL = 0x00; // 选择精确的内部时钟为系统时钟
SCON0 = 0x10; // 波特率可编程的8位UART
TH1 = 0x96; // 设置波特率为9600,波特率=0.5*(时钟频率/(256-TH1)) [TH1=0x96=150]
CKCON = 0x00; // 定时器1使用系统时钟的12分频,约为2MHz左右
TL1 = TH1;
TMOD |= 0x20; // 方式2,常数自动装载的8位定时计数器
TR1 = 1; // 启动定时器1
ES0 = 1; // 开UART0中断
}
void SetHwMasterSpi(void)
{
SPI1CFG = 0x40; // 8051作为主器件, 位CKPHA=0[数据以SCK 周期的第一个边沿为中心]
// 位CKPOL=0[SCK 在空闲状态时处于低电平]
SPI1CN = 0x00; // SPI1各标志位清零,选择3线从方式或3线主方式,NSS信号不连到端口引脚
SPI1CKR = (SYSCLK/(2*SPI_CLOCK))-1; // SPI1频率=(系统时钟频率/(2*(SPICKR+1)))
SPI1EN = 1; // 片选SPIn使能位开启
RF_NSEL_PIN = 1; // 使能引脚高电平复位
}
void RfInitHw(void)
{
RFReadRegister(InterruptStatus1); // 读取中断寄存器来初始化Si4432中断(寄存器0x03)
RFReadRegister(InterruptStatus2); // 读取中断寄存器来初始化Si4432中断(寄存器0x04)
RFWriteRegister(OperationFunctionControl1,0x80); // 复位所有SPI寄存器为默认状态 (寄存器0x07)
//delay_nms(100);//延时等待
RFReadRegister(InterruptStatus1); // 读取中断寄存器来初始化Si4432中断(寄存器0x03)
RFReadRegister(InterruptStatus2); // 读取中断寄存器来初始化Si4432中断(寄存器0x04)
RFWriteRegister(TXRampControl,0x7F); // 设置波形跳转时间为20us (寄存器0x52)
//delay_nms(10);
RFWriteRegister(AFCLoopGearshiftOverride,0x00); // 关闭频率自动控制 (寄存器0x1D)
// fcarrier = (fb+24+(fc+fo) / 64000) x 10000 x (hbsel+1) + (fhch x fhs x 10) [kHz]
RFWriteRegister(FrequencyBandSelect,0x53); // 设置载频为433MHz (寄存器0x75)
RFWriteRegister(NominalCarrierFrequency1,0x4b); // (寄存器0x76)
RFWriteRegister(NominalCarrierFrequency0,0x00); // (寄存器0x77)
RFWriteRegister(ModulationModeControl1,0x00); // (寄存器0x70)
RFWriteRegister(ModulationModeControl2,0x22); // 采用FSK调制,FIFO模式,TX数据时钟采用异步模式(寄存器0x71)
RFWriteRegister(TXPower,0x03); // 设置TX发送功率为20dBm (寄存器0x6D)
RFWriteRegister(HeaderControl2,0x02); // 同步字节3、2 (寄存器0x33)
RFWriteRegister(HeaderControl1,0x00); // 没有广播地址,没有校验字节
RFWriteRegister(PreambleLength,0x04); // 数据包中有4个半字节数,即两个字节
RFWriteRegister(PreambleDetectionControl,0x10); // 处理两个半字节
RFWriteRegister(SyncWord3,0x2d); // 同步字符
RFWriteRegister(SyncWord2,0xd4);
RFWriteRegister(DataAccessControl,0x88); // 使能数据包处理
RFWriteRegister(IFFilterBandwidth,0x03);
RFWriteRegister(CLKRecoveryOversamplingRatio,0xa1);
RFWriteRegister(CLKRecoveryOffset2,0x20);
RFWriteRegister(CLKRecoveryOffset1,0x4e);
RFWriteRegister(CLKRecoveryOffset0,0xa5);
RFWriteRegister(CLKRecoveryTimingLoopGain1,0x00);
RFWriteRegister(CLKRecoveryTimingLoopGain0,0x36);
RFWriteRegister(TXDataRate1,0x02);
RFWriteRegister(TXDataRate0,0x75);
RFWriteRegister(FrequencyDeviation,0x48);
RFWriteRegister(CLKRecoveryGearshiftOverride,0x13);
RFWriteRegister(GPIO0Configuration,0x1f); // GPIO配置
RFWriteRegister(GPIO1Configuration,0x12); // TX状态
RFWriteRegister(GPIO2Configuration,0x15); // 发送状态
RFWriteRegister(OperationFunctionControl2,0x02); // 清接收FIFO
RFWriteRegister(OperationFunctionControl2,0x00);
RFWriteRegister(InterruptEnable1,0x02); // 使能数据包接收
}
// 进入接收模式
void RFRxOn(void)
{
RFWriteRegister(OperationFunctionControl1,0x01); // 进入准备模式
//delay_nms(1);
RFWriteRegister(OperationFunctionControl2,0x02); // 清接收FIFO
RFWriteRegister(OperationFunctionControl2,0x00);
//使能接收,因为用的是中断接收,因此一定要打开,否则经过发送之后就不能再次接收
RFWriteRegister(InterruptEnable1,0x02); // 有效数据包接收中断使能
RFWriteRegister(OperationFunctionControl1,0x05); // 打开接收
}
本人用示波器测量SPI MOSI(P1.2)管脚没有信号波形,SPI SCK(P1.0)也没有时钟信号波形。
RF芯片是Si4432。
请高手指点,谢谢。 |