主题中讨论的其他器件:CC1200、
大家好!
因此、我使用来自 TI 网站的监听示例代码通过射频系统发送数据。 我对其进行了一些修改、以便能够发送通过脉冲输出获得的数据。 它运行得很好。
我将两个 MSP430F5438a 模块与 CC1200搭配使用。 第一个用作从脉冲输出收集信息的远程单元、第二个用作要接收的本地单元。
但我无法与 PC 进行第二个模块的通信以验证远程终端上的所有接收数据,我的意思是,我需要在两点之间发送数据并在终端中查看数据。
我的 UART 通信有问题。
我使用 bspUartOpen 函数来定义波特率、使用 bspUartDataPut 将数据放入 UART 以准备发送、但我现在需要做什么? 使用 printf 之类的指令? 我尝试过但不起作用。
我正在使用 IAR、如果有人能帮我、代码如下。
谢谢!
//
//! @文件 cc1200_rx_sniff_mode_rx.c
//! @简介 此程序演示了38.4kbps 的 Rx 监听模式
// 设置在 SmartRF Studio 中可用。
// 发送器每次按下按钮时都会发送一个数据包,然后
// 接收器实现 RX 监听模式以减小电流
// 消耗。
// DN511 (http://www.ti.com/lit/swra428) 说明了寄存器的方式
// 找到设置。
//
//版权所有(C) 2013 Texas Instruments Incorporated - http://www.ti.com/
//
//以源代码和二进制形式重新分发和使用,有无
//如果满足以下条件,则允许进行修改
//满足:
//
// 重新分发源代码必须保留上述版权
// 注意、此条件列表和以下免责声明。
//
// 二进制形式的重新分发必须复制上述版权
// 注意、中的条件列表和以下免责声明
// 分发时提供的文档和/或其他材料。
//
// 德州仪器公司的名称和的名称都不是
// 其贡献者可用于认可或推广衍生产品
// 未经特定的事先书面许可,从该软件下载。
//
//本软件由版权所有者和作者提供
//“原样”以及任何明示或暗示的保证,包括但不包括
//限于对适销性和适用性的暗示保证
//一个特定的目的是免责的。 在任何情况下、版权均不得
//所有者或贡献者应对任何直接、间接、偶然、
//特殊、典型或必然的损害(包括但不包括)
//仅限于采购替代货物或服务;
//数据或利润;或业务中断)
//责任理论,无论是合同责任、严格责任还是侵权行为
//(包括疏忽或其他)以任何方式因使用而产生
//此软件,即使已被告知可能会发生此类损坏。
// /
/*********
*包括
*
#include "msp430.h"
#include "lcd_dogm128_6.h"
#include "hal_spi_rf_trxeb.h"
#include "cc120x_spi.h"
#include "stdlib.h"
#include "bsp.h"
//#include "bsp_key.h"
#include "io_pin_int.h"
#include "bsp_led.h"
#include "eup_vazao_reg_config.h"
#include "stdio.h"
#include "string.h"
#include "bsp_uart.h"
/*********
*定义
*
#define ISR_ACT_REQUIRED 1.
#define ISR_IDLE 0
#define PKTLEN 30 // 1 < PKTLEN < 126
#define GPIO3 0x04
#define GPIO2 0x08
#define GPIO0 0x80
/*********
*局部变量
*
静态 uint8 packetSemaphoreTX、packetSemaphoreRX;
静态 uint32 packetCounter = 0、x;
unsigned char dadox[200];
uint16 dado = 0;
/*********
*静态函数
*
static void initmcu (void);
static void registerConfig (void);
静态空 runRX (空);
静态空 radioRxISR (空);
static void updateLcd (uint16 dado1、uint16 dado2);
static void calibrateRCOsc (void);
静态空 initRX (空);
静态空 initTX (空);
静态空 runTX (空);
静态空 radioTxISR (空);
静态空 createPacket (uint8 txBuffer[]、uint16 dado);
uint16 enviado = 0、recbido = 0;
#define SET_BIT (y、bit)(y|=(1<
#define CLR_BIT (y、bit)(y&=~(1<
define cpl_bit (y、bit)(y^=(1<
#define TST_BIT (y、bit)(y&(1<
空 init()
{
//初始化 MCU 和外设
initmc();
//写入无线电寄存器
registerConfig();
//initTX();
//initRX();
updateLcd (enviado、recbido);
}
/
* uint16_t
* bspUartDataPut (uint8_t * pui8Data、uint16_t ui16Length)
*
*@简单 此函数将最多16字节的长度字节放入 BSP UART TX 中
*缓冲区并开始通过 UART 传输数据。
*
* 如果定义了\b bsp_uart_all_or_n什么、则将数据放入
* 仅当所有\ui16Length 字节都有空间时才使用 TX 缓冲区。
*
*@param pui8Data 是指向源缓冲区的指针。
*@param ui16Length 是要传输的字节数。
*
*@return 返回实际复制到 TX 缓冲区的字节数。
秘书长的报告 /
/*********
* @fn main
*
* @brief 运行 main 例程
*
* @param none
*
* @返回 无
*
void main (void){
init();
//输入 runRX,永不回来
initRX();
while (1)
{
//runRX();
updateLcd (enviado、recbido);
if (packetSemaphoreRX = ISR_ACT_REQUIRED)
{
对于(x = 0;x < 1000;x++);
inittx();
runTX();
initRX();
updateLcd (enviado、recbido);
/
(三 与远程终端的通信测试
*
bspUartOpen (bsp_UART_BR_115200);
bspUartDataPut ((uint8_t *) recibido、1);
/*
秘书长的报告 结束测试
秘书长的报告 /
//清除信号量标志
packetSemaphoreRX = ISR_IDLE;
}
}
}
/*********
* @fn initTX
*
* @简要 描述 Configura o modo TX para enar Dados。
*
* @param none
*
* @返回 无
*
静态空 initTX (空)
{
静态 uint8 marcState;
//将 ISR 函数连接到 GPIO0
ioPinIntRegister (IO_PIN_PORT_1、GPIO0、&radioTxISR);
//下降沿上的中断
ioPinIntTypeSet (IO_PIN_PORT_1、GPIO0、IO_PIN_FALLING_EDGE);
//清除 ISR 标志
ioPinIntClear (IO_PIN_PORT_1、GPIO0);
//启用中断
ioPinIntEnable (IO_PIN_PORT_1、GPIO0);
//更新 LCD
//updateLcd();
//校准无线电
TrxSpiCmdStrobe (CC120X_SCAL);
//等待校准完成(无线电返回空闲状态)
执行{
cc120xSpiReadReg (CC120X_MARCSTATE、&marcState、1);
} while (marcState!= 0x41);
}
/*********
* @fn runTX
*
* @brief 发送一个数据包。
*
* @param none
*
* @返回 无
*
静态 void runTX (void){
//初始化大小为 PKTLEN + 1的数据包缓冲区
uint8 txBuffer[PKTLEN+1];
//无限循环
//while (true){
//等待按钮按压
//while (!bspKeyPushed (bsp_key_all));
//使用 PKTLEN + 2字节数据包计数器+ n x 随机字节创建随机数据包
enviad++;
createPacket (txBuffer、envado);
//将数据包写入 TX FIFO
cc120xSpiWriteTxFifo (txBuffer、sizeof (txBuffer));
// Strobe TX 发送数据包
TrxSpiCmdStrobe (CC120X_STX);
//等待数据包被发送
while (packetSemaphoreTX!= ISR_ACT_REQUIRED);
//清除信号量标志
packetSemaphoreTX = ISR_IDLE;
//更新 LCD
//updateLcd();
//}
}
/*********
*@fn radioTxISR
*
*@用于 TX 中数据包处理的简短 ISR。 设置数据包信标
并清除中断标志
*
*@param none
*
*@返回 无
*
静态空 radioTxISR (void){
//设置数据包信标
packetSemaphoreTX = ISR_ACT_REQUIRED;
cpl_bit (P4OUT、2); // Alterna 位
//清除 ISR 标志
ioPinIntClear (IO_PIN_PORT_1、GPIO0);
}
/*********
* @fn createPacket
*
* @简短 此函数在传输数据包之前调用。 它会被填满
* 包含长度字节的数据包的 txBuffer、2
* 字节数据包计数器和 n 个随机字节
*
* 数据包格式如下:
* |------------------------------------------------ |
* | || | | | |
* | pktLength | pktCount1 | pktCount0 | rndData |…… | rndData|
* | || | | | |
* |------------------------------------------------ |
* txBuffer[0] txBuffer[1] txBuffer[2] txBuffer[PKTLEN]
*
* @指向 txBuffer 开头的 param 指针
*
* @返回 无
*
静态空 createPacket (uint8 txBuffer[]、uint16 dado){
txBuffer[0]= PKTLEN; //长度字节
txBuffer[1]=(uint8)(packetCounter >> 8); // packetCounter 的 MSB
txBuffer[2]=(uint8) packetCounter; // packetCounter 的 LSB
txBuffer[3]=(uint8)(dado >> 8);
txBuffer[4]=(uint8) dado;
for (uint8 i = 5;i <(PKTLEN + 1);i++) txBuffer[i]= 0;
//用随机字节填充缓冲区的其余部分
//for (uint8 i = 3;i <(PKTLEN + 1);i++){
// txBuffer[i]=(uint8)rand();
//}
}
/*********
* @fn initRX
*
* @brief 将无线电置于 RX 监听模式并等待数据包。
*
* @param none
*
* @返回 无
*
静态空 initRX (空)
{
uint8 marcState;
//将 ISR 函数连接到 GPIO2
ioPinIntRegister (IO_PIN_PORT_1、GPIO2、&radioRxISR);
//下降沿上的中断
ioPinIntTypeSet (IO_PIN_PORT_1、GPIO2、IO_PIN_Rising);
//清除 ISR 标志
ioPinIntClear (IO_PIN_PORT_1、GPIO2);
//启用中断
ioPinIntEnable (IO_PIN_PORT_1、GPIO2);
//更新 LCD
updateLcd (enviado、recbido);
//校准无线电
TrxSpiCmdStrobe (CC120X_SCAL);
//等待校准完成(无线电返回空闲状态)
执行{
cc120xSpiReadReg (CC120X_MARCSTATE、&marcState、1);
} while (marcState!= 0x41);
//校准 RCOSC
calibrateRCOsc();
//将无线电设置为 RX 监听模式
TrxSpiCmdStrobe (CC120X_SWOR);
}
/*********
* @fn runRX
*
* @brief 将无线电置于 RX 监听模式并等待数据包。 数据包
每个 接收到的数据包的计数器递增、LCD 递增
* 已更新
*
* @param none
*
* @返回 无
*
静态 void runRX (void){
uint8 rxBuffer[128]={0};
uint8 rxBytes;
//无限循环
//while (true){
//将无线电设置为 RX 监听模式
//trxSpiCmdStrobe (CC120X_SWOR);
//等待数据包被接收
while (packetSemaphoreRX!= ISR_ACT_REQUIRED);
//清除信号量标志
//packetSemaphoreRX = ISR_IDLE;
//读取 RX FIFO 中的字节数
cc120xSpiReadReg (CC120X_NUM_RXBYTES、&rxBytes、1);
//读取 RX FIFO 中的所有字节
cc120xSpiReadRxFifo (rxBuffer、rxBytes);
recbido =(rxBuffer[3]<<8)+ rxBuffer[4];
//更新 LCD
updateLcd (enviado、recbido);
// cpl_bit (P4OUT、0); // Alterna 位
//}
}
/*********
* @fn calibrateRcOsc
*
* @brief 会校准用于 eWOR 计时器的 RC 振荡器。 这种情况
调用* 函数、WOR_CFG0.RC_PD 必须为0
*
* @param none
*
* @返回 无
*
static void calibrateRCOsc (void){
uint8温度;
//读取当前寄存器值
cc120xSpiReadReg (CC120X_WOR_CFG0、&temp、1);
//屏蔽寄存器位字段并写入新值
temp =(temp & 0xF9)|(0x02 << 1);
//写入新的寄存器值
cc120xSpiWriteReg (CC120X_WOR_CFG0、&temp、1);
//选通空闲以校准 RCOSC
TrxSpiCmdStrobe (CC120X_Sidle);
//禁用 RC 校准
temp =(temp & 0xF9)|(0x00 << 1);
cc120xSpiWriteReg (CC120X_WOR_CFG0、&temp、1);
}
/*********
* @fn radioRxISR
*
* @用于 RX 中数据包处理的简短 ISR。 设置数据包信标
并清除中断标志
*
* @param none
*
* @返回 无
*
静态空 radioRxISR (void){
//设置数据包信标
packetSemaphoreRX = ISR_ACT_REQUIRED;
runRX();
//清除 ISR 标志
ioPinIntClear (IO_PIN_PORT_1、GPIO2);
}
/*********
* @fn initmcu
*
* @简要 初始化 MCU 和板外设
*
* @param none
*
* @返回 无
*
static void initmcu (void){
//初始化时钟和 I/O
bspInit (BSP_SYS_CLK_8MHZ);
//初始化 LED
bspLedInit();
//初始按钮
//bspKeyInit (bsp_key_mode_poll);
//初始化到 LCD 的 SPI 接口(与 SPI 闪存共享)
bspIoSpiInit (bsp_flash_lcd_spi、bsp_flash_lcd_spi_spd);
//初始化 LCD
lcdInit();
//实例化连接到 SCLK ~ 4MHz 的收发器射频 SPI 接口
//输入参数是时钟分频器
// SCLK 频率= SMCLK/时钟分频器
trxRfSpiInterfaceInit(2);
//启用全局中断
_BIS_SR (GIE);
}
/*********
* @fn registerConfig
*
* @ 中 SmartRF Studio 给出的简要写入寄存器设置
* cc1200_rx_sniff_mode_reg_config.h
*
* @param none
*
* @返回 无
*
static void registerConfig (void){
uint8 writeByte;
//重置无线电
TrxSpiCmdStrobe (CC120X_SRES);
//将寄存器写入无线电
for (uint16 I = 0;
i <(sizeof (preferredSettings)/sizeof (registerSetting_t));i++){
writeByte = preferredSettings[i].data;
cc120xSpiWriteReg (preferredSettings[i].addr、&writeByte、1);
}
}
/*********
* @fn updateLcd
*
* @简要 更新 LCD 缓冲器并将缓冲器发送到 LCD 模块
*
* @param none
*
* @返回 无
*
静态空 updateLcd (uint16 dado1、uint16 dado2){
//更新 LDC 缓冲区并发送到屏幕
lcdBufferClear (0);
lcdBufferPrintString (0、"Concentrador"、0、eLcdPage0);
lcdBufferSetHLine (0、0、LCD_cols - 1、7);
lcdBufferPrintString (0、"Recebido:"、0、eLcdPage3);
lcdBufferPrintInt (0、dado2、80、eLcdPage3);
lcdBufferPrintString (0、"enviado:"、0、eLcdPage4);
lcdBufferPrintInt (0、dado1、80、eLcdPage4);
//lcdBufferPrintInt (0、packetCounter++、70、eLcdPage4);
lcdBufferPrintString (0、"RX"、0、eLcdPage7);
lcdBufferSetHLine (0、0、LCD_cols - 1、55);
lcdBufferInvertPage (0、0、LCD_cols、eLCDPage7);
lcdSendBuffer(0);
}