yeqin2010 发表于 2010-3-23 09:15:00

SI4432,还是调不出来,请高人指点下(附程序)

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ FUNCTION NAME:void SPI_M8PortInit(void)
+
+ DESCRIPTION:    Initialize the M8 SPI port
+
+        INPUT:                        data
+
+ RETURN:         None
+
+ NOTES:          Itcontrol the nSEL pin
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void SPI_M8PortInit(void)
{
        SCK_OUT;
        SCK_0;
      SDI_OUT;
      SDI_1;
      SDO_IN;
      SDO_1;
      NSEL_OUT;
      NSEL_1;
      Set_NIRQin;
      NIRQ_1;
      SDN_OUT;
      SDN_0;
}


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ FUNCTION NAME:uint16 MAKEUINT(uint8 data1,uint8 data2)
+
+ DESCRIPTION:    makeuint8 to uint16
+
+        INPUT:                data1 and data2       
+
+ RETURN:      
+
+ NOTES:         
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

uint16 MAKEUINT(uint8 data1,uint8 data2)
{
uint16 WORD;

      WORD=data1;
      WORD=WORD<<8;
      WORD=WORD|data2;
      
return WORD;

}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ FUNCTION NAME:uint16 RFRegCon(uint8 reg,uint8 cmd)
+
+ DESCRIPTION:    sends 16 length data to read or write register through the SPI port
+
+        INPUT:                register and control data       
+
+ RETURN:      value of the register
+
+ NOTES:         
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
uint16 RFRegCon(uint8 reg,uint8 cmd){
      SDO_IN;
        uint8 ri;
      uint16 temp=0,value;
      value=MAKEUINT(reg,cmd);
      SCK_0;
      NSEL_0;
      for(ri=0;ri<16;ri++){
      SCK_0;
      if(0x8000&value){
      SDI_1;
      }
      else{
      SDI_0;
      }
      
      SCK_1;
      value<<=1;
      temp<<=1;
      if(Read_SDO){
      temp|=0x0001;
      }
}
SCK_0;
SDO_OUT;
NSEL_1;

return temp;
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ FUNCTION NAME:voidRfChipInit(void)
+
+ DESCRIPTION:   
+
+        INPUT:       
+
+ RETURN:         none
+
+ NOTES:      
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
voidRfChipInit()
{

RFRegCon((REG_WRITE | OperatingFunctionControl1), 0x80);
RFRegCon((REG_WRITE | TXRampControl), 0x7F);
RFRegCon((REG_WRITE | AFCLoopGearshiftOverride), 0x00);
RFRegCon((REG_WRITE | FrequencyBandSelect), 0x53);    //set frequency
RFRegCon((REG_WRITE | NominalCarrierFrequency1), 0x4b);//433HZ
RFRegCon((REG_WRITE | NominalCarrierFrequency0), 0x00);
RFRegCon((REG_WRITE | ModulationModeControl1), 0x00);
RFRegCon((REG_WRITE | ModulationModeControl2), 0x22); //asynchronous modeFSK

RFRegCon((REG_WRITE | HeaderControl2), 0x02); //no head; sync word 3 and 2
RFRegCon((REG_WRITE | HeaderControl1), 0x00);
RFRegCon((REG_WRITE | PreambleLength), 0x04);   //2byte
RFRegCon((REG_WRITE | PreambleDetectionControl), 0x10); //8bit
RFRegCon((REG_WRITE | SyncWord3), 0x2d);
RFRegCon((REG_WRITE | SyncWord2), 0xd4);
//RFRegCon((REG_WRITE | TransmitPacketLength), 0x40);
RFRegCon((REG_WRITE | DataAccessControl), 0x88); //enable TX handling

RFRegCon((REG_WRITE | IFFilterBandwidth), 0x03); //BW=90kHZ
RFRegCon((REG_WRITE | ClockRecoveryOversamplingRatio), 0xa1);
RFRegCon((REG_WRITE | ClockRecoveryOffset2), 0x20);
RFRegCon((REG_WRITE | ClockRecoveryOffset1), 0x4e);
RFRegCon((REG_WRITE | ClockRecoveryOffset0), 0xa5);
RFRegCon((REG_WRITE | ClockRecoveryTimingLoopGain1), 0x00);
RFRegCon((REG_WRITE | ClockRecoveryTimingLoopGain0), 0x36);
RFRegCon((REG_WRITE | TXDataRate1), 0x02); //9600BPS
RFRegCon((REG_WRITE | TXDataRate0), 0x75);
RFRegCon((REG_WRITE | FrequencyDeviation), 0x48);
RFRegCon((REG_WRITE | ClockRecoveryGearshiftOverride), 0x13);
RFRegCon((REG_WRITE | GPIO0Configuration), 0x1f);
RFRegCon((REG_WRITE | GPIO1Configuration), 0x12); //GPIO_1 TX state
RFRegCon((REG_WRITE | GPIO2Configuration), 0x15); //GPIO_2 RX state
RFRegCon((REG_WRITE | OperatingFunctionControl2), 0x02);
RFRegCon((REG_WRITE | OperatingFunctionControl2), 0x00);
RFRegCon((REG_WRITE | InterruptEnable1), 0x02);

}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ FUNCTION NAME:voidRFTransmitByte(uint8 data)
+
+ DESCRIPTION:   
+
+        INPUT:       
+
+ RETURN:         none
+
+ NOTES:      
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
voidRFTransmitByte(uint8 data)
{

    uint8ItStatus1,ItStatus2;
//release all IT flag
ItStatus1 = (uint8)(RFRegCon(InterruptStatus1,0));
ItStatus2 = (uint8)(RFRegCon(InterruptStatus2,0));
if((ItStatus1&0x04)==0x00)
{


/* */
//clear FIFO
RFRegCon(REG_WRITE | OperatingFunctionControl1, 0x01);   
RFRegCon(REG_WRITE | OperatingFunctionControl2, 0x01);
RFRegCon(REG_WRITE | OperatingFunctionControl2, 0x00);

RFRegCon(REG_WRITE | InterruptEnable1, 0x00);
RFRegCon(REG_WRITE | InterruptEnable2, 0x00);
//set packet content
RFRegCon(REG_WRITE | TransmitPacketLength, 1);
//set data
RFRegCon(REG_WRITE | FIFOAccess, data);
//enable transmitter
RFRegCon(REG_WRITE | OperatingFunctionControl1, 0x09);
//enable the wanted ITs
RFRegCon(REG_WRITE | InterruptEnable1, 0x04);        //发送完中断允许
RFRegCon(REG_WRITE |InterruptEnable2, 0x00);
   

}
while(Read_NIRQ==1)
{


;
}

ledO1_UP;
delay_nms(500);
ledO1_DOWN;
delay_nms(500);


}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ FUNCTION NAME:voidRFReceiveReady(void)
+
+ DESCRIPTION:   
+
+        INPUT:       
+
+ RETURN:         none
+
+ NOTES:      
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
uint8 RFReceiveReady()
{
uint8 index,yyy,ttt,data;
RFRegCon((REG_WRITE | OperatingFunctionControl2), 0x02);
RFRegCon((REG_WRITE | OperatingFunctionControl2), 0x00);
RFRegCon((REG_WRITE | OperatingFunctionControl1), 0x05);

while(1)
{
yyy = RFRegCon((REG_READ | InterruptStatus1),0x00);
if(yyy&0x02) break;
   ledO1_UP;
delay_nms(500);
}


ledO1_DOWN;

delay_nms(500);

RFRegCon((REG_WRITE | OperatingFunctionControl1), 0x01);
RFRegCon((REG_WRITE | ReceivedPacketLength),1 );

data=RFRegCon((REG_READ | FIFOAccess),0x00);
return data;


}

yeqin2010 发表于 2010-3-23 09:37:59

两个模块不能互相通信,因为没有频谱仪,用示波器测了下TX有信号出来!

maoweikeji 发表于 2010-3-23 10:56:20

www.moreway.net。下一个4432的应用手册看看吧。比较详细

fatdong 发表于 2010-3-31 16:03:41

呃 想问下REG_WRITE | OperatingFunctionControl1是什么意思 是在哪预定义的?
页: [1]
查看完整版本: SI4432,还是调不出来,请高人指点下(附程序)