#include "SI4432_TX.h"
#include "UART.h"
extern unsigned char TX_Timeout;
//extern unsigned char TX_Reach; //发送定时 s
//extern unsigned char RSSI_Timeout;//RSSI刷新超时 s
uchar ItStatus; //发送接收中断
uchar RSSI; //RSSI
/*******************************************
函数名称: Delayus
功 能: 延时指定微秒(8M晶振)
参 数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
返回值 : 无
********************************************/
void Delayus(uint US)
{
uint i;
US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
for( i=0;i<US;i++);
}
/*******************************************
函数名称: Delayms
功 能: 延时指定毫秒(8M晶振)
参 数: MS--延时的毫秒数
返回值 : 无
********************************************/
void Delayms(uint MS)
{
uint i,j;
for( i=0;i<MS;i++)
for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
}
/***********************************************************************************************************
*函数:SPI_Init(void)
*功能: SPI引脚接口及状态初始化
**********************************************************************************************************/
void SPI_Init(void)
{
//Si4432_DDR| = (1<<Si4432_SDN)|(1<<Si4432_nSEL)|(1<<Si4432_SCLK)|(1<<Si4432_SDI)|(0<<Si4432_SDO)|(0<<Si4432_nIRQ); //配置控制管脚
DDRD |= (1<<2)|(1<<4)|(1<<7)|(1<<5)|(0<<6)|(0<<3);
//SPCR = (1<<SPE)|(1<<MSTR)|(0<<CPOL)|(0<<SPR0); //主机模式,fck/16, SPI方式0 使用模拟SPI时把这一行注释掉就OK
Hign_Si4432_nSEL;
Low_Si4432_SCLK;
}
/***********************************************************************************************************
*函数:uchar SPI_Byte(uchar data)
*功能:Si4432的SPI写时序
*说明:当第一位等于1是为写,等于0时为读。
**********************************************************************************************************/
uchar SPI_Byte(uchar data)
{
/*-----------------------标准硬件SPI-------------------------------------------
SPDR = data;
while(!(SPSR & (1<<SPIF) ))
{
}; // 等待SPI发送完毕
return SPDR;
----------------------以下是模拟SPI时序方式-------------------------------*///←使用标准SPI时,把这一行///前面的小星星移到上面这一行的/前面就OK
uchar i,temp=0;
Low_Si4432_SCLK;
for(i=0;i<8;i++)
{
if(data & 0x80)
{
Hign_Si4432_SDI;
}
else
{
Low_Si4432_SDI;
}
data <<= 1;
temp<<=1;
Hign_Si4432_SCLK ;
if(Read_Si4432_SDO)temp++;
Low_Si4432_SCLK;
}
return(temp);
/*----------------------------------------------------------------------------*/
}
/***********************************************************************************************************
*函数:uchar SPI_RW_Reg(uchar addr, uchar data)
*功能:用于读写数据,addr:为寄存器地址,data:为待读出或写入数据
**********************************************************************************************************/
uchar SPI_RW_Reg(uchar addr, uchar data)
{
uchar status;
Low_Si4432_nSEL;
SPI_Byte(addr);
status = SPI_Byte(data);
Hign_Si4432_nSEL;
return(status);
}
/***********************************************************************************************************
*函数:SPI_Read_Buf(uchar addr, uchar *data, uchar mun)
*功能: 用于读数据,addr:为寄存器地址,data:为待读出数据地址,number:读出数据的个数
**********************************************************************************************************/
void SPI_Read_Buf(uchar addr, uchar *data, uchar number)
{
//int status;
int number_ctr;
Low_Si4432_nSEL;
SPI_Byte(addr);
for(number_ctr=0;number_ctr<number;number_ctr++)
data[number_ctr] = SPI_Byte(0);
Hign_Si4432_nSEL;
}
/***********************************************************************************************************
函数:uchar SPI_Write_Buf(uchar addr, uchar *data, uchar number)
功能: 用于写数据:为寄存器地址,data:为待写入数据地址,number:写入数据的个数
**********************************************************************************************************/
void SPI_Write_Buf(uchar addr, uchar *data, uchar number)
{
//uchar status,number_ctr;
uchar number_ctr;
Low_Si4432_nSEL;
SPI_Byte(addr);
for(number_ctr=0; number_ctr<number; number_ctr++)
SPI_Byte(*data++);
Hign_Si4432_nSEL;
}
/***********************************************************************************************************
*函数:Si4432_init(void)
*功能: 用于初始化Si4432的SPI控制接口及寄存器
**********************************************************************************************************/
void Si4432_init(void)
{
SPI_Init();
Hign_Si4432_SDN;
Delayms(10);
Low_Si4432_SDN; //允许RF4432工作
Delayms(500);
SPI_RW_Reg(READ_REG + 0x03, 0x00); //清RF模块中断
SPI_RW_Reg(READ_REG + 0x04, 0x00);
SPI_RW_Reg(WRITE_REG + 0x06, 0x80); //使能同步字侦测
SPI_RW_Reg(WRITE_REG + 0x07, 0x01); //进入 Ready 模式
SPI_RW_Reg(WRITE_REG + 0x09, 0x7f); //负载电容= 12P
SPI_RW_Reg(WRITE_REG + 0x0a, 0x05); //关闭低频输出
SPI_RW_Reg(WRITE_REG + 0x0b, 0xea); //GPIO 0 当做普通输出口
SPI_RW_Reg(WRITE_REG + 0x0c, 0xea); //GPIO 1 当做普通输出口
SPI_RW_Reg(WRITE_REG + 0x0d, 0xf4); //GPIO 2 输出收到的数据
SPI_RW_Reg(WRITE_REG + 0x70, 0x2c);
SPI_RW_Reg(WRITE_REG + 0x1d, 0x40); //使能 afc
// 1.2K bps setting
SPI_RW_Reg(WRITE_REG + 0x1c, 0x1E); //修 改
SPI_RW_Reg(WRITE_REG + 0x20, 0x83);
SPI_RW_Reg(WRITE_REG + 0x21, 0xc0); //
SPI_RW_Reg(WRITE_REG + 0x22, 0x13); //
SPI_RW_Reg(WRITE_REG + 0x23, 0xa9); //
SPI_RW_Reg(WRITE_REG + 0x24, 0x00); //
SPI_RW_Reg(WRITE_REG + 0x25, 0x03); //修 改
SPI_RW_Reg(WRITE_REG + 0x2a, 0x20); //修 改
SPI_RW_Reg(WRITE_REG + 0x6e, 0x09);
SPI_RW_Reg(WRITE_REG + 0x6f, 0xd5);
//1.2K bps setting end
SPI_RW_Reg(WRITE_REG + 0x30, 0x8c); //使能PH+ FIFO模式,高位在前面,使能CRC校验
SPI_RW_Reg(WRITE_REG + 0x32, 0xff); //byte0, 1,2,3 作为头码
SPI_RW_Reg(WRITE_REG + 0x33, 0x42); //byte 0,1,2,3 是头码,同步字3,2 是同步字
SPI_RW_Reg(WRITE_REG + 0x34, 16); //发射16个Nibble的Preamble
SPI_RW_Reg(WRITE_REG + 0x35, 0x20); //需要检测4个nibble的Preamble
SPI_RW_Reg(WRITE_REG + 0x36, 0x2d); //同步字为 0x2dd4
SPI_RW_Reg(WRITE_REG + 0x37, 0xd4);
SPI_RW_Reg(WRITE_REG + 0x38, 0x00);
SPI_RW_Reg(WRITE_REG + 0x39, 0x00);
SPI_RW_Reg(WRITE_REG + 0x3a, 's'); //发射的头码为: “swwx"
SPI_RW_Reg(WRITE_REG + 0x3b, 'w');
SPI_RW_Reg(WRITE_REG + 0x3c, 'w');
SPI_RW_Reg(WRITE_REG + 0x3d, 'x');
SPI_RW_Reg(WRITE_REG + 0x3e, 10); //总共发射10个字节的数据
SPI_RW_Reg(WRITE_REG + 0x3f, 's'); //需要校验的头码为:”swwx"
SPI_RW_Reg(WRITE_REG + 0x40, 'w');
SPI_RW_Reg(WRITE_REG + 0x41, 'w');
SPI_RW_Reg(WRITE_REG + 0x42, 'x');
SPI_RW_Reg(WRITE_REG + 0x43, 0xff); //头码1,2,3,4 的所有位都需要校验
SPI_RW_Reg(WRITE_REG + 0x44, 0xff); //
SPI_RW_Reg(WRITE_REG + 0x45, 0xff); //
SPI_RW_Reg(WRITE_REG + 0x46, 0xff); //
SPI_RW_Reg(WRITE_REG + 0x6d, 0x07); //发射功率设置 0x00:+0dBM 0x01:+3dBM 0x02:+6dBM 0x03:+9dBM 0x04:+11dBM 0x05:+14dBM 0x06:+17dBM 0x07:20dBM
SPI_RW_Reg(WRITE_REG + 0x79, 0x0); //不需要跳频
SPI_RW_Reg(WRITE_REG + 0x7a, 0x0); //不需要跳频
SPI_RW_Reg(WRITE_REG + 0x71, 0x22); //发射不需要CLK,FiFo,FSK模式
SPI_RW_Reg(WRITE_REG + 0x72, 0x50); //频偏为 50KHz 修 改
SPI_RW_Reg(WRITE_REG + 0x73, 0x0); //没有频率偏差
SPI_RW_Reg(WRITE_REG + 0x74, 0x0); //没有频率偏差
SPI_RW_Reg(WRITE_REG + 0x75, 0x53); //频率设置 434
SPI_RW_Reg(WRITE_REG + 0x76, 0x62); // 修 改
SPI_RW_Reg(WRITE_REG + 0x77, 0x00);
TX0_RX0; // 天线开关不在发射,接收状态
}
/***********************************************************************************************************
*函数:uchar RF4432_RSSI(void)
*功能: 用于Si4432查询中断是否为 侦测到同步字 中断
************************************
- 1
- 2
前往页