平台: cc2650,
SDK: 2.21.0.06
例程:uartecho_CC2650_launchxl_TI
硬件:cc2650 launchpad 1.2
连线:
boardA RX <—–>boardB TX
boardA TX <—–>boardB RX
boardA CTS <—–>boardB RTS
boardA RTS <—–>boardB CTS
配置流控方式工作:
const UARTCC26XX_HWAttrsV2 uartCC26XXHWAttrs[CC2650_LAUNCHXL_UARTCOUNT] = {{.baseAddr= UART0_BASE,.powerMngrId= PowerCC26XX_PERIPH_UART0,.intNum= INT_UART0_COMB,.intPriority= ~0,.swiPriority= 0,.txPin= Board_UART_TX,.rxPin= Board_UART_RX, #if 0.ctsPin= PIN_UNASSIGNED,.rtsPin= PIN_UNASSIGNED, #else.ctsPin= Board_UART_CTS,.rtsPin= Board_UART_RTS, #endif.ringBufPtr= uartCC26XXRingBuffer[0],.ringBufSize= sizeof(uartCC26XXRingBuffer[0])} };
const PIN_Config BoardGpioInitTable[] = {Board_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN,/* UART RX via debugger back channel */Board_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL,/* UART TX via debugger back channel */Board_UART_CTS | PIN_INPUT_EN | PIN_PULLUP,Board_UART_RTS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL,PIN_TERMINATE };
2个lanunchpad一个只收,一个只发。
#define BUF_SIZE1 Void echoFxn(UArg arg0, UArg arg1) {char input[BUF_SIZE];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.writeDataMode = UART_DATA_BINARY;uartParams.readDataMode = UART_DATA_BINARY;uartParams.readReturnMode = UART_RETURN_FULL;uartParams.readEcho = UART_ECHO_OFF;uartParams.baudRate = 115200;uart = UART_open(Board_UART0, &uartParams);if (uart == NULL) {System_abort("Error opening the UART");}//UART_write(uart, echoPrompt, sizeof(echoPrompt));/* Loop forever echoing */while (1) {UART_write(uart, &input, 1);//UART_read(uart, &input, 1);} }
现象:
不配置流控时,使用CCS仿真,在接收处打断点,launchpad接收正常,确定接线没有问题。
当配置为流控方式时,UART_read(uart, &input, 1);无法读出数据,仿真发现,UART_write(uart, &input, 1);返回值为0,没有发送成功。阻塞在
/* Pend on semaphore and wait for Hwi to finish. */ if (!Semaphore_pend(Semaphore_handle(&(object->writeSem)), object->writeTimeout)) {
测量CTS和RTS都为低,发现在uart_open时被UARTCC26XX_initIO置低
static bool UARTCC26XX_initIO(UART_Handle handle) { ... if(isFlowControlEnabled(hwAttrs)) {PINCC26XX_setMux(object->hPin, hwAttrs->ctsPin, IOC_PORT_MCU_UART0_CTS);PINCC26XX_setMux(object->hPin, hwAttrs->rtsPin, IOC_PORT_MCU_UART0_RTS); } ... }
疑问:
1. 4线串口如何才能正常工作?有例程吗?
2. 我的4线串口配置有什么问题吗?
3. 网上资料说RTS, CTS, 空闲时应该都为高,为什么open_uart后RTS,CTS就变低了?
4. 为什么硬件没有触发中断,阻塞在Semaphore_pend
YiKai Chen:
RTS, CTS加上pull up電阻試試
Viki Shi:
例程没有,通过uartecho修改是正确的思路。
配置看着没有问题,初始化和UART功能都有了。
按照楼上建议加上上拉电阻试试吧