|
本帖最后由 sky5566 于 2014-3-16 19:24 编辑
为什么传送资料时,还要启动接收??
BYTE sppSend(SPP_STRUCT* pPacketPointer)
{
BYTE res = TRUE;
// Checking that length is not too long
if (pPacketPointer->payloadLength > SPP_MAX_PAYLOAD_LENGTH)
{
res = TOO_LONG;
sppTxStatus = TX_IDLE;
}
// Flipping the sequence bit, writing total packet length and address if the transfer is not a retransmission.
// If it is a retransmission, the fields are correct
if(!(pPacketPointer->flags & RETRANSMISSION)) // RETRANSMISSION=0x04
{
pPacketPointer->flags ^= SEQUENCE_BIT; // SEQUENCE_BIT=0x80
pPacketPointer->payloadLength += SPP_HEADER_AND_FOOTER_LENGTH; // SPP_HEADER_AND_FOOTER_LENGTH=3
pPacketPointer->srcAddress = myAddress;
}
// Setting up the DMA
// DMAARM = (0x80 | ((0x01 << ch) & 0x1F)
DMA_ABORT_CHANNEL(dmaNumberTx);
SET_DMA_SOURCE(dmaTx,pPacketPointer);
//Proceed if the packet length is OK.
if (res == TRUE)
{
// Clearing RF interrupt flags and enabling RF interrupts.
RFIF &= ~IRQ_DONE;
RFIM &= ~IRQ_SFD;
INT_SETFLAG(INUM_RF, INT_CLR); // 关闭 RF 中断
// PKTSTATUS & 0x10
if(!CCA)
{
SRX(); // 启动接收 RF
// Turning on Rx and waiting to make the RSSI value become valid.
halWait(1);
}
if(CCA) //
{ // Setting up radio
DMA_ABORT_CHANNEL(dmaNumberRx); // 启动DAM 进入接收状态
SIDLE(); // 进入IDLE
SCAL(); // 断开
RFTXRXIF = 0; // 清除 RF 中断旗号
INT_GLOBAL_ENABLE(FALSE); // 关闭中断总开关
DMA_ARM_CHANNEL(dmaNumberTx); // 启动 DMA 进入传送
while(MARCSTATE != 0x01); // 等待进入 IDLE 状态
STX(); // 传送
INT_GLOBAL_ENABLE(TRUE); // 启动中断总开关
sppTxStatus = TX_IN_PROGRESS; // 开使传送
// 目前是 DO_NOT_ACK
if(pPacketPointer->flags & DO_ACK)
{
pAckData = pPacketPointer;
waitForAck();
}
else
{
pAckData = NULL;
}
RFIM |= IRQ_DONE;
}
// The "air" is busy
else
{
res = CHANNEL_BUSY;
RFIM &= ~IRQ_DONE;
//De-flipping the sequence bit.
if(!(pPacketPointer->flags & RETRANSMISSION))
{
pPacketPointer->flags ^= SEQUENCE_BIT; // SEQUENCE_BIT=0x80
}
}
}
return res;
} // ends sppSend |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|