各位好,最近发现CC2530在进行广播发送数据时,发送选项选择需要ACK,在多个设备接收时,用sniffer抓包,发现虽然有多个设备接收,但是只有一个ACK,我能理解有ACK,可是这个ACK是谁发送的呢,两个接收设备为什么只有一个ACK,难道是两个接收设备之间有辨别?这个不应该吧,求人来解惑一下。
sinan chen:
你是用AF_DataRequest();这个函数发送数据么?
函数里对广播进行了限制了,不能够使能ACK,如下:
…
req.txOptions = 0;
if ( ( options & AF_ACK_REQUEST ) && ( req.dstAddr.addrMode != AddrBroadcast ) && ( req.dstAddr.addrMode != AddrGroup ) ) { req.txOptions |= APS_TX_OPTIONS_ACK; }
…
houshen xie:
回复 sinan chen:
我是用的是TIMIC的进行测试的,用的是MSA_McpsDataReq()函数进行发送的
houshen xie:
回复 sinan chen:
贴上函数的代码
void MSA_McpsDataReq(uint8* data, uint8 dataLength, bool directMsg, uint16 dstShortAddr){ macMcpsDataReq_t *pData; static uint8 handle = 0; if ((pData = MAC_McpsDataAlloc(dataLength, msa_securityLevel, msa_keyIdMode)) != NULL) { pData->mac.srcAddrMode = SADDR_MODE_SHORT; pData->mac.dstAddr.addrMode = SADDR_MODE_SHORT; pData->mac.dstAddr.addr.shortAddr = dstShortAddr; pData->mac.dstPanId = msa_PanId; pData->mac.msduHandle = handle++; pData->mac.txOptions = MAC_TXOPTION_ACK;// pData->mac.txOptions = MAC_TXOPTION_NO_RETRANS; /* MAC security parametcers */ osal_memcpy( pData->sec.keySource, msa_keySource, MAC_KEY_SOURCE_MAX_LEN ); pData->sec.securityLevel = msa_securityLevel; pData->sec.keyIdMode = msa_keyIdMode; pData->sec.keyIndex = msa_keyIndex; /* If it's the coordinator and the device is in-direct message */ if (msa_IsCoordinator) { if (!directMsg) { pData->mac.txOptions |= MAC_TXOPTION_INDIRECT; } } /* Copy data */ osal_memcpy (pData->msdu.p, data, dataLength); /* Send out data request */ MAC_McpsDataReq(pData); }}