Hello Everyone,
I am using fxth870911d to transmit sensor data at 434 Mhz, I am initializing the fxth87 chip as follow,
void Init_RF(void) {
/* Turn module on in case it wasn't */
TPMS_RF_ENABLE (SET);
RFCR0 = 249; //2000 bps
RFCR1 = 0x78; // set to 78 for 120 bits - largest frame
RFCR2 = 0x0E; // RF Transmission OFF - No EOM - Pout=5dBm - RPAGE=0
// 00001110
RFCR3 = 0x00; // RF Output Low - RF Power UP - One Frame Transmitted
// 00000000
RFCR4 = 0x01; //Interframe timing set to 1
RFCR5 = 0x00; //No Pseudo-random number used
RFCR6 = 0x01; //VCO highest Power - interframe timing
// was 00
RFCR7 = 0x08; // RF Interrupt Enabled - LVD Disable - RFM Not reset
// fDATA0=fXTAL x ((12 + 4 x CF) + AFREQ/8192)
// = 26MHz x((12 + 4 x 1) + 5644 (10110000 01100) /8192)
// = 433.9131
// fDATA1=fXTAL x ((12 + 4 x CF) + BFREQ/8192)
// = 26MHz x((12 + 4 x 1) + 5674 (1011000101010) /8192)
// = 434.0083
// 434.0083 - 433.9131 = 47.6kHz
/* 434MHz */
PLLCR0=0xB0;// 1011 0000
// AFREQ[12:5]
PLLCR1=0x60;// 01100 0 00
// AFREQ[4:0] POL CODE[1:0]
PLLCR2=0xB1;// 10110001
PLLCR3=0x56;// 01010 110 CF=1 434MHz MOD=1 FSK CKREF=0 DX signal not generated
return;
}
Now I am transmitting the data with the following function.
void Fill_RFBUFFER(void) {
UINT8 au8RFDataForCS[32]; // Maximum length is 32 bytes; size of the RF buffer (in bytes)
UINT8 Payload_Length;
UINT16 Verification_Value;
Payload_Length = 22; // CRC is not part of the payload
/* Gather data into a local array that is to be loaded into the RF */
au8RFDataForCS[0u] = (UINT8) (0xAA); // Preamble
au8RFDataForCS[1u] = (UINT8) (0xAA); // Preamble
au8RFDataForCS[2u] = (UINT8) (0xAA); // Preamble
au8RFDataForCS[3u] = (UINT8) (0xAA); // //pREAMBLE
au8RFDataForCS[4u] = (UINT8) (0xD3); // Sync word
au8RFDataForCS[5u] = (UINT8) (0x91); // Sync word
au8RFDataForCS[6u] = (UINT8) (0xD3); // Sync word
au8RFDataForCS[7u] = (UINT8) (0x91); // Sync word
au8RFDataForCS[8u] = (UINT8) (Payload_Length); // Payload length, does not include CRC
//au8RFDataForCS[8u] = (UINT8) (0xFf); // MKW01 receiver address (NODE_ADDRESS 0xF0 or BROADCAST_ADDRESS 0xFF). Address check disabled on KW01 side.
//au8RFDataForCS[9u] = (UINT8) (Tire_ID >> 24u); // Tire ID
//au8RFDataForCS[10u] = (UINT8) (Tire_ID >> 16u); // Tire ID
//au8RFDataForCS[11u] = (UINT8) (Tire_ID >> 8u); // Tire ID
//au8RFDataForCS[12u] = (UINT8) (Tire_ID); // Tire ID
au8RFDataForCS[9u] = (UINT8) (0x33); // Tire ID
au8RFDataForCS[10u] = (UINT8) (0x34); // Tire ID
au8RFDataForCS[11u] = (UINT8) (0x35); // Tire ID
au8RFDataForCS[12u] = (UINT8) (0x36); // Tire ID
au8RFDataForCS[13u] = (UINT8) (0x37); // Firmware Version
au8RFDataForCS[14u] = (UINT8) (0x38); // Derivative Descriptor
au8RFDataForCS[15u] = (UINT8) (0x39);
au8RFDataForCS[16u] = (UINT8) (0x40);
au8RFDataForCS[17u] = (UINT8) (u16CompAccelZ >> 8u); // Z-axis acceleration
au8RFDataForCS[18u] = (UINT8) (u16CompAccelZ);
au8RFDataForCS[19u] = (UINT8) (u16CompAccelX >> 8u); // X-axis acceleration
au8RFDataForCS[20u] = (UINT8) (u16CompAccelX);
au8RFDataForCS[21u] = (UINT8) (gu8CompVolt); // Voltage
au8RFDataForCS[22u] = (UINT8) (gu8CompTemp); // Temperature
au8RFDataForCS[23u] = (UINT8) (u8StatusAcqRead); // Status Acquisition for READ functions
au8RFDataForCS[24u] = (UINT8) (u8StatusAcqComp); // Status Acquisition for COMP functions
au8RFDataForCS[25u] = (UINT8) (FrameID >> 8); // Frame ID: keep alive counter
au8RFDataForCS[26u] = (UINT8) (FrameID);
au8RFDataForCS[27u] = (UINT8) (0xC0); // Fixed data => can be modified by the user
au8RFDataForCS[28u] = (UINT8) (0xC1); // Fixed data => can be modified by the user
au8RFDataForCS[29u] = (UINT8) (0xC2); // Fixed data => can be modified by the user
/* Calculate CRC and add it at the end of the frame */
Verification_Value = Calculate_CRC_MKW01( &au8RFDataForCS[8], (UINT8)(Payload_Length + 1));
au8RFDataForCS[30u] = (UINT8) (Verification_Value >> 8); // CRC
au8RFDataForCS[31u] = (UINT8) (Verification_Value);
TPMS_RF_WRITE_DATA (sizeof(au8RFDataForCS), &(au8RFDataForCS[0]), 0u);
TPMS_RF_SET_TX(255);
}
So, the summary is that Device is transmitting data with 2-FSK, Manchester coding, 4-preamble byte followed by 4 bytes of the sync, with 433.960693 Mhz as carrier frequency with a Frequency deviation of 47.607422 kHz, and the data rate is 2000bps.
Now, at the receiver end I am using, CC1110EMK + CC Debugger + SmartRF Studio, I have made the following setting at the receiver as shown in the screenshot below:
I am not receiving any data at the receiver, Can anyone please guide me or give some hint, to resolve this problem.
Your any kind of support is appreciated, Thanks
This thread is really old but I'm having the exact same issue as the OP. I've been trying to get this to work for longer than I care to admit and I'm making 0 progress. I'm using a FXTH87E and trying to receive messages via a CC1101. I downloaded the FXTH87E Starter Package and the only change I made was in the Fill_RFBUFFER method, I added one more Preamble and removed one Sync word:
void Fill_RFBUFFER(void) {
UINT8 au8RFDataForCS[32]; // Maximum length is 32 bytes; size of the RF buffer (in bytes)
UINT8 Payload_Length;
UINT16 Verification_Value;
Payload_Length = 20; // CRC is not part of the payload
/* Gather data into a local array that is to be loaded into the RF */
// au8RFDataForCS[0u] = (UINT8) (0x55); // Preamble
// au8RFDataForCS[1u] = (UINT8) (0x55); // Preamble
// au8RFDataForCS[2u] = (UINT8) (0x55); // Preamble
// au8RFDataForCS[3u] = (UINT8) (0x01); // Sync word
// au8RFDataForCS[4u] = (UINT8) (0x01); // Sync word
// au8RFDataForCS[5u] = (UINT8) (0x01); // Sync word
// au8RFDataForCS[6u] = (UINT8) (0x01); // Sync word
// au8RFDataForCS[7u] = (UINT8) (Payload_Length); // Payload length, does not include CRC
// au8RFDataForCS[8u] = (UINT8) (0xFF); // MKW01 receiver address (NODE_ADDRESS 0xF0 or BROADCAST_ADDRESS 0xFF). Address check disabled on KW01 side.
// au8RFDataForCS[9u] = (UINT8) (Tire_ID >> 24u); // Tire ID
// au8RFDataForCS[10u] = (UINT8) (Tire_ID >> 16u); // Tire ID
// au8RFDataForCS[11u] = (UINT8) (Tire_ID >> 8u); // Tire ID
// au8RFDataForCS[12u] = (UINT8) (Tire_ID); // Tire ID
// au8RFDataForCS[13u] = (UINT8) (CODE0); // Firmware Version
// au8RFDataForCS[14u] = (UINT8) (CODE1); // Derivative Descriptor
// au8RFDataForCS[15u] = (UINT8) (u16CompPressure >> 8u); // Pressure
// au8RFDataForCS[16u] = (UINT8) (u16CompPressure);
// au8RFDataForCS[17u] = (UINT8) (u16CompAccelZ >> 8u); // Z-axis acceleration
// au8RFDataForCS[18u] = (UINT8) (u16CompAccelZ);
// au8RFDataForCS[19u] = (UINT8) (u16CompAccelX >> 8u); // X-axis acceleration
// au8RFDataForCS[20u] = (UINT8) (u16CompAccelX);
// au8RFDataForCS[21u] = (UINT8) (gu8CompVolt); // Voltage
// au8RFDataForCS[22u] = (UINT8) (gu8CompTemp); // Temperature
// au8RFDataForCS[23u] = (UINT8) (u8StatusAcqRead); // Status Acquisition for READ functions
// au8RFDataForCS[24u] = (UINT8) (u8StatusAcqComp); // Status Acquisition for COMP functions
// au8RFDataForCS[25u] = (UINT8) (Frame_cnt >> 8); // Frame ID: keep alive counter
// au8RFDataForCS[26u] = (UINT8) (Frame_cnt);
// au8RFDataForCS[27u] = (UINT8) (0xC0); // Fixed data => can be modified by the user
// au8RFDataForCS[28u] = (UINT8) (0xC1); // Fixed data => can be modified by the user
// au8RFDataForCS[29u] = (UINT8) (0xC2); // Fixed data => can be modified by the user
au8RFDataForCS[0u] = (UINT8) (0x55); // Preamble
au8RFDataForCS[1u] = (UINT8) (0x55); // Preamble
au8RFDataForCS[2u] = (UINT8) (0x55); // Preamble
au8RFDataForCS[3u] = (UINT8) (0x55); // Preamble
au8RFDataForCS[4u] = (UINT8) (0x01); // Sync word
au8RFDataForCS[5u] = (UINT8) (0x01); // Sync word
au8RFDataForCS[6u] = (UINT8) (0x01); // Sync word
au8RFDataForCS[7u] = (UINT8) (Payload_Length); // Payload length, does not include CRC
au8RFDataForCS[8u] = (UINT8) (0xFF); // MKW01 receiver address (NODE_ADDRESS 0xF0 or BROADCAST_ADDRESS 0xFF). Address check disabled on KW01 side.
au8RFDataForCS[9u] = (UINT8) (Tire_ID >> 24u); // Tire ID
au8RFDataForCS[10u] = (UINT8) (Tire_ID >> 16u); // Tire ID
au8RFDataForCS[11u] = (UINT8) (Tire_ID >> 8u); // Tire ID
au8RFDataForCS[12u] = (UINT8) (Tire_ID); // Tire ID
au8RFDataForCS[13u] = (UINT8) (CODE0); // Firmware Version
au8RFDataForCS[14u] = (UINT8) (CODE1); // Derivative Descriptor
au8RFDataForCS[15u] = (UINT8) (u16CompPressure >> 8u); // Pressure
au8RFDataForCS[16u] = (UINT8) (u16CompPressure);
au8RFDataForCS[17u] = (UINT8) (u16CompAccelZ >> 8u); // Z-axis acceleration
au8RFDataForCS[18u] = (UINT8) (u16CompAccelZ);
au8RFDataForCS[19u] = (UINT8) (u16CompAccelX >> 8u); // X-axis acceleration
au8RFDataForCS[20u] = (UINT8) (u16CompAccelX);
au8RFDataForCS[21u] = (UINT8) (gu8CompVolt); // Voltage
au8RFDataForCS[22u] = (UINT8) (gu8CompTemp); // Temperature
au8RFDataForCS[23u] = (UINT8) (u8StatusAcqRead); // Status Acquisition for READ functions
au8RFDataForCS[24u] = (UINT8) (u8StatusAcqComp); // Status Acquisition for COMP functions
au8RFDataForCS[25u] = (UINT8) (Frame_cnt >> 8); // Frame ID: keep alive counter
au8RFDataForCS[26u] = (UINT8) (Frame_cnt);
au8RFDataForCS[27u] = (UINT8) (0xC0); // Fixed data => can be modified by the user
au8RFDataForCS[28u] = (UINT8) (0xC1); // Fixed data => can be modified by the user
au8RFDataForCS[29u] = (UINT8) (0xC2); // Fixed data => can be modified by the user
/* Calculate CRC and add it at the end of the frame */
Verification_Value = Calculate_CRC_MKW01( &au8RFDataForCS[7], (UINT8)(Payload_Length + 1));
au8RFDataForCS[30u] = (UINT8) (Verification_Value >> 8); // CRC
au8RFDataForCS[31u] = (UINT8) (Verification_Value);
TPMS_RF_WRITE_DATA_REVERSE (sizeof(au8RFDataForCS), &(au8RFDataForCS[0]), 0u);
}
void Init_RF(void) {
/* Turn module on in case it wasn't */
TPMS_RF_ENABLE (SET);
RFCR7_RFIAK = 1; // ACK any waiting interrupt
RFCR0 = 0x19; // 25 = 19200 bit/s
RFCR1 = 0xFF; // Frame can be up to 32 bytes
RFCR2 = 0x0E; // RF Transmission OFF - No EOM - Pout=5dBm
// 00001110
RFCR3 = 0x00; // RF Output Low - RF Power UP - One Frame Transmitted
RFCR4 = 0x00; // Interframe interval not used
RFCR5 = 0x00; //No Pseudo-random number used
RFCR6 = 0x00; // Interframe interval not used
RFCR7 = 0x08; // RF Interrupt Enabled - LVD Disable - RFM Not reset
#if(RF_FREQ == 315)
// fDATA0=fXTAL x ((12 + 4 x CF) + AFREQ/8192)
// = 26MHz x((12 + 4 x 0) + 922 (1110011010) /8192)
// = 314.9263
// fDATA1=fXTAL x ((12 + 4 x CF) + BFREQ/8192)
// = 26MHz x((12 + 4 x 0) + 950 (1110110110) /8192)
// = 315.0151
// 315.0151 - 314.9263 = 44.4kHz
/* 315MHz */
PLLCR0 = 0x1C; // 0001 1100
// AFREQ[12:5]
PLLCR1 = 0xD2; // 1101 0 0 10
// AFREQ[4:0] POL CODE[1:0]
PLLCR2 = 0x1D; // 00011101
PLLCR3 = 0xB2; // 10110 010 CF=0 315MHz MOD=1 FSK CKREF=0 DX signal not generated
//PLLCR3=0xB0; // 10110 000 CF=0 315MHz MOD=0 OOK CKREF=0 DX signal not generated
#elif(RF_FREQ == 434)
// fDATA0=fXTAL x ((12 + 4 x CF) + AFREQ/8192)
// = 26MHz x((12 + 4 x 1) + 5644 (10110000 01100) /8192)
// = 433.9131
// fDATA1=fXTAL x ((12 + 4 x CF) + BFREQ/8192)
// = 26MHz x((12 + 4 x 1) + 5674 (1011000101010) /8192)
// = 434.0083
// 434.0083 - 433.9131 = 47.6kHz
/* 434MHz */
PLLCR0=0xB0;// 1011 0000
// AFREQ[12:5]
PLLCR1=0x62;// 01100 0 10
// AFREQ[4:0] POL CODE[1:0]
PLLCR2=0xB1;// 10110001
PLLCR3=0x56;// 01010 110 CF=1 434MHz MOD=1 FSK CKREF=0 DX signal not generated
#endif
return;
}
My CC1101 debug settings are as follows:
# Whitening = false
# Data rate = 19.1917
# Data format = Normal mode
# Deviation = 101.562500
# TX power = 10
# Carrier frequency = 433.999969
# Packet length mode = Variable packet length mode. Packet length configured by the first byte after sync word
# Preamble count = 4
# Modulated = true
# Channel spacing = 199.951172
# Packet length = 255
# PA ramping = false
# Channel number = 0
# RX filter BW = 270.833333
# Sync word qualifier mode = 30/32 sync word bits detected
# Address config = No address check
# Base frequency = 433.999969
# CRC autoflush = false
# Manchester enable = false
# CRC enable = true
# Modulation format = 2-FSK
# Device address = 0
Has anyone been able to get a CC1101 to successfully receive a message from an FXTH87? Any insight would be greatly appreciated.
Kindest regards
Hello Sumir,
I hope my response does not come too late.
I do not see any problem with the device initialization.
Regarding the Fill_RFBUFFER() function, I noticed that you modified the example code, have you tried to use the default values? I mean, the values shown in the example code. Can you please share your results?
The Preamble and sync word need to be configured the same in both the receiver and the TPMS transmitter. Are these parameters configured as mentioned in the receiver?
Unfortunately, I am not familiar with the receiver mentioned. In this case, I would like to recommend using the Using the Kinetis KW01 as the Receiver.
Please review the application note below in order to get more information:
Using the Kinetis KW01 as the Receiver for the FXTH870xD TPMS Sensor
I will be glad to help on any further question.
Regards,
David