CC1110 as FXTH87 434Mhz Reciever

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

CC1110 as FXTH87 434Mhz Reciever

1,257 Views
sumirjha
Contributor I

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:

Screenshot (7).png

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

Tags (3)
0 Kudos
2 Replies

85 Views
kumaichi
Contributor II

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

kumaichi_1-1709570005742.png

 

Has anyone been able to get a CC1101 to successfully receive a message from an FXTH87?  Any insight would be greatly appreciated.

Kindest regards

0 Kudos

777 Views
david_diaz
NXP Employee
NXP Employee

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

0 Kudos