微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI无线射频设计 > CC1310 UART Demo代码

CC1310 UART Demo代码

时间:12-23 整理:3721RD 点击:

CC1310 LaunchPad提供的Demo的UART程序是UART_MODE_BLOCKING模式下的Demo代码,请问能否提供UART_MODE_CALLBACK模式下的Demo代码,谢谢!

自己写的,仅供参考

/*
* ======== uartecho.c ========
*/

/* XDCtools Header files */
#include <xdc/std.h>
#include <xdc/runtime/System.h>

/* BIOS Header files */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>

/* TI-RTOS Header files */
#include <ti/drivers/PIN.h>
#include <ti/drivers/UART.h>

/* Example/Board Header files */
#include "Board.h"

#include <stdint.h>

#define TASKSTACKSIZE 768

Task_Struct task0Struct;
Char task0Stack[TASKSTACKSIZE];

/* Global memory storage for a PIN_Config table */
static PIN_State ledPinState;
static int flag=0;
/*
* Application LED pin configuration table:
* - All LEDs board LEDs are off.
*/
PIN_Config ledPinTable[] = {
Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
Board_LED2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
PIN_TERMINATE
};
/***** Function definitions *****/
void UARTcallback(UART_Handle Handle, void *buf, size_t count){

flag=1;
UART_readCancel (Handle);

//(can not work when here write )UART_write(uart, buf, count);
return;
}

/*
* ======== echoFxn ========
* Task for this function is created statically. See the project's .cfg file.
*/
Void echoFxn(UArg arg0, UArg arg1)
{
char input[10];
UART_Handle uart;
UART_Params uartParams;
const char echoPrompt[] = "\fEchoing characters:\r\n";

/* Create a UART with data processing off. */
UART_Params_init(&uartParams);
uartParams.readMode= UART_MODE_CALLBACK;
uartParams.readCallback=UARTcallback;
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_RETURN_NEWLINE;//UART_RETURN_FULL;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudRate = 9600;
uart = UART_open(Board_UART0, &uartParams);

if (uart == NULL) {
System_abort("Error opening the UART");
}

UART_write(uart, echoPrompt, sizeof(echoPrompt));

unsigned char rxBuffer[20];
int ret = UART_read(uart, rxBuffer, sizeof(rxBuffer));

UART_write(uart, rxBuffer, sizeof(rxBuffer));

/* Loop forever echoing */
while (1) {
ret = UART_readPolling(uart, rxBuffer, sizeof(rxBuffer));
if(flag==1 || rxBuffer!=NULL){
flag=0;
UART_write(uart, rxBuffer, sizeof(rxBuffer));
}

// UART_read(uart, &input, 1);
// UART_write(uart, &input, 1);
}
}

/*
* ======== main ========
*/
int main(void)
{
PIN_Handle ledPinHandle;
Task_Params taskParams;

/* Call board init functions */
Board_initGeneral();
Board_initUART();

/* Construct BIOS objects */
Task_Params_init(&taskParams);
taskParams.stackSize = TASKSTACKSIZE;
taskParams.stack = &task0Stack;
Task_construct(&task0Struct, (Task_FuncPtr)echoFxn, &taskParams, NULL);

/* Open LED pins */
ledPinHandle = PIN_open(&ledPinState, ledPinTable);
if(!ledPinHandle) {
System_abort("Error initializing board LED pins\n");
}

PIN_setOutputValue(ledPinHandle, Board_LED1, 1);

/* This example has logging and many other debug capabilities enabled */
System_printf("This example does not attempt to minimize code or data "
"footprint\n");
System_flush();

System_printf("Starting the UART Echo example\nSystem provider is set to "
"SysMin. Halt the target to view any SysMin contents in "
"ROV.\n");
/* SysMin will only print to the console when you call flush or exit */
System_flush();

/* Start BIOS */
BIOS_start();

return (0);
}

Eggsy,首先感谢你提供的相关代码,能不能解释一下具体的实现流程?

然后是下面这几条语句我也不是很理解

unsigned char rxBuffer[20];
 int ret = UART_read(uart, rxBuffer, sizeof(rxBuffer));

 UART_write(uart, rxBuffer, sizeof(rxBuffer));

 /* Loop forever echoing */
 while (1) {
  ret = UART_readPolling(uart, rxBuffer, sizeof(rxBuffer));
  if(flag==1 || rxBuffer!=NULL){
  flag=0;
  UART_write(uart, rxBuffer, sizeof(rxBuffer));
 }

在callback模式下我的理解是相当于单片机的中断,然后需要到相应的中断处理函数中去进行处理,而while(1)前面又是直接read和write,while(1)里面又调用了UART_readPolling,还有if(flag==1 || rxBuffer!=NULL)这句中的flag==1我知道是在回调函数(UARTcallback)里面置1的,而rxBuffer!=NULL为什么要做这样的判断,对此我不是很理解,可能问题比较菜,希望不吝赐教,谢谢!

这是我自己写的,判断是否进入中断了,进入中断flag 就等于1,然后打印出来收到的东西,之所以要UART_readPolling(uart, rxBuffer, sizeof(rxBuffer));是因为要告诉单片机,收到的东西放在哪个数组里面rxBuffer

首先谢谢你的解答,另外我还有几个问题想请教一下你:

1.如上你的回答是不是意思是说UART_readPolling这个函数不是必须的?

2.是不是收到一个字节进入一次UARTcallback?如果我需要对32个字节的数据做处理是不是需要进32次的UARTcallback,然后我是否可以在UARTcallback里处理数据?

Hi Eggsy,

               我刚刚将你给的代码烧录到了CC1310的demo板上,发现了如下图所示的情况,在我没有通过串口助手发数据时,一直在while(1)里面打印乱码,请问这是怎么回事?

然后我把while(1)里的判断中的buff != NULL去掉,如下所示

while (1) {
ret = UART_readPolling(uart, rxBuffer, sizeof(rxBuffer));
if(flag==1)
{
flag=0;
UART_write(uart, rxBuffer, sizeof(rxBuffer));
}

debug得到的第一次的结果如下图所示,但只能进一次中断回调函数UARTcallback,然后发送就再也进不了UARTcallback了

我这边测试是没问题的呀。你用串口调试助手不断发试试看会出现什么情况

Hi Eggsy,

                我刚试过了用串口助手不断发出现的现象跟之前是一样的,然后我又做了如下的尝试:就是将while(1)中的UART_readPolling函数换成UART_read函数,如下图所示:

然后Debug如下图所示,每发一次都能收到数据,但是收到的数据与发送的数据不一致,而且第一次的时候需要发两次才能进回调函数:

最后发送和接收的数据达到对应,但是不一致:

 

以上,望得到解答,谢谢!

 

我现在出差,板子不在身边,无法验证一下。

我猜是buffer的长度影响。

代码改为:

while (1) {
  ret = UART_read(uart, rxBuffer, sizeof(rxBuffer));
  if(flag==1 && rxBuffer!=NULL){
  flag=0;
  UART_write(uart, rxBuffer, 19);
 }

先发19个数据看看,是否正确?

再改为

while (1) {
  ret = UART_readPolling(uart, rxBuffer, sizeof(rxBuffer));
  if(flag==1 && rxBuffer!=NULL){
  flag=0;
  UART_write(uart, rxBuffer, 19);
 }

再发19个数据看看,是否正确?

Hi Eggsy,

                按照你的建议我做了相应的测试,测试结果如下:

               1.按照你提供的第一种方式测试结果如下图所示,结果跟之前测试的结果是一样的:

               

            2.按照你提供的第二种方式测试结果如下图所示,测试结果显示收不到发送的数据:

          

        以上,希望得到你的解答,谢谢!

Hi Eggsy,

                希望得到你的解答,谢谢!

你手头上还有其他TI 的CC1310的lanchpad吗?可以换一个试一下?

如果没有,先设定发一个字节,数组容量也改小点,试试看。

Hello;

我也遇到了上述的问题,这个最终解决了没?

按照上面的代码运行,中断只能执行一次....

数组容量改小点也不行;

在while(1) 中使用UART_readPolling函数收不到数据?不知道怎么回事?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top