MSP430平台下实现Si4432的收发数据

Si4432芯片是Silicon Labs公司推出集成度、低功耗、多频段的EZRadioPRO系列无线收发芯片。可以工作在433M免费频段。早期生产的V2版本的不太稳定,经过SI公司改进后,B1版本的性能比较稳定,最大功率可以到20dBm(100mw),接收灵敏度可以到-121dbm,工作电压为1.9~3.6 V,20引脚QFN封装(4 mm×4 mm),可工作在315/433/868/915 M...
摘要由CSDN通过智能技术生成

Si4432芯片是Silicon Labs公司推出集成度、低功耗、多频段的EZRadioPRO系列无线收发芯片。可以工作在433M免费频段。早期生产的V2版本的不太稳定,经过SI公司改进后,B1版本的性能比较稳定,最大功率可以到20dBm(100mw),接收灵敏度可以到-121dbm,工作电压为1.9~3.6 V,20引脚QFN封装(4 mm×4 mm),可工作在315/433/868/915 MHz四个频段;内部集成分集式天线、功率放大器、唤醒定时器、数字调制解调器、64字节的发送和接收数据FIFO,以及可配置的GPIO等。因其发射功率大,接收灵敏度高,可以传输到上千米的距离,素有"穿墙王"之称。他与NRF905、CC1101无线模块相比,距离远好几倍,具有很高的性价比。

下面以MSP430为例,详细介绍其使用。

1、          初始化

Si4432对外以SPI接口形式实现互连,考虑到通用性,这里以软件模拟的方式实现读和写操作。

void SPI_Write(uint8 txdata)
{
         uint8 i;
         for (i = 0;i < 8;i++)
         {
                  if (txdata&0x80)     //总是发送最高位
                  {
                  RF4432_SDI_1;
                  }
                  else
                  {
                RF4432_SDI_0;
                  }
                  RF4432_SCLK_1;
                  txdata = txdata<<1;
                  RF4432_SCLK_1;   
         }
} 
SPI_Write(uint8 txdata)
{
         uint8 i;
         for (i = 0;i < 8;i++)
         {
                  if (txdata&0x80)     //总是发送最高位
                  {
                  RF4432_SDI_1;
                  }
                  else
                  {
                RF4432_SDI_0;
                  }
                  RF4432_SCLK_1;
                  txdata = txdata<<1;
                  RF4432_SCLK_1;   
         }
} 
 

RF4432_SDI_1、RF4432_SDI_0为宏定义,代表430输出高电平和低电平,连接至si4432芯片的14引脚(即SDI)。RF4432_SCLK_1、RF4432_SCLK_1连接至si4432芯片的15引脚(即SCLK),每一次循环均将左移后的txdata高位发送至si4432。

 

uint8 SPI_Read(void)
{
         uint8 i,rxdata;
         rxdata = 0x00;
         for (i = 0;i < 8;i++)
         {
                  rxdata = rxdata<<1;
                  RF4432_SCLK_1;
                  if (RF4432_SDO_IN)      //读取最高位,保存至最末尾,通过左移位完成整个字节
                  {
                            rxdata |= 0x01;
                  }
                  else
                  {
                            rxdata &= ~0x01;
                  }
                  delay_us(20);         
                  RF4432_SCLK_0;
                  delay_us(20);         
          }
          return rxdata; 
}

 

 

 

 

 

RF4432_SDO_IN连接至si4432的13引脚(即SDO),每一次循环从si4432读取一位数据,一个for循环实现读取一个字节的目的。 

有了SPI_Write()和SPI_Read(),我们就可以实现430对si4432相应地址的寄存器的读写操作了。

 

uint8  RF4432_ReadReg(uint8  addr)
{
         uint8 value;
         RF4432_SEL_0;                 
         SPI_Write(addr|RR);     
         value = SPI_Read();         
         RF4432_SEL_1;        
         return value;
}
void  RF4432_WriteReg(uint8  addr, uint8 value)
{
         RF4432_SEL_0;                 
         SPI_Write(addr|WR);     
         SPI_Write(value);         
         RF4432_SEL_1;                 
}

RF4432_SEL_0、RF4432_SEL_1连接至si4432的16引脚(即片选nSEL),nSEL处于低电平时导通,完成读操作后,关闭片选信号。RR也为宏定义0x00,WR为0x80,即最高位一个是0,一个是1.该位为指示位,即告诉si4432接下来是读操作还是写操作。 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#ifndef _SI4432_TX_H #define _SI4432_TX_H #include <iom16.h> //包含型号头文件 //#include <iomacro.h> //包含"位"操作头文件 /******************数据类型宏定义******************/ #define uchar unsigned char #define uint unsigned int //***********************************Si4432接口定义******************************************* #define Si4432_SDN DDRD|=(1<<2) //输出1 关闭输入引脚 #define Si4432_nSEL DDRD|=(1<<4) //输出1 SPI片选 #define Si4432_SCLK DDRD|=(1<<7) //输出1 SPI时钟 #define Si4432_SDI DDRD|=(1<<5) //输出1 从SPI数据输入脚 #define Si4432_SDO PIND & (1<<6) //输入0 从SPI数据输出脚 #define Si4432_nIRQ PIND & (1<<3) //输入0 中断输出引脚 #define Hign_Si4432_SDN PORTD |= (1 << 2) #define Low_Si4432_SDN PORTD &= ~(1 << 2) #define Hign_Si4432_nSEL PORTD |= (1 << 4) #define Low_Si4432_nSEL PORTD &= ~(1 << 4) #define Hign_Si4432_SCLK PORTD |= (1 << 7) #define Low_Si4432_SCLK PORTD &= ~(1 << 7) #define Hign_Si4432_SDI PORTD |= (1 << 5) #define Low_Si4432_SDI PORTD &= ~(1 << 5) #define Read_Si4432_SDO PIND &(1 << 6) #define Read_Si4432_nIRQ PIND &(1 << 3) //***************************************Si4432寄存器指令******************************************************* #define READ_REG 0x00 //读寄存器指令 #define WRITE_REG 0x80 //写寄存器指令 #define TX1_RX0 SPI_RW_Reg(WRITE_REG + 0x0e, 0x01) //发射状态的天线开关定义 #define TX0_RX1 SPI_RW_Reg(WRITE_REG + 0x0e, 0x02) //接收状态的天线开关定义 #define TX0_RX0 SPI_RW_Reg(WRITE_REG + 0x0e, 0x00) //非发射,接收状态的天线开关定义 #define TxBuf_Len 10 #define RxBuf_Len 10 //定义RF4432数据包长度 void SPI_Init(void); uchar SPI_Byte(uchar data); uchar SPI_RW_Reg(uchar addr, uchar data); void SPI_Read_Buf(uchar addr, uchar *data, uchar number); void SPI_Write_Buf(uchar addr, uchar *data, uchar number); void Si4432_init(void); uchar RF4432_RSSI(void); uchar RF4432_RxPacket(void); void SetRX_Mode(void); void SetTX_Mode(uchar *Tx_Buf); //void SI4432RxTx(void); #endif

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值