ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 ноября
253231 Топик полностью
spoluer (12.05.2011 12:17, просмотров: 257) ответил Xитpый Kитaeц на Если используете прерывания, так и передавайте байты в прерывании и сигнализируйте об окончании передачи фоновой задаче. Обработка 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(); //ïåðåâîä â ðåæèì ïðèåìà, äëÿ ïîëó÷åíèÿ îòâåòà receiving = 1; // Ack = 1234; // Total = 5678; /*_________Îôîðìëåíèå ïàêåòà äëÿ ïåðåäà÷è ïî 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]; //ñîñòàâ ïàêåòà: |ID1|êîëè÷åñòâî ïðèíÿòûõ ïàêåòîâ ïî ðàäèî(4 byte)|ID2|êîëè÷åñòâî ïåðåäàííûõ ïàêåòîâ ïî ðàäèî(4 byte)| } 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 // TransmitPacket(Packet,PacketLen); //ïåðåäà÷à ïàêåòà // UCA0IE |= UCTXIE; } } //int TransmitPacket(char *pData, int nDataSize) //{ // UCA0IE |= UCTXIE; //ðàçðåøèòü ïðåðûâàíèÿ ïî ïðèåìó // // char *pTmpData = pData; //Ïåðåìåííàÿ äëÿ õðàíåíèÿ î÷åðåäíîãî áàéòà äàííûõ (äëÿ óñêîðåíèÿ îïåðàöèè äîñòóïà ê äàííûì ìàññèâà) // int nCount; // // for (nCount=nDataSize; nCount>0; nCount--) //öèêë ïåðåäà÷è äàííûõ // { // //while (!(UCA0IFG & UCTXIFG)); // UCA0TXBUF = *pTmpData++; // while (UCA0STAT & UCBUSY); // } // UCA0IE ^= UCTXIE; //ïåðåäà÷à çàâåðøåíà, ïðåêðàòèòü âûçîâ îáðàáîò÷èêà ïðåðûâàíèé // return 0; //} void IntToChar (int num, char *Arr) //ïðåîáðàçîâàíèå Int â Char { 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); } /*_______Îáðàáîò÷èê ïðåðûâàíèé ïî 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++; //Êîëè÷åñòâî ïîäòâåðæäåíèé } } 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++; //îáùåå êîë-âî ïåðåäàííûõ ïàêåòîâ } 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); } UART проверяю в дебаге,смотря, что находится в UCA0TXBUF. Все проходит как надо. Проблема проявилась теперь в том, что передатчик не может принять ответ.