Hi everyone,
I'm developing an application using a CC430F5137 in CCS 5.4.0 My trouble is an overly long transmit time using the built in CC1101 based radio. My register settings are below, but to summarize, I have set the device to 200kBaud, and am using 4-FSK modulation. The application does not need multiple channels so I've used close to the maximum allowable bandwidth for the receive filter, and the my deviation is set high for this same reason. At this transmit rate, at 4-FSK, my effective transmit rate should be near 400kBaud. The trouble is, during my testing I am seeing the current consumption spike for roughly 250ms. I am transmitting only 6 bytes, using a 16 bit sync word and the minimum number of preamble bytes. According to my math, at this rate, the 10 byte package should take only .2 ms to transmit, so I'm surprised to see the related current consumption last a full quarter of a second. The project I'm using to test this is a separate one, so there are no bells and whistles, the only thing running is the radio, and a single 1 second timer that contains the code that triggers the transmit, and the transmit is turned off as quickly as possible using the CC1101 interrupt at the end of tx. The rest of the time the CC430 is in LPM4. I would like to know if this is expected behavior, what I might be doing wrong, and appreciate any and all help! Thanks!
#define SMARTRF_SETTING_FREQ2 0x10 // 433.5 MHz
#define SMARTRF_SETTING_FREQ1 0xAC
#define SMARTRF_SETTING_FREQ0 0x0E
#define SMARTRF_SETTING_MDMCFG2 0x41 //4-FSK, 15/16 sync word bits detected
#define SMARTRF_SETTING_MDMCFG1 0x00 //2 preamble bytes
#define SMARTRF_SETTING_MDMCFG0 0xF8
#define SMARTRF_SETTING_DEVIATN 0x74 //near max spacing, 304687 Hz, in 4 FSK adjacent signals are separated by 2/3rd this amount, or ~254 kHz
#define SMARTRF_SETTING_MDMCFG4 0x00 //BW = 812 kHz, DRATE_E = 12
#define SMARTRF_SETTING_MDMCFG3 0xF8 //DRATE_M = 248, DRATE setting select 200kHz data rate
#define SMARTRF_SETTING_CHANNR 0x00
#define SMARTRF_SETTING_FREND1 0x56
#define SMARTRF_SETTING_FREND0 0x10
#define SMARTRF_SETTING_MCSM0 0x18
#define SMARTRF_SETTING_MCSM1 0x3C
#define SMARTRF_SETTING_MCSM2 0x07
#define SMARTRF_SETTING_FOCCFG 0x16
#define SMARTRF_SETTING_BSCFG 0x6C
#define SMARTRF_SETTING_AGCCTRL2 0x03
#define SMARTRF_SETTING_AGCCTRL1 0x40
#define SMARTRF_SETTING_AGCCTRL0 0x91
#define SMARTRF_SETTING_FSCAL3 0xEA
#define SMARTRF_SETTING_FSCAL2 0x2A
#define SMARTRF_SETTING_FSCAL1 0x00
#define SMARTRF_SETTING_FSCAL0 0x1F
#define SMARTRF_SETTING_FSTEST 0x59
#define SMARTRF_SETTING_TEST2 0x88
#define SMARTRF_SETTING_TEST1 0x31
#define SMARTRF_SETTING_TEST0 0x09
#define SMARTRF_SETTING_FIFOTHR 0x07
#define SMARTRF_SETTING_IOCFG2 0x29
#define SMARTRF_SETTING_IOCFG1 0x2E
#define SMARTRF_SETTING_IOCFG0 0x06
#define SMARTRF_SETTING_PKTCTRL1 0x04//append status set, RSSI will be appended to data payload
#define SMARTRF_SETTING_PKTCTRL0 0x05//0x00
#define SMARTRF_SETTING_ADDR 0x00
#define SMARTRF_SETTING_PKTLEN 0xff
The contents of the transmit function called in the 1 second interrupt:
void Transmit(unsigned char *buffer, unsigned char length)
{
transmitting = 1;
receiving = 0;
WriteSingleReg(PKTLEN, length);
WriteBurstReg(RF_TXFIFOWR, buffer, length);
RF1AIES |= BIT9;
RF1AIFG &= ~BIT9; // Clear pending interrupts
RF1AIE |= BIT9; // Enable TX end-of-packet interrupt
Strobe( RF_STX ); // Strobe STX
}
the CC1101 ISR:
__interrupt void CC1101_ISR(void)
{
switch(__even_in_range(RF1AIV,32)) // Prioritizing Radio Core Interrupt
{
case 0: break; // No RF core interrupt pending
case 2: break; // RFIFG0
case 4: break; // RFIFG1
case 6: break; // RFIFG2
case 8: break; // RFIFG3
case 10: break; // RFIFG4
case 12: break; // RFIFG5
case 14: break; // RFIFG6
case 16: break; // RFIFG7
case 18: break; // RFIFG8
case 20: // RFIFG9
if(receiving) // RX end of packet
{
// Read the length byte from the FIFO
RxBufferLength = ReadSingleReg( RXBYTES );
ReadBurstReg(RF_RXFIFORD, RxBuffer, RxBufferLength);
// Stop here to see contents of RxBuffer
__no_operation();
}
else if(transmitting) // TX end of packet
{
RF1AIE &= ~BIT9; // Disable TX end-of-packet interrupt
transmitting = 0;
Strobe( RF_SFTX ); //flush the TX fifo
}
else while(1); // trap
break;
case 22: break; // RFIFG10
case 24: break; // RFIFG11
case 26: break; // RFIFG12
case 28: break; // RFIFG13
case 30: break; // RFIFG14
case 32: break; // RFIFG15
}
// __bic_SR_register_on_exit(LPM3_bits);
}