您好!
我正在 CC1310芯片上解决一些奇怪的行为。 问题是实际传输时间与计算值不符。
我猜问题出在我的公式中、但请帮助我找出我的错误所在。
我正在使用9600波特速度。 数据包配置为:
4字节前导码
2字节同步字
11字节有效载荷(1字节大小+ 10个数据)
2字节 CRC (CRC-16-CCITT)
根据我的计算结果、我将以9600波特传输19个字节、即(19 * 8 / 9600)* 1000000 = 15833us
我将设置延迟的 TX (应发生在定义的时间戳上)并检查与 TX 完成中断时间的差异。 我想应该会有一些小的差异(大约几微秒)、
但结果我得到 879us 的差值、这太大了。
我还尝试了检查不同的速度、但漂移仍然存在。
附加源代码:
/* * rfTxTest.c * * Created on: Mar 19, 2024 * Author: ArchilPirmisashvili */ /***** Includes *****/ /* Standard C Libraries */ #include <stdlib.h> #include <unistd.h> /* TI Drivers */ #include <ti/drivers/rf/RF.h> #include <ti/drivers/PIN.h> #include <ti/drivers/pin/PINCC26XX.h> /* Driverlib Header files */ #include DeviceFamily_constructPath(driverlib/rf_prop_mailbox.h) /* Board Header files */ #include "Board.h" #include "smartrf_settings/smartrf_settings.h" #define BYTES_TO_US(x) (((x) + 8) * 8000000U / 9600) /***** Variable declarations *****/ static RF_Object rfObject; static RF_Handle rfHandle; /* Pin driver handle */ static PIN_Handle ledPinHandle; static PIN_State ledPinState; static uint8_t tx_packet[] = { 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; static uint32_t startTXRatTime; static uint32_t expectedEndTXRatTime; int32_t diff = 0; /* * Application LED pin configuration table: * - All LEDs board LEDs are off. */ PIN_Config pinTable[] = { Board_PIN_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, PIN_TERMINATE }; static void TransmitCallback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e) { diff = RF_convertRatTicksToUs((int32_t)(RF_getCurrentTime() - expectedEndTXRatTime)); } /***** Function definitions *****/ void *mainThread(void *arg0) { RF_Params rfParams; RF_Params_init(&rfParams); /* Open LED pins */ ledPinHandle = PIN_open(&ledPinState, pinTable); if (ledPinHandle == NULL) { while(1); } /* Set RF transmit indication led */ PINCC26XX_setMux(ledPinHandle, Board_PIN_LED1, PINCC26XX_MUX_RFC_GPO3); /* Request access to the radio */ rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams); /* Set the frequency */ RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0); startTXRatTime = RF_getCurrentTime() + RF_convertMsToRatTicks(1000); /* Total sent bytes: 4 preamble + 2 sync word + 11 payload + 2 CRC = 19 bytes at 9600 = 15833 us */ expectedEndTXRatTime = startTXRatTime + RF_convertUsToRatTicks(BYTES_TO_US(sizeof(tx_packet))); cmdTx.startTime = 0; cmdTx.pktLen = (uint16_t)sizeof(tx_packet); cmdTx.pPkt = tx_packet; cmdTx.startTime = startTXRatTime; cmdTx.startTrigger.triggerType = TRIG_ABSTIME; RF_postCmd(rfHandle, (RF_Op*) &cmdTx, RF_PriorityNormal, &TransmitCallback, 0); while(1) { } }
射频配置:
//********************************************************************************* // Generated by SmartRF Studio version 2.11.0 (build #122) // Tested for SimpleLink SDK version: CC13x0 SDK 2.30.xx.xx // Device: CC1310 Rev. 2.1 // //********************************************************************************* //********************************************************************************* // Parameter summary // Address: 0 // Address0: 0xAA // Address1: 0xBB // Frequency: 868.00000 MHz // Data Format: Serial mode disable // Deviation: 25.000 kHz // pktLen: 30 // 802.15.4g Mode: 0 // Select bit order to transmit PSDU octets:: 1 // Packet Length Config: Variable // Max Packet Length: 255 // Packet Length: 30 // Packet Data: 255 // RX Filter BW: 98 kHz // Symbol Rate: 50.00000 kBaud // Sync Word Length: 32 Bits // TX Power: 14 dBm (requires define CCFG_FORCE_VDDR_HH = 1 in ccfg.c, see CC13xx/CC26xx Technical Reference Manual) // Whitening: No whitening #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 <ti/devices/cc13x0/inc/hw_rfc_dbell.h> #include DeviceFamily_constructPath(rf_patches/rf_patch_cpe_genfsk.h) #include DeviceFamily_constructPath(rf_patches/rf_patch_rfe_genfsk.h) #include "smartrf_settings.h" // TI-RTOS RF Mode Object RF_Mode RF_prop = { .rfMode = RF_MODE_PROPRIETARY_SUB_1, .cpePatchFxn = &rf_patch_cpe_genfsk, .mcePatchFxn = 0, .rfePatchFxn = &rf_patch_rfe_genfsk, }; // Overrides for CMD_PROP_RADIO_DIV_SETUP uint32_t pOverrides[] = { // override_use_patch_prop_genfsk.xml // PHY: Use MCE ROM bank 4, RFE RAM patch MCE_RFE_OVERRIDE(0,4,0,1,0,0), // override_synth_prop_430_510_div10.xml // Synth: Set recommended RTRIM to 7 HW_REG_OVERRIDE(0x4038,0x0037), // Synth: Set Fref to 4 MHz (uint32_t)0x000684A3, // Synth: Configure fine calibration setting HW_REG_OVERRIDE(0x4020,0x7F00), // Synth: Configure fine calibration setting HW_REG_OVERRIDE(0x4064,0x0040), // Synth: Configure fine calibration setting (uint32_t)0xB1070503, // Synth: Configure fine calibration setting (uint32_t)0x05330523, // Synth: Set loop bandwidth after lock to 20 kHz (uint32_t)0x0A480583, // Synth: Set loop bandwidth after lock to 20 kHz (uint32_t)0x7AB80603, // Synth: Configure VCO LDO (in ADI1, set VCOLDOCFG=0x9F to use voltage input reference) ADI_REG_OVERRIDE(1,4,0x9F), // Synth: Configure synth LDO (in ADI1, set SLDOCTL0.COMP_CAP=1) ADI_HALFREG_OVERRIDE(1,7,0x4,0x4), // Synth: Use 24 MHz XOSC as synth clock, enable extra PLL filtering (uint32_t)0x02010403, // Synth: Configure extra PLL filtering (uint32_t)0x00108463, // Synth: Increase synth programming timeout (0x04B0 RAT ticks = 300 us) (uint32_t)0x04B00243, // override_synth_disable_bias_div10.xml // Synth: Set divider bias to disabled HW32_ARRAY_OVERRIDE(0x405C,1), // Synth: Set divider bias to disabled (specific for loDivider=10) (uint32_t)0x18000280, // override_phy_rx_aaf_bw_0xd.xml // Rx: Set anti-aliasing filter bandwidth to 0xD (in ADI0, set IFAMPCTL3[7:4]=0xD) ADI_HALFREG_OVERRIDE(0,61,0xF,0xD), // override_phy_gfsk_rx.xml // Rx: Set LNA bias current trim offset to 3 (uint32_t)0x00038883, // Rx: Freeze RSSI on sync found event HW_REG_OVERRIDE(0x6084,0x35F1), // override_phy_gfsk_pa_ramp_agc_reflevel_0x1a.xml // Tx: Configure PA ramping setting (0x41). Rx: Set AGC reference level to 0x1A. HW_REG_OVERRIDE(0x6088,0x411A), // Tx: Configure PA ramping setting HW_REG_OVERRIDE(0x608C,0x8213), // override_phy_rx_rssi_offset_neg2db.xml // Rx: Set RSSI offset to adjust reported RSSI by -2 dB (uint32_t)0x000288A3, // TX power override // Tx: Set PA trim to max (in ADI0, set PACTL0=0xF8) ADI_REG_OVERRIDE(0,12,0xF8), // Compensate adjustRatTicks (uint32_t)((20000 << 16) | 0x02A3), // 48 bit @ 9600 = 5000 us = 20000 RAT ticks // Enabling syncword detection (uint32_t)0x008F88B3, //Configure new CRC16 polynom HW32_ARRAY_OVERRIDE(0x2004, 1), // The CRC16 polynome: CRC-16-CCITT normal form, 0x1021 is x^16 + x^15 + x^5 + 1 0x10210000, // Configure new CRC init value 0xC0040051, // The new init value 0x00000000, // Set the SYSGPOCTL register HW_REG_OVERRIDE(0x1110, (RFC_DBELL_SYSGPOCTL_GPOCTL2_RATGPO1 | RFC_DBELL_SYSGPOCTL_GPOCTL3_MCEGPO0 | RFC_DBELL_SYSGPOCTL_GPOCTL0_CPEGPO0 | RFC_DBELL_SYSGPOCTL_GPOCTL1_CPEGPO1)), (uint32_t)0xFFFFFFFF, }; // CMD_PROP_RADIO_DIV_SETUP rfc_CMD_PROP_RADIO_DIV_SETUP_t RF_cmdPropRadioDivSetup = { .commandNo = 0x3807, .status = 0x0000, .pNextOp = 0, // INSERT APPLICABLE POINTER: (uint8_t*) .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 = 0x50, .symbolRate.preScale = 0xF, .symbolRate.rateWord = 0x1893, //9600 Baud .symbolRate.decimMode = 0x0, .rxBw = 0x24, .preamConf.nPreamBytes = 4, // 4 Preamble bytes .preamConf.preamMode = 0x1, .formatConf.nSwBits = 0x10, // 2 Sync word bytes .formatConf.bBitReversal = 0x0, .formatConf.bMsbFirst = 0x1, .formatConf.fecMode = 0x0, .formatConf.whitenMode = 0x0, .config.frontEndMode = 0x0, .config.biasMode = 0x1, .config.analogCfgMode = 0x0, .config.bNoFsPowerUp = 0x0, .txPower = 0x46CB, .pRegOverride = pOverrides, .centerFreq = 0x01B1, .intFreq = 0x8000, .loDivider = 0x0A, }; // CMD_FS rfc_CMD_FS_t RF_cmdFs = { .commandNo = 0x0803, .status = 0x0000, .pNextOp = 0, // INSERT APPLICABLE POINTER: (uint8_t*) .startTime = 0x00000000, .startTrigger.triggerType = 0x0, .startTrigger.bEnaCmd = 0x0, .startTrigger.triggerNo = 0x0, .startTrigger.pastTrig = 0x0, .condition.rule = 0x0, .condition.nSkip = 0x0, .frequency = 0x01B1, .fractFreq = 0xEB4F, .synthConf.bTxMode = 0x0, .synthConf.refFreq = 0 , .__dummy0 = 0x00, .__dummy1 = 0x00, .__dummy2 = 0x00, .__dummy3 = 0x0000, }; rfc_CMD_PROP_TX_ADV_t cmdTx = { .commandNo = 0x3803, .status = 0x0000, .pNextOp = 0, // INSERT APPLICABLE POINTER: (uint8_t*) .startTime = 0x00000000, .startTrigger.triggerType = TRIG_NOW, .startTrigger.bEnaCmd = 0x0, .startTrigger.triggerNo = 0x0, .startTrigger.pastTrig = 0x1, .condition.rule = TRIG_NEVER, .condition.nSkip = 0x0, .pktConf.bFsOff = 0x0, .pktConf.bUseCrc = 0x1, .pktConf.bCrcIncSw = 0x0, .pktConf.bCrcIncHdr = 0x0, .numHdrBits = 0x08, .pktLen = 0, .startConf.bExtTxTrig = 0x0, .startConf.inputMode = 0x0, .startConf.source = 0x0, .preTrigger.triggerType = TRIG_NOW, .preTrigger.bEnaCmd = 0x0, .preTrigger.triggerNo = 0x0, .preTrigger.pastTrig = 0x0, .preTime = 0, .syncWord = 0x00000000, };
请提供建议。
提前感谢、
阿奇尔