По совету переношу сообщение сюда) Стоит задача сделать тест качества связи между двумя EM430F6137RF900. Одно устройство выступает в качестве передатчика, другое в качестве приемника. Передатчик посылает пакет по радио на приемник и после передачи
в режиме приема ожидает ответ от приемника. Приемник при получении пакета, отправляет ответ на передатчик. В передатчике считаются количество принятых и переданных пакетов. Затем это оформаляется в пакет вида |ID1|Количество принятых пакетов|ID2|Количество переданных пакетов| и передается по UART, а точнее по RS232 на ноутбук, где и обрабатываются. В результате у меня получилась вот такая програмулина. UART функционирует как надо. Проверял путем просмотра содержимого UCA0TXBUF. Загвоздка произошла вот где. После того, как организовал UART передатчик не принимает ответный пакет. В чем может быть проблема?
Вот собственно код передатчика:
#include "RF_Toggle_LED_Demo.h"
#define PACKET_LEN (0x05) // PACKET_LEN <= 61
#define RSSI_IDX (PACKET_LEN) // Index of appended RSSI
#define CRC_LQI_IDX (PACKET_LEN+1) // Index of appended LQI, checksum
#define CRC_OK (BIT7) // CRC_OK bit
#define PATABLE_VAL (0x51) // 0 dBm output
int TransmitPacket(char *pData, int nDataSize);
void IntToChar (int num, char *Arr);
extern RF_SETTINGS rfSettings;
unsigned char packetReceived;
unsigned char packetTransmit;
unsigned char RxBuffer[PACKET_LEN+2];
unsigned char RxBufferLength = 0;
const unsigned char TxBuffer[PACKET_LEN]= {0xAA, 0xBB, 0xCC, 0xDD, 0xEE};
unsigned char buttonPressed = 1;
unsigned int i = 0;
unsigned int Ack = 0;
unsigned int Total = 0;
unsigned char transmitting = 0;
unsigned char Time = 0;
unsigned char receiving = 0;
char cAck[4]={0};
char cTotal[4]={0};
char id1[1]={1};
char id2[1]={2};
int PacketLen = 10;
char Packet[10];
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
// Increase PMMCOREV level to 2 for proper radio operation
SetVCore(2);
ResetRadioCore();
InitRadio();
InitButtonLeds();
ReceiveOn();
receiving = 1;
while (1)
{
TA1CTL = TASSEL_1 + MC_2 + TACLR + TAIE; // SMCLK, contmode, clear TAR
__bis_SR_register( LPM3_bits + GIE );
__no_operation();
if (Time) // Timer count set->transmit
{
P3OUT |= BIT6; // Pulse LED during Transmit
Time = 0;
P1IFG = 0;
ReceiveOff();
receiving = 0;
Transmit( (unsigned char*)TxBuffer, sizeof TxBuffer);
transmitting = 1;
P1IE |= BIT7; // Re-enable button press
}
else if(transmitting)
{
ReceiveOn();
receiving = 1;
}
while (transmitting);
ReceiveOn(); //Perevod v rezhim priema, dlya polucheniya otveta
receiving = 1;
// Ack = 1234;
// Total = 5678;
/*_________Oformlenie paketa dlya peredachi po UART___________*/
IntToChar (Ack, cAck);
IntToChar (Total, cTotal);
int idx;
int idx1;
for (idx=0; idx<1; idx++)
{
Packet[idx]=id1[idx];
}
for (idx=1, idx1=0; idx<5; idx++, idx1++)
{
Packet[idx]=cAck[idx1];
}
for (idx=5, idx1=0; idx<6; idx++, idx1++)
{
Packet[idx]=id2[idx1];
}
for (idx=6, idx1=0; idx<10; idx++, idx1++)
{
Packet[idx]=cTotal[idx1]; //Sostavlyaem paket
}
PMAPPWD = 0x02D52; // Get write-access to port mapping regs
P3MAP0 = PM_UCA0RXD; // Map UCA0RXD output to P2.6
P3MAP1 = PM_UCA0TXD; // Map UCA0TXD output to P2.7
PMAPPWD = 0; // Lock port mapping registers
P3DIR |= BIT1; // Set P2.7 as TX output
P3SEL |= BIT0 + BIT1; // Select P2.6 & P2.7 to UART function
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0CTL1 |= UC7BIT;
UCA0BR0 = 6; // 1MHz 9600 (see User's Guide)
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS_0 + UCBRF_13 + UCOS16; // Modln UCBRSx=0, UCBRFx=0,
// over sampling
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE+UCTXIE; // Enable USCI_A0 RX interrupt
}
}
void IntToChar (int num, char *Arr) //Preobrazovanie Int v Char dlya oformleniya paketa dannyh
{
int count = 0;
int q=num;
while (q!=0)
{
q/=10;
count++;
}
do
{
Arr[count-1]=(num%10);
num/=10;
count--;
}
while (num!=0);
}
void InitButtonLeds(void)
{
// Set up the button as interruptible
P1DIR &= ~BIT7;
P1REN |= BIT7;
P1IES &= BIT7;
P1IFG = 0;
P1OUT |= BIT7;
P1IE |= BIT7;
// Initialize Port J
PJOUT = 0x00;
PJDIR = 0xFF;
// Set up LEDs
P1OUT &= ~BIT0;
P1DIR |= BIT0;
P3OUT &= ~BIT6;
P3DIR |= BIT6;
}
void InitRadio(void)
{
// Set the High-Power Mode Request Enable bit so LPM3 can be entered
// with active radio enabled
PMMCTL0_H = 0xA5;
PMMCTL0_L |= PMMHPMRE_L;
PMMCTL0_H = 0x00;
WriteRfSettings(&rfSettings);
WriteSinglePATable(PATABLE_VAL);
}
/*_______Obrabotchik preryvaniy po UART_________*/
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(__even_in_range(UCA0IV,4))
{
case 0:break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG
break;
case 4:
for(int i=0;i<PacketLen;i++)
{
UCA0TXBUF = Packet[i];
while (UCA0STAT & UCBUSY);
}
UCA0IE ^= UCTXIE;
__bic_SR_register( GIE );
break; // Vector 4 - TXIFG
default: break;
}
}
// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMER1_A1_VECTOR
__interrupt void TIMER1_A1_ISR(void)
{
switch(__even_in_range(TA1IV,14))
{
case 0: break; // No interrupt
case 2: break; // CCR1 not used
case 4: break; // CCR2 not used
case 6: break; // reserved
case 8: break; // reserved
case 10: break; // reserved
case 12: break; // reserved
case 14: Time = 1; // overflow
__bic_SR_register_on_exit(LPM3_bits);
break;
default: break;
}
}
void Transmit(unsigned char *buffer, unsigned char length)
{
RF1AIES |= BIT9;
RF1AIFG &= ~BIT9; // Clear pending interrupts
RF1AIE |= BIT9; // Enable TX end-of-packet interrupt
WriteBurstReg(RF_TXFIFOWR, buffer, length);
Strobe( RF_STX ); // Strobe STX
}
void ReceiveOn(void)
{
RF1AIES |= BIT9; // Falling edge of RFIFG9
RF1AIFG &= ~BIT9; // Clear a pending interrupt
RF1AIE |= BIT9; // Enable the interrupt
// Radio is in IDLE following a TX, so strobe SRX to enter Receive Mode
Strobe( RF_SRX );
}
void ReceiveOff(void)
{
RF1AIE &= ~BIT9; // Disable RX interrupts
RF1AIFG &= ~BIT9; // Clear pending IFG
// It is possible that ReceiveOff is called while radio is receiving a packet.
// Therefore, it is necessary to flush the RX FIFO after issuing IDLE strobe
// such that the RXFIFO is empty prior to receiving a packet.
Strobe( RF_SIDLE );
Strobe( RF_SFRX );
}
#pragma vector=CC1101_VECTOR
__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();
// Check the CRC results
if(RxBuffer[CRC_LQI_IDX] & CRC_OK)
{
P1OUT ^= BIT0; // Toggle LED1
Ack++; //Kolichestvo podtverzhdeniy
}
}
else if(transmitting) // TX end of packet
{
RF1AIE &= ~BIT9; // Disable TX end-of-packet interrupt
P3OUT &= ~BIT6; // Turn off LED after Transmit
transmitting = 0;
Total++; //Obschee kol-vo peredannyh paketov
}
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);
}
А вот код приемника:
#include "RF_Toggle_LED_Demo.h"
#define PACKET_LEN (0x05) // PACKET_LEN <= 61
#define RSSI_IDX (PACKET_LEN) // Index of appended RSSI
#define CRC_LQI_IDX (PACKET_LEN+1) // Index of appended LQI, checksum
#define CRC_OK (BIT7) // CRC_OK bit
#define PATABLE_VAL (0x51) // 0 dBm output
extern RF_SETTINGS rfSettings;
unsigned char packetReceived;
unsigned char packetTransmit;
unsigned char RxBuffer[PACKET_LEN+2];
unsigned char RxBufferLength = 0;
const unsigned char TxBuffer[PACKET_LEN]= {0xAA, 0xBB, 0xCC, 0xDD, 0xEE};
unsigned char buttonPressed = 1;
unsigned int i = 0;
unsigned char CRC = 0;
unsigned char transmitting = 0;
unsigned char receiving = 0;
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
// Increase PMMCOREV level to 2 for proper radio operation
SetVCore(2);
ResetRadioCore();
InitRadio();
InitButtonLeds();
ReceiveOn();
receiving = 1;
while (1)
{
ReceiveOn();
receiving = 1;
__bis_SR_register( LPM3_bits + GIE );
__no_operation();
while (CRC)
{
// CRC = 0;
P3OUT |= BIT6;
__delay_cycles(500000);
// Pulse LED during Transmit
ReceiveOff();
receiving = 0;
Transmit( (unsigned char*)TxBuffer, sizeof TxBuffer);
transmitting = 1;
P3OUT &= ~BIT6;
}
}
}
void InitButtonLeds(void)
{
// Set up the button as interruptible
P1DIR &= ~BIT7;
P1REN |= BIT7;
P1IES &= BIT7;
P1IFG = 0;
P1OUT |= BIT7;
P1IE |= BIT7;
// Initialize Port J
PJOUT = 0x00;
PJDIR = 0xFF;
// Set up LEDs
P1OUT &= ~BIT0;
P1DIR |= BIT0;
P3OUT &= ~BIT6;
P3DIR |= BIT6;
}
void InitRadio(void)
{
// Set the High-Power Mode Request Enable bit so LPM3 can be entered
// with active radio enabled
PMMCTL0_H = 0xA5;
PMMCTL0_L |= PMMHPMRE_L;
PMMCTL0_H = 0x00;
WriteRfSettings(&rfSettings);
WriteSinglePATable(PATABLE_VAL);
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
switch(__even_in_range(P1IV, 16))
{
case 0: break;
case 2: break; // P1.0 IFG
case 4: break; // P1.1 IFG
case 6: break; // P1.2 IFG
case 8: break; // P1.3 IFG
case 10: break; // P1.4 IFG
case 12: break; // P1.5 IFG
case 14: break; // P1.6 IFG
case 16: // P1.7 IFG
P1IE = 0; // Debounce by disabling buttons
buttonPressed = 1;
__bic_SR_register_on_exit(LPM3_bits); // Exit active
break;
}
}
void Transmit(unsigned char *buffer, unsigned char length)
{
RF1AIES |= BIT9;
RF1AIFG &= ~BIT9; // Clear pending interrupts
RF1AIE |= BIT9; // Enable TX end-of-packet interrupt
WriteBurstReg(RF_TXFIFOWR, buffer, length);
Strobe( RF_STX ); // Strobe STX
}
void ReceiveOn(void)
{
RF1AIES |= BIT9; // Falling edge of RFIFG9
RF1AIFG &= ~BIT9; // Clear a pending interrupt
RF1AIE |= BIT9; // Enable the interrupt
// Radio is in IDLE following a TX, so strobe SRX to enter Receive Mode
Strobe( RF_SRX );
}
void ReceiveOff(void)
{
RF1AIE &= ~BIT9; // Disable RX interrupts
RF1AIFG &= ~BIT9; // Clear pending IFG
// It is possible that ReceiveOff is called while radio is receiving a packet.
// Therefore, it is necessary to flush the RX FIFO after issuing IDLE strobe
// such that the RXFIFO is empty prior to receiving a packet.
Strobe( RF_SIDLE );
Strobe( RF_SFRX );
}
#pragma vector=CC1101_VECTOR
__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();
// Check the CRC results
if(RxBuffer[CRC_LQI_IDX] & CRC_OK)
{P1OUT ^= BIT0; CRC = 1;} // Toggle LED1
}
else
if(transmitting) // TX end of packet
{
RF1AIE &= ~BIT9; // Disable TX end-of-packet interrupt
P3OUT &= ~BIT6; // Turn off LED after Transmit
transmitting = 0;
CRC = 0;
}
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);
}
-
- Вы все свалили в кучу и из-за этого разбирать Ваш код совсем неинтересно. Разбейте на модули и отлаживайтесь. Сперва радиоканал, чтобы понять как действуют либы, потом остальное. Я не в курсе, каким оборудованием Вы обладаете. - Xитpый Kитaeц(12.05.2011 23:13)
- Оборудование я написал в первом посте. Вот ссылка spoluer(13226 знак., 13.05.2011 07:35)
- Я так и делал. Сначала сделал радиоканал. Устройства прекрасно обменивались пакетами. Затем прикрутил UART, который также отладил. Но когда вместе объединил это дело, то передатчик перестал принимать ответы. - spoluer(13.05.2011 06:12)
- Пытаюсь экспериментировать, по очередно отключая новые функции. Когда убираю функцию PacketMake() передатчик начинает принимать ответы. Теперь вопрос. Как решить проблему? Я даже не знаю в какую сторону копать. - spoluer(13.05.2011 07:44)
- Проблема решена путем добавления "_BIS_SR(LPM0_bits);" перед "PacketMake();". - spoluer(13.05.2011 08:12)
- Пытаюсь экспериментировать, по очередно отключая новые функции. Когда убираю функцию PacketMake() передатчик начинает принимать ответы. Теперь вопрос. Как решить проблему? Я даже не знаю в какую сторону копать. - spoluer(13.05.2011 07:44)
- Вы все свалили в кучу и из-за этого разбирать Ваш код совсем неинтересно. Разбейте на модули и отлаживайтесь. Сперва радиоканал, чтобы понять как действуют либы, потом остальное. Я не в курсе, каким оборудованием Вы обладаете. - Xитpый Kитaeц(12.05.2011 23:13)