哎!怎么说呢?si4432停在发射这里了,出不去!
我是这样设置的,参考了论坛里面的一些资料void RfInitHw(void)
{
SpiWriteAddressData((REG_WRITE | OperatingFunctionControl1), 0x80);
SpiWriteAddressData((REG_WRITE | TXRampControl), 0x7F);
SpiWriteAddressData((REG_WRITE | AFCLoopGearshiftOverride), 0x00);
SpiWriteAddressData((REG_WRITE | FrequencyBandSelect), 0x53); //set frequency
SpiWriteAddressData((REG_WRITE | NominalCarrierFrequency1), 0x4b);//433HZ
SpiWriteAddressData((REG_WRITE | NominalCarrierFrequency0), 0x00);
SpiWriteAddressData((REG_WRITE | ModulationModeControl1), 0x00);
SpiWriteAddressData((REG_WRITE | ModulationModeControl2), 0x22); //asynchronous modeFSK
SpiWriteAddressData((REG_WRITE | HeaderControl2), 0x02); //no head; sync word 3 and 2
SpiWriteAddressData((REG_WRITE | HeaderControl1), 0x00);
SpiWriteAddressData((REG_WRITE | PreambleLength), 0x04); //2byte
SpiWriteAddressData((REG_WRITE | PreambleDetectionControl), 0x10); //8bit
SpiWriteAddressData((REG_WRITE | SyncWord3), 0x2d);
SpiWriteAddressData((REG_WRITE | SyncWord2), 0xd4);
//SpiWriteAddressData((REG_WRITE | TransmitPacketLength), 0x40);
SpiWriteAddressData((REG_WRITE | DataAccessControl), 0x88); //enable TX handling
SpiWriteAddressData((REG_WRITE | IFFilterBandwidth), 0x03); //BW=90kHZ
SpiWriteAddressData((REG_WRITE | ClockRecoveryOversamplingRatio), 0xa1);
SpiWriteAddressData((REG_WRITE | ClockRecoveryOffset2), 0x20);
SpiWriteAddressData((REG_WRITE | ClockRecoveryOffset1), 0x4e);
SpiWriteAddressData((REG_WRITE | ClockRecoveryOffset0), 0xa5);
SpiWriteAddressData((REG_WRITE | ClockRecoveryTimingLoopGain1), 0x00);
SpiWriteAddressData((REG_WRITE | ClockRecoveryTimingLoopGain0), 0x36);
SpiWriteAddressData((REG_WRITE | TXDataRate1), 0x02); //9600BPS
SpiWriteAddressData((REG_WRITE | TXDataRate0), 0x75);
SpiWriteAddressData((REG_WRITE | FrequencyDeviation), 0x48);
SpiWriteAddressData((REG_WRITE | ClockRecoveryGearshiftOverride), 0x13);
SpiWriteAddressData((REG_WRITE | GPIO0Configuration), 0x1f);
SpiWriteAddressData((REG_WRITE | GPIO1Configuration), 0x15); //GPIO_1 TX state
SpiWriteAddressData((REG_WRITE | GPIO2Configuration), 0x12); //GPIO_2 RX state
SpiWriteAddressData((REG_WRITE | OperatingFunctionControl2), 0x02);
SpiWriteAddressData((REG_WRITE | OperatingFunctionControl2), 0x00);
SpiWriteAddressData((REG_WRITE | InterruptEnable1), 0x00);
}
void RF_T(unsigned char *dat,unsigned char len)
{
unsigned char i;
SpiWriteAddressData((REG_WRITE | TXPower), 0x06);
SpiWriteAddressData((REG_WRITE | OperatingFunctionControl1), 0x01);
SpiWriteAddressData((REG_WRITE | OperatingFunctionControl2), 0x01);
SpiWriteAddressData((REG_WRITE | OperatingFunctionControl2), 0x00);
SpiWriteAddressData((REG_WRITE | InterruptEnable1), 0x00);
SpiWriteAddressData((REG_WRITE | InterruptEnable2), 0x00);
SpiWriteAddressData((REG_WRITE | TransmitPacketLength),len);
for(i=0;i<len;i++)
{
SpiWriteAddressData((REG_WRITE | FIFOAccess),*dat);
dat++;
}
SpiWriteAddressData((REG_WRITE | OperatingFunctionControl1), 0x09); //TX
SpiWriteAddressData((REG_WRITE | InterruptEnable1), 0x04); //使能发送有效包中断
do
{
test=SpiWriteAddressData((REG_READ | InterruptStatus1), 0x00);
}while((test&0x04)==0);
SpiWriteAddressData((REG_WRITE | OperatingFunctionControl1), 0x05); //into manual receive mode
}
现在死到while((test&0x04)==0);这里了,读出的始终是0x20,SPI读写这块应该没什么问题,因为我读了一些寄存器,例如0x00寄存器,读出是0x08,GPIO1Configuration,读出是0x15,证明spi读写应该没什么问题,现在为什么停在发射那块,始终包发送中断不能置位呢?哎! 水深火热之中! 数据长度和帧头错误都修正了,还是不行啊! SpiWriteAddressData((REG_WRITE | OperatingFunctionControl1), 0x09); //TX
SpiWriteAddressData((REG_WRITE | InterruptEnable1), 0x04); //使能发送有效包中断
这两句换换顺序试试 试过了,不行的! ddd! ./emotion/em008.gif d! dd! 抓狂啊!现在硬件应该没什么问题,初始化的时候可以捕捉到irq变低的情况,spi读写都能返回正确数据,就是发送时状态位不置位,更别提irq变低了!现在都怀疑这个片子哪块有问题了!所有数据都是excel表格生成的,对了很多遍,应该没什么问题!
test=SpiWriteAddressData((REG_READ | InterruptStatus1), 0x00);
test=SpiWriteAddressData((REG_READ | InterruptStatus2), 0x00);
SpiWriteAddressData((REG_WRITE | OperatingFunctionControl1), 0x80);
while(IRQ_H);
test=SpiWriteAddressData((REG_READ | InterruptStatus1), 0x00);
test=SpiWriteAddressData((REG_READ | InterruptStatus2), 0x00); 发之前清除收发FIFO 清了,还是不行
SpiWriteAddressData((REG_WRITE | OperatingFunctionControl2), 0x03);
SpiWriteAddressData((REG_WRITE | OperatingFunctionControl2), 0x00); SpiWriteAddressData((REG_WRITE | TransmitPacketLength),(len-1));
/*for(i=0;i<len;i++)
{
SpiWriteAddressData((REG_WRITE | FIFOAccess),dat);
} */
SpiWriteBurst((REG_WRITE | FIFOAccess),dat,len);
SpiWriteAddressData((REG_WRITE | InterruptEnable1), 0x04); //使能发送有效包中断
SpiWriteAddressData((REG_WRITE | InterruptEnable2), 0x00);
SpiWriteAddressData((REG_WRITE | OperatingFunctionControl1), 0x09); //TX
执行发送程序后,根本InterruptStatus1读回读不到发射状态结束标志位,更别提irq变化了,读了一下DeviceStatus,发现没有进入发射状态,实在让人很郁闷啊! RF_ENUM RFTransmit(uint8 length)
{
xdata uint8;
//set packet content
SpiRfWriteAddressData((REG_WRITE | TransmitPacketLength), length);
GREEN=0;
/*
for(temp8=0;temp8<length;temp8++)
{
SpiRfWriteAddressData((REG_WRITE | FIFOAccess),packet);
}
*/
//enable the packet sent interrupt
SpiRfWriteAddressData((REG_WRITE | InterruptEnable1), 0x04);
SpiRfWriteAddressData((REG_WRITE | InterruptEnable2), 0x00);
//releaze all IT flags
SpiReadWriteWord(InterruptStatus1 << 8);
SpiReadWriteWord(InterruptStatus2 << 8);
//enable transmitter
SpiRfWriteAddressData((REG_WRITE | OperatingFunctionControl1), 0x09);
//EA=0;
//wait for the packet sent interrupt
//while(RF_IRQ_PIN == 1)
while (RF_NIRQ_PIN==1)
{
}
GREEN=1;
ItStatus1 = SpiRfReadRegister( InterruptStatus1 );
ItStatus2 = SpiRfReadRegister( InterruptStatus2 );
SpiRfWriteAddressData((REG_WRITE | InterruptEnable1), 0x04);
//EA=1;
return RF_OK;
}
ClearTxFIFO();
G_sendremotepcflag=0;
recbuf=0xfe;
recbuf=RSSI;
for (loop=0;loop<22;loop++)
SpiRfWriteAddressData((REG_WRITE|FIFOAccess),recbuf);
SpiRfWriteAddressData((REG_WRITE | TXPower),7);
RFTransmit(22);
RFReceiveConfig(); 我上面是一次22字节,死等IO=0的查询法 试过了你的方法,还是不行!呵呵,多谢了!我估计这个片子有点问题!可惜手头只有一个自制的模块! 买了2个现成的板子,先把硬件问题排除在外,省得傻老婆等嗫汉子可劲傻等!再顶顶,看看还有什么影响不能发送的问题
./emotion/em008.gif 硬件有问题,程序是好的! 没看楼主程序,不知楼主是否将天线分集开关设置正确,一般默认上电是接收,呵呵小弟乱猜的,楼主可以参照官方编程手册自己重新写一写, 呵呵!终于调通了!频点,发射速率,频偏等等都可以调节了!给后人两点建议
1)网上的程序只能参考,不能使用
2)要调节的参数按照silabs网站excel文件计算!
./emotion/em016.gif 你还没说是网上程序中的哪一段出错了咧 我也正在调这个,也是S在IRQ上面,跟楼主是同样问题,不知道楼主最后是怎么样解决的 embeddev 发表于 2011-5-30 12:53 static/image/common/back.gif
呵呵!终于调通了!频点,发射速率,频偏等等都可以调节了!给后人两点建议
1)网上的程序只能参考,不能使 ...
是怎么样调通的?我也碰到同样的问题
页:
[1]