大家好、
我有具有 cc1312R 的定制板。 目前、当每5秒发送792字节数据时、我的电路板消耗20mA 电流。 但20mA 对于我的应用而言过高。 我想将其降低至10mA 或更小。 您可以在下面看到射频设置和代码。
我将更改 TX 功率、例如12.5或12、电流将降低约17.5mA。 但这对我来说还不够。 在以11或10更改 txpower 后、9射频流耗以某种方式增加。 无论如何,我不想降低太多的 Txpower。 因为我需要在50-100米左右发送数据。 如果我对 TX 功率进行降级、距离范围将减小。
如何在不对 TX 功率进行过多去折痕的情况下对该电流进行去折痕?
缓冲区大小约为782字节。 更改尺寸对于当前组合很有用。
或者每秒发送一次是否合乎逻辑。(但发送时间可能会导致过多电流?)
另一个问题是数据发送时间大约为130-140毫秒。 这是正常的吗? 如何缩短此时间?

#include <ti/devices/DeviceFamily.h>
#include DeviceFamily_constructPath(driverlib/rf_mailbox.h)
#include DeviceFamily_constructPath(driverlib/rf_common_cmd.h)
#include DeviceFamily_constructPath(driverlib/rf_prop_cmd.h)
#include <ti/drivers/rf/RF.h>
#include DeviceFamily_constructPath(rf_patches/rf_patch_cpe_prop.h)
#include <ti_radio_config.h>
// TI-RTOS RF Mode Object
RF_Mode RF_prop =
{
.rfMode = RF_MODE_AUTO,
.cpePatchFxn = &rf_patch_cpe_prop,
.mcePatchFxn = 0,
.rfePatchFxn = 0
};
// Overrides for CMD_PROP_RADIO_DIV_SETUP
uint32_t pOverrides[] =
{
// override_prop_common.json
// DC/DC regulator: In Tx, use DCDCCTL5[3:0]=0x7 (DITHER_EN=0 and IPEAK=7).
(uint32_t)0x00F788D3,
// override_prop_common_sub1g.json
// Set RF_FSCA.ANADIV.DIV_SEL_BIAS = 1. Bits [0:16, 24, 30] are don't care..
(uint32_t)0x4001405D,
// Set RF_FSCA.ANADIV.DIV_SEL_BIAS = 1. Bits [0:16, 24, 30] are don't care..
(uint32_t)0x08141131,
// override_tc106.json
// Tx: Configure PA ramp time, PACTL2.RC=0x3 (in ADI0, set PACTL2[4:3]=0x3)
ADI_2HALFREG_OVERRIDE(0,16,0x8,0x8,17,0x1,0x1),
// Rx: Set AGC reference level to 0x1A (default: 0x2E)
HW_REG_OVERRIDE(0x609C,0x001A),
// Rx: Set RSSI offset to adjust reported RSSI by -1 dB (default: -2), trimmed for external bias and differential configuration
(uint32_t)0x000188A3,
// Rx: Set anti-aliasing filter bandwidth to 0xD (in ADI0, set IFAMPCTL3[7:4]=0xD)
ADI_HALFREG_OVERRIDE(0,61,0xF,0xD),
// Tx: Set wait time before turning off ramp to 0x1A (default: 0x1F)
HW_REG_OVERRIDE(0x6028,0x001A),
// TX power override
// Tx: Set PA trim to max to maximize its output power (in ADI0, set PACTL0=0xF8)
ADI_REG_OVERRIDE(0,12,0xF8),
// evalden yaklasik 5 dbm daha iyi sonuc verdi.
// (uint32_t)0x00F688A3,
(uint32_t)0xFFFFFFFF
};
// CMD_PROP_RADIO_DIV_SETUP
// Proprietary Mode Radio Setup Command for All Frequency Bands
rfc_CMD_PROP_RADIO_DIV_SETUP_t RF_cmdPropRadioDivSetup =
{
.commandNo = 0x3807,
.status = 0x0000,
.pNextOp = 0,
.startTime = 0x00000000,
.startTrigger.triggerType = 0x0,
.startTrigger.bEnaCmd = 0x0,
.startTrigger.triggerNo = 0x0,
.startTrigger.pastTrig = 0x0,
.condition.rule = 0x1,
.condition.nSkip = 0x0,
.modulation.modType = 0x1,
.modulation.deviation = 0x64,
.modulation.deviationStepSz = 0x0,
.symbolRate.preScale = 0xF,
.symbolRate.rateWord = 0x8000,
.symbolRate.decimMode = 0x0,
.rxBw = 0x52,
.preamConf.nPreamBytes = 0x4,
.preamConf.preamMode = 0x0,
.formatConf.nSwBits = 0x20,
.formatConf.bBitReversal = 0x0,
.formatConf.bMsbFirst = 0x1,
.formatConf.fecMode = 0x0,
.formatConf.whitenMode = 0x0,
.config.frontEndMode = 0x0,
.config.biasMode = 0x1, //n-burasi 0 oalbilir
.config.analogCfgMode = 0x0,
.config.bNoFsPowerUp = 0x0,
.config.bSynthNarrowBand = 0x0,
.txPower = 0x013F, //14 dBm max outputs
// .txPower = 0xA410 , //14 dBm max output
.pRegOverride = pOverrides,
.centerFreq = 0x0364,
.intFreq = 0x8000,
.loDivider = 0x05
};
// CMD_FS
// Frequency Synthesizer Programming Command
rfc_CMD_FS_t RF_cmdFs =
{
.commandNo = 0x0803,
.status = 0x0000,
.pNextOp = 0,
.startTime = 0x00000000,
.startTrigger.triggerType = 0x0,
.startTrigger.bEnaCmd = 0x0,
.startTrigger.triggerNo = 0x0,
.startTrigger.pastTrig = 0x0,
.condition.rule = 0x1,
.condition.nSkip = 0x0,
.frequency = 0x0364,
.fractFreq = 0x0000,
.synthConf.bTxMode = 0x0,
.synthConf.refFreq = 0x0,
.__dummy0 = 0x00,
.__dummy1 = 0x00,
.__dummy2 = 0x00,
.__dummy3 = 0x0000
};
// CMD_PROP_RX_ADV
// Proprietary Mode Advanced Receive Command
rfc_CMD_PROP_RX_ADV_t RF_cmdPropRxAdv =
{
.commandNo = 0x3804,
.status = 0x0000,
.pNextOp = 0, // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
.startTime = 0x00000000,
.startTrigger.triggerType = 0x0,
.startTrigger.bEnaCmd = 0x0,
.startTrigger.triggerNo = 0x0,
.startTrigger.pastTrig = 0x0,
.condition.rule = 0x1,
.condition.nSkip = 0x0,
.pktConf.bFsOff = 0x0,
.pktConf.bRepeatOk = 0x0,
.pktConf.bRepeatNok = 0x0,
.pktConf.bUseCrc = 0x0,
.pktConf.bCrcIncSw = 0x0,
.pktConf.bCrcIncHdr = 0x0,
.pktConf.endType = 0x0,
.pktConf.filterOp = 0x0,
.rxConf.bAutoFlushIgnored = 0x0,
.rxConf.bAutoFlushCrcErr = 0x0,
.rxConf.bIncludeHdr = 0x0,
.rxConf.bIncludeCrc = 0x0,
.rxConf.bAppendRssi = 0x0,
.rxConf.bAppendTimestamp = 0x0,
.rxConf.bAppendStatus = 0x0,
.syncWord0 = 0x930B51DE,
.syncWord1 = 0x00000000,
.maxPktLen = 0x00FF,
.hdrConf.numHdrBits = 0x0,
.hdrConf.lenPos = 0x0,
.hdrConf.numLenBits = 0x0,
.addrConf.addrType = 0x0,
.addrConf.addrSize = 0x0,
.addrConf.addrPos = 0x0,
.addrConf.numAddr = 0x0,
.lenOffset = 0x00,
.endTrigger.triggerType = 0x0,
.endTrigger.bEnaCmd = 0x0,
.endTrigger.triggerNo = 0x0,
.endTrigger.pastTrig = 0x0,
.endTime = 0x00000000,
.pAddr = 0, // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
.pQueue = 0, // INSERT APPLICABLE POINTER: (dataQueue_t*)&xxx
.pOutput = 0 // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
};
// CMD_PROP_TX_ADV
// Proprietary Mode Advanced Transmit Command
rfc_CMD_PROP_TX_ADV_t RF_cmdPropTxAdv =
{
.commandNo = 0x3803,
.status = 0x0000,
.pNextOp = 0, // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
.startTime = 0x00000000,
.startTrigger.triggerType = 0x0,
.startTrigger.bEnaCmd = 0x0,
.startTrigger.triggerNo = 0x0,
.startTrigger.pastTrig = 0x0,
.condition.rule = 0x1,
.condition.nSkip = 0x0,
.pktConf.bFsOff = 0x0,
.pktConf.bUseCrc = 0x1,
.pktConf.bCrcIncSw = 0x0,
.pktConf.bCrcIncHdr = 0x0,
.numHdrBits = 16,
.pktLen = 0x0000,
.startConf.bExtTxTrig = 0x0,
.startConf.inputMode = 0x0,
.startConf.source = 0x0,
.preTrigger.triggerType = 0x0,
.preTrigger.bEnaCmd = 0x0,
.preTrigger.triggerNo = 0x0,
.preTrigger.pastTrig = 0x0,
.preTime = 0x00000000,
.syncWord = 0x930B51DE,
.pPkt = 0 // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
};
void RFTx_Function(UArg arg0, UArg arg1)
{
int i;
RF_Params rfParams;
RF_Params_init(&rfParams);
RF_cmdPropTxAdv.pktLen = PAYLOAD_LENGTH+2-1;
RF_cmdPropTxAdv.pPkt = RF_Buffer2;
RF_cmdPropTxAdv.startTrigger.triggerType = TRIG_ABSTIME;
RF_cmdPropTxAdv.startTrigger.pastTrig = 1;
if (!rfHandle)
{
rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
}
while(1)
{
Semaphore_pend(semTxHandle, BIOS_WAIT_FOREVER);
#ifdef WATCHDOG_ENABLE //# komutu ön işlemci komutu demek bu da program calısmaya baslamadan once bu komutun oldugu yerleri kontrol eder.
Watchdog_clear(watchdogHandle);
#endif
RF_Buffer[0]=(uint8_t)(PAYLOAD_LENGTH);
RF_Buffer[1]=(uint8_t)(PAYLOAD_LENGTH >> 8);
RF_Buffer[2]=RF_Header[0];
RF_Buffer[3]=RF_Header[1];
RF_Buffer[5]=(uint8_t)(PAYLOAD_LENGTH);
RF_Buffer[4]=(uint8_t)(PAYLOAD_LENGTH >> 8);
RF_Buffer[7]=(uint8_t)(Destination_Address);
RF_Buffer[6]=(uint8_t)(Destination_Address >> 8);
RF_Buffer[9]=(uint8_t)(Source_Address);
RF_Buffer[8]=(uint8_t)(Source_Address >> 8);
RF_Buffer[10]=(uint8_t)(Command_Number);
RF_Buffer[11]=(uint8_t)(Data_Number);
Data_Number++;
RF_Buffer[782]='\r';
RF_Buffer[783]='\n';
for(i = 0; i < PAYLOAD_LENGTH; i++)
{ CRC_Buffer[i] = RF_Buffer[i + 2];}
CRC_Code = CRC16_Calculate(CRC_Buffer, sizeof(CRC_Buffer));
RF_Buffer[781]=(uint8_t)(CRC_Code);
RF_Buffer[780]=(uint8_t)(CRC_Code >> 8);
RFtime = RF_getCurrentTime();
RFtime += PACKET_INTERVAL;
RF_cmdPropTxAdv.startTime = RFtime;
for(i = 0; i < 100; i++)
{ RF_Buffer2[i] = RF_Buffer[i];}
RF_EventMask result = RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTxAdv, RF_PriorityNormal, NULL, 0);
RF_yield(rfHandle);
// PIN_setOutputValue(hPin, STA_LED,!PIN_getOutputValue(STA_LED));
memset(RF_Buffer, 0, sizeof(RF_Buffer));
memset(CRC_Buffer, 0, sizeof(CRC_Buffer));
}
}
如果您有任何想法或建议、请告诉我
谢谢你
此致
Bekir