This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC430F6137:需要有关修改射频 TX/RX 示例代码的帮助

Guru**** 661510 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/678988/cc430f6137-need-help-with-modifying-a-sample-code-for-rf-tx-rx

您好、支持团队、

我不熟悉将 CC430与 EM430F6137RF900 板配合使用并对其进行编程、到目前为止、我已经使用 CCSv6测试 CC430的示例代码 RF_TOGGLE_LED_Demo。 提供的示例代码为 Fixed_GT_FIFO (Active_MHz_868)、所有代码都可以正常工作、例如当我按下按钮时、它将发送信号、而另一个 MCU 将接收信号。 我想知道如何修改代码、以便其中一个代码连续传输、而无需按下按钮、另一个代码始终接收? 此外、在发送时、我希望绿色 LED 切换、以便我知道它的发送情况、并且接收时接收器也是如此、绿色 LED 也将切换。 另一件事是、当它未接收到时、我希望它清除绿色 LED 位并打开红色 LED。 下面提供了示例代码、提前感谢您。

#include "rf_Toggle_LED_Demo.h"

extern rf_settings rfSettings;

unsigned char packetReceived;
unsigned char packetTransmit;

unsigned char txBytesLeft = packet_LEN; //+1表示长度字节
unsigned char txPosition = 0;
unsigned char rxBytesLeft = packet_LEN+2; //+2表示状态字节
unsigned char rxPosition = 0;
unsigned char lengthByteRead = 0;

unsigned char RxBufferLength = 0;
unsigned char TxBufferLength = 0;
unsigned char *_p_Buffer = 0;
unsigned char buttonPressed = 0;
unsigned int i = 0;

unsigned char 传输= 0;
unsigned char 接收= 0;

unsigned char RxBuffer[packet_LEN+2]={0};
unsigned char TxBuffer[packet_LEN]={
0x00、0x01、0x02、0x03、0x04、 0x05、0x06、0x07、0x08、0x09、
0x10、0x11、0x12、0x13、0x14、 0x15、0x16、0x17、0x18、0x19、
0x20、0x21、0x22、0x23、0x24、 0x25、0x26、0x27、0x28、0x29、
0x30、0x31、0x32、0x33、0x34、 0x35、0x36、0x37、0x38、0x39、
0x40、0x41、0x42、0x43、0x44、 0x45、0x46、0x47、0x48、0x49、
0x50、0x51、0x52、0x53、0x54、 0x55、0x56、0x57、0x58、0x59、
0x60、0x61、0x62、0x63、0x64、 0x65、0x66、0x67、0x68、0x69、
0x70、0x71、0x72、0x73、0x74、 0x75、0x76、0x77、0x78、0x79、
0x80、0x81、0x82、0x83、0x84、 0x85、0x86、0x87、0x88、0x89、
0x90、0x91、0x92、0x93、0x94、 0x95、0x96、0x97、0x98、0x99、
};

void main (void)
{
//停止看门狗计时器以防止超时复位
WDTCTL = WDTPW + WDTHOLD;

//将 PMMCOREV 电平增加到2以实现正确的无线电操作
SetVCore (2);

ResetRadioCore();
InitButtonLeds();
InitTimer();

//清理 RX 缓冲
器 rxPosition = packet_LEN+2;
while (rxPosition -)
{
RxBuffer[rxPosition]= 0;
}

InitRadio();
ReceiveOn();

while (1)
{
P1IE |= BIT7; //启用按钮中断

_bis_SR_register (LPM3_bits + GIE);
__no_operation();

IF (按钮预置) //处理按钮,按->传送
{
ReceiveOff(); //按钮表示 TX、停止 RX
接收= 0;

TransmitPacket();

buttonPressed = 0; //重新启用按钮按
}
if (正在接收)
{
ReceivePacket();
__no_operation();
}
if (!正在传输)
{
ReceiveOn();
}
}


void ReceivePacket (void)
{
rxBytesLeft = packet_LEN + 2;//为附加字节设置最大包长度(leng + 2
) rxPosition = 0;packetReceivable
= 0;

__delay_cycles (2800); //等待字节填充 RX FIFO

TA0CCR1 = RX_TIMER_PERIOD; // x 周期* 1/32768 = y us
TA0CCTL1 |= CCIE;
TA0CTL |= MC_2 + TACLR; //启动定时器-连续模式

__bis_SR_register (LPM3_bits + GIE);
__no_operation ();

TA0CCR1 = RX_TIMER_PERIOD;
TA0CCTL1 &=~(CCIE);
TA0CTL &=~(MC_3); //关闭计时器

__NO_OPERATION ();
}

void TransmitPacket (void)
{
//P3OUT |= BIT6; //发送期间的脉冲 LED
P1OUT |= BIT0;
txBytesLeft = packet_LEN;
txPosition = 0;
packetTransmit = 0;
发送= 1;

STROBE ( RF_STX ); // Strobe STX

TA0CCR1 = TX_TIMER_PERIOD; // x 周期* 1/32768 = y us
TA0CCTL1 |= CCIE;
TA0CTL |= MC_2 + TACLR; //启动计时器-连续模式

_bis_SR_register (LPM3_bits + GIE);
__no_operation ();

TA0CCR1 = TX_TIMER_PERIOD; // x 周期* 1/32768 = y us
TA0CCTL1 &=~(CCIE);
TA0CTL &=~(MC_3); //关闭计时器

// P3OUT &=~BIT6; //在发送
P1OUT &=~BIT0后关闭 LED;
}

void ReceiveOn (void)
{
RF1AIES &=~BIT9;
RF1AIFG = 0; //清除暂挂的 RFIFG 中断
RF1AIE |= BIT9; //启用同步字接收中断

// TX 之后无线电处于空闲状态,因此选通 SRX 进入接收模式
Strobe (RF_SRX);

__NO_OPERATION ();
}

void ReceiveOff (void)
{
RF1AIE &=~BIT9; //禁用 RX 中断
RF1AIFG &&~BIT9; //清除暂挂的 IFG
RF1AIES &=~BIT9; //切换回同步字

//在对讲机接收数据包时可能会调用 ReceiveOff。
//因此,在发出空闲选通信号后必须清空 RX FIFO
//这样 RXFIFO 在接收数据包之前是空的。
选通(RF_Sidle);
选通(RF_SFRX);
}

///----------------------------------
// void pktRxHandler (void)
//
说明:
// 每次发生计时器中断时都会调用此函数。
// 函数通过重新接收状态字节来启动。 每次状态
// 字节表示 RX FIFO 中有可用字节、字节为
// 从 RX FIFO 读取并写入 RxBuffer。 这在
//之前完成 接收到整个数据包。 如果状态字节指示有
// RX FIFO 溢出之前、RX FIFO 被清空。 请参阅
// EM430F6137RF900射频示例用户手册、用于描述此
//流程图 功能。
///----------------------------------
void pktRxHandler (void){
unsigned char RxStatus;
unsigned char bytesInFifo;

//哪种状态?
RxStatus =选通(RF_SNOP);

switch (RxStatus & CC430_State_mask)
{
CC430_State_RX 案例:
//如果 RX FIFO 中有任何内容....
if (bytesInFifo = min (rxBytesLeft、RxStatus 和 CC430_FIFO_Bytes_Available 掩码))
{
//更新要接收的剩余字节数
rxBytesLeft-= bytesInFifo;

//从 RX FIFO 读取数据并将数据存储在 rxBuffer 中
while (bytesInFifo--){
RxBuffer[rxPosition ]= ReadSingleReg (RXFIFO);
rxPosition++;
}
if (!rxBytesLeft){
电池组接收器= 1;
接收= 0;
lengthByteRead = 0;
ReceiveOff();

P1OUT ^= BIT0; //切换 LED1
}
}
中断;
默认值:
if (!packetReceived)(已接收)
{
电池组接收器= 1;
}

rxBytesLeft = 0;
接收= 0;
ReceiveOff();

break;
}
}// pktRxHandler

//-----------------
// void pktTxHandler (void)
//
说明:
// 每次发生计时器中断时都会调用此函数。 该函数启动
// 状态字节。 每当状态字节指示存在
//时 是 TX FIFO 中的可用空间、字节取自 txBuffer 并写入
// TX FIFO、直到整个数据包被写入或 TXFIFO 出现下溢。
// 有关说明
//的流程图、请参阅 EM430F6137RF900射频示例用户手册 此函数。
///----------------------------------
void pktTxHandler (void){
unsigned char freeSpaceInFifo;
unsigned char TxStatus;

//哪种状态?
TxStatus = Strobe (RF_SNOP);

开关(TxStatus & CC430_State_mask){
CC430_State_TX 案例:
//如果有任何要传输的内容。
if (freeSpaceInFifo = min (txBytesLeft、TxStatus 和 CC430_FIFO_Bytes_Available 掩码))
{
txBytesLeft-= FreeSpaceInFifo;

while (freeSpaceInFifo--)
{
WriteSingleReg (TXFIFO、TxBuffer[txPosition);
txPosition++;
}

if (!txBytesLeft)
{
RF1AIES |= BIT9; //数据包结束 TX 中断
RF1AIFG &=~BIT9; //清除 RFIFG9
while (!(RF1AIFG & BIT9));//轮询 RFIFG9以获取 TX 数据包末尾
RF1AIES &=~BIT9; //数据包结束 TX 中断
RF1AIFG &=~BIT9; //清除 RFIFG9
发送= 0;
packetTransmit = 1;
}
}
中断;

CC430_State_TX_underflow 案例:
STROBE (RF_SFTX);//刷新 TX FIFO

__no_operation();
//不要在这里休息!
默认值:
if (!packetTransmit)(如果!packetTransmit)
packetTransmit = 1;

如果(发送){
if (((TxStatus & CC430_State_mask)= CC430_State_Idle){
发送= 0;
}
}
中断;
}
}// pktTxHandler

void InitTimer (void)
{
P5SEL |= 0x03; //设置 xtal 引脚
LFXT_Start (XT1DRIVE_0);

TA0CCR1 = RX_TIMER_PERIOD; // x 个周期* 1/32768 = y us
TA0CCTL1 = CCIE; //启用中断
TA0CTL = tassel__ACLK + TACLR; // ACLK 源
}

void InitButtonds (void)
{
//将按钮设置为可中断
的 P1DIR &=~BIT7;
P1REN |= BIT7;
P1IES &= BIT7;
P1IFG = 0;
P1OUT |= BIT7;
P1IE |= BIT7;

//初始化端口 J
PJOUT = 0x00;
PJDIR = 0xFF;

//设置 LED
P1OUT &=~BIT0;
P1DIR |= BIT0;
P3OUT &=~BIT6;
P3DIR |= BIT6;
}

void InitRadio (void)
{
//设置高功率模式请求使能位以便可以输入 LPM3
//激活无线电使能
PMMCTL0_H = 0xA5;
PMMCTL0_L |= PMMHPMRE_L;
PMMCTL0_H = 0x00;

WriteRfSettings (&rfSettings);

WriteSinglePATable (PATABLE_VAL);
}

/********
*中断服务例程
/

#pragma vector=TIMER0_A1_vector
__interrupt void TIMER0_A1_ISR (void)
{
switch (_even_in_range (TA0IV、14))
}{
情况0:中断;
案例2:
if (正在接收)
{
TA0CCR1 += RX_TIMER_PERIOD; // 16个周期* 1/32768 =~500us

pktRxHandler();

IF (电池组接收器)
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);
}
否则 IF (发送)
{
TA0CCR1 += TX_TIMER_PERIOD; // 16个周期* 1/32768 =~500us

pktTxHandler();

if (packetTransmit)(电池组发送)
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);
}
中断;
案例4:中断; //未使用 CCR2
案例6:中断; //保留未使用
案例8:中断; //保留未使用
案例10:中断; //保留未使用
案例12:中断; //保留未使用
案例14:中断; //未使用溢出
}
#pragma

vector=CC1101_vector
__interrupt void CC1101_ISR (void)
{
switch (__even_in_range (RF1AIV、32)) //确定无线电内核中断的优先级
{
情况0:中断; //无射频内核中断挂起
案例2:中断; // RFIFG0
案例4:中断; // RFIFG1
案例6:中断; // RFIFG2
案例8:中断; // RFIFG3
案例10:中断; // RFIFG4
案例12:中断; // RFIFG5
案例14:中断; // RFIFG6
案例16:中断; // RFIFG7
案例18:中断; // RFIFG8
案例20: // RFIFG9
if (!(RF1AIES 和 BIT9)) //接收到 RX 同步字
{
接收= 1;
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//退出活动
}
其他 while (1); //陷阱
中断;
判例22:中断; // RFIFG10
案例24:中断; // RFIFG11
判例26:中断; // RFIFG12
案例28:中断; // RFIFG13
案例30:中断; // RFIFG14
案例32:中断; // RFIFG15
}
}

#pragma vector=Port1_vector
__interrupt void Port1_ISR (void)
{
switch (__even_in_range (P1IV、16))
}{
情况0:中断;
案例2:中断; // P1.0 IFG
案例4:中断; // P1.1 IFG
案例6:中断; // P1.2 IFG
案例8:中断; // P1.3 IFG
案例10:中断; // P1.4 IFG
案例12:中断; // P1.5 IFG
案例14:中断; // P1.6 IFG
案例16: // P1.7 IFG
_DELAY_CYCLES (1000); //去抖延迟
buttonPressed = 1;
P1IE = 0; //通过禁用按钮去抖
P1IFG = 0;
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//退出激活
中断;
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您将需要修改这部分代码。

    while (1)

    P1IE |= BIT7; //启用按钮中断

    _bis_SR_register (LPM3_bits + GIE);
    __no_operation();

    IF (按钮预置) //处理按钮,按->传送

    ReceiveOff(); //按钮表示 TX、停止 RX
    接收= 0;

    TransmitPacket();

    buttonPressed = 0; //重新启用按钮按压操作

    if (正在接收)

    ReceivePacket();
    __no_operation();

    if (!正在传输)

    ReceiveOn();




    这样的东西、它将始终传输。

    while (1)

    TransmitPacket();
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、您知道我如何让红色 LED 或 LED2在没有接收到数据包时亮起、然后在接收到数据包时再重新切换绿色 LED 或 LED1?