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.

[参考译文] 编译器/CC2541:UART 接收器无法正常工作

Guru**** 2553450 points
Other Parts Discussed in Thread: CC2541

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/572654/compiler-cc2541-uart-recieve-does-not-work-properly

器件型号:CC2541

工具/软件:TI C/C++编译器

您好!

一直在努力处理 UART 接收。 我必须在 evey 1秒接收来自另一个微控制器的数据。 当我执行此操作时、我从 getparameter 读取后(5-10次后) BLE 崩溃。

另一个问题是我的 BLE 范围受到影响、我无法从 BLE 所在的位置移动50mtrs。

如何正确实现 UART 接收。 请帮帮我。

我已经使用 TI 提供的 CC2541_peripheral_codes 进行了编码。

我使用的是轮询方法。 我应该尝试使用 DMA 方法吗? DMA 是否与 cc2541完美配合? DMA 传输是否会使我的 CC2541挂起??

谢谢  

Sidharth

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

    嘿、Sidharth、

    如果没有更多信息、很难说出可能会出现什么问题、但不建议使用轮询数据。 我建议您查看 serialApp-demo:  

    此致、

    Klas

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

    您能否提供示例的链接?

    在 DMA 和中断中、建议使用哪种??

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

    你(们)好

    上述代码无法正常工作。

    SIR 我正在尝试在 ISR 模式下实现 UART、但它似乎不起作用

    使用 了 CC2541_43_44_45_Peripheral_Software_Examples 中 UART_ISR.c 所用的代码

    //IN INIT 函数
    PERCFG =(PERCFG 和~PERCFG_U0CFG)| PERCFG_U0CFG_ALT1;
    
    //为端口0引脚将 USART 0优先于定时器1。
    P2DIR &= P2DIR_PRIP0_USART0;
    
    //将引脚2、3和5设置为外设 I/O,将引脚4设置为 GPIO 输出。
    P0SEL |= BIT5 | BIT4 | BIT3 | BIT2;
    
    //初始化比特率= 9600波特率
    U0BAUD = UART_BAUD_M;
    U0GCR =(U0GCR &~U0GCR_BAUD_E)| UART_BAUD_E;
    
    //初始化 UART 协议(起始/停止位、数据位、奇偶校验等):
    // USART 模式= UART (U0csr.mode = 1)
    U0CSR |= U0csr_mode;
    
    //起始位电平=低=>空闲电平=高电平(U0UCR.START = 0)。
    U0UCR &=~U0UCR_START;
    
    //停止位电平=高电平(U0UCR.STOP = 1)。
    U0UCR |= U0UCR_STOP;
    
    //停止位数= 1 (U0UCR.SPB = 0)。
    U0UCR &=~U0UCR_SPB;
    
    //奇偶校验=禁用(U0UCR.奇 偶校验= 0)。
    U0UCR &=~U0UCR_parity;
    
    // 9位数据使能= 8位传输(U0UCR.BIT9 = 0)。
    U0UCR &=~U0UCR_BIT9;
    
    //位9的电平= 0 (U0UCR-D9 = 0)、在 U0UCR.BIT9 = 1时使用。
    //位9的电平= 1 (U0UCR-D9 = 1)、在 U0UCR.BIT9 = 1时使用。
    //奇偶校验=偶数(U0UCR-D9 = 0)、在 U0UCR.奇 偶校验= 1时使用。
    //奇偶校验=奇数(U0UCR-D9 = 1)、在 U0UCR.奇 偶校验= 1时使用。
    U0UCR &=~U0UCR_D9;
    
    //流控=被禁用(U0UCR.flow = 0)。
    U0UCR &=~U0UCR_flow;
    
    //位顺序= LSB 优先(U0GCR.Order = 0)。
    U0GCR &=~U0GCR_Order;
    
    //在周期性任务
    中静态空 performPeriodicTaskUltrasonic (void)
    {
    //中断方法
    uart0StartRxForIsr ();
    DevInfo_SetParameter (DevInfo_DIG_IN_DATA_ID、sizeof (uartRxBuffer)-1、(*) uartStartRxForisr
    
    
    ){uart0void / uartStartRxFr}函数
    
    
    //准备接收新数据包。
    uartPktReceived = 0;
    
    //初始化 UART RX 缓冲区索引。
    uartRxIndex = 0;
    
    //清除任何挂起的 UART RX 中断标志(TCON.URXxIF = 0、UxCSR.RX_BYTE = 0)。
    URX0IF = 0;
    
    //启用 UART RX (Uxcsr.re = 1)。
    U0CSR |= U0csr_re;
    
    //启用全局中断(IEN0.EA = 1)和 UART RX 中断(IEN0.URXxIE = 1)。
    URX0IE = 1;
    EA = 1;
    }
    
    //这里是中断矢量
    #pragma vector = URX0_vector
    __interrupt void UART0_RX_ISR (void)
    {
    //清除 UART0 RX 中断标志(TCON.URX0IF = 0)。
    URX0IF = 0;
    
    //读取 UART0 RX 缓冲器。
    uartRxBuffer[uartRxIndex++]= U0DBUF;
    
    //如果接收到所有 UART 数据,则停止此 UART RX 会话。
    if (uartRxIndex >= size_for_UART_RX_buffer)
    {
    uartRxIndex = 0;
    uartPktReceived = 1;
    }
    }
    
    
    
    
    
    

    使用引脚0.2和引脚0.3作为我的 UART  

    UART 数据 每1秒发送一次、周期性事件也每1秒触发一次

    请帮助

    此致。

    Siddharth

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

    由于您使用的是 BLE Stack、为什么不在 hal_UART.c 中使用 API 而不是编写您自己的 UART 代码?

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

    这用于 UART
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、这是我的拼写错误。 我已经修复了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yikai、

    您能否给我举一个有关如何使用 hal_UART 的示例

    我一直在看到该指南
    您能不能让我指向一个可以找到代码的位置
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请尝试参阅 sunmaysky.blogspot。tw/.../how-to-use-two-uart-ports-in-cc2530-z.html
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 YiKai、

    这是我要使用的代码

    //in init 函数
    HalUARTInit();
    halUARTCfg_t uartConfig;
    uartConfig.configured =真;
    uartConfig.波特 率 = HAL_UART_BR_9600;
    uartConfig.FlowControl =错误;
    uartConfig.flowControlThreshold = 48;
    uartConfig.Rx.maxBufSize = 128;
    uartConfig.TX.maxBufSize = 128;
    uartConfig.idleTimeout = 6;
    uartConfig.intEnable =真;
    uartConfig.callBackFunc = uart0RxCb;
    HalUARTOpen (HAL_UART_PORT_0、&uartConfig);
    
    //Callback 函数
    void uart0RxCb (uint8端口、uint8事件)
    {
    while (Hal_UART_RxBufLen (port))
    ){
    HalUARTRead (端口、Read_Buint8事件)});5
    
    
    
    ms}/周期函数
    DevInfo_SetParameter (DevInfo_DIG_IN_DATA_ID、sizeof (Read_buf)、(char*) Read_buf);
    
    //此处是宏 INT_HAL_HEAP_LEN=3000 HAL_INALNODEBUG
    OSAL_CBTIMER_TAGS_NUM_TAGS_TRES=TRUART_PAGE_RAM_UART_UART=TRY_UART_UART_UART_UART_CLAP_PAY=TRUART_UART_UART_UART_2541=RE_MA_0_MA_MA_PALQ_MA_MA_MA_MA_PALQ_0=TRUART_UART_UART_
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    请帮助

    我需要做的任何其他事情

    我根本无法建立一个拐点

    谢谢  

    Siddharth

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的意思是、您根本无法建立拐点? BLE 连接还是 UART 连接?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    BLE

    我也会收到此警告

    警告[W52]:公共段 INTVEC 中地址0x6b 处字节的多个定义。 它在模块"hal_uart"以及模块"hal_key"中定义

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

    如果您注释掉 uart0RxCb 中的所有内容以再次测试、它是否连接?

    void uart0RxCb (uint8端口、uint8事件)
    {
    //while (hal_UART_RxBufLen (port)
    )//{
    //HalUARTRead (port、read_buf、5);
    //}
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../7220.keyfobdemo.cNope、未连接。

    我是否应该向您发送我们正在使用的 keyfobdemo.c 文件。 请查找附件

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果删除 UART 相关代码、它是否连接?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 YiKai、

    解决了无法连接的问题

    现在、UART 问题:我们不能接收数据

    //变量
    静态 uint8 read_buf[]={0};
    
    // UART 回调函数
    void uart0RxCb (uint8端口,uint8事件)
    {
    while (hal_UART_RxBufLen (端口))
    {
    HalUARTRead (端口、read_buf、sizeof (read_buf)))
    
    
    
    
    ;{/Init 函数}
    
    halUARTCfg_t uartConfig;
    uartConfig.configured =真;
    uartConfig.波特 率 = HAL_UART_BR_9600;
    uartConfig.FlowControl =错误;
    uartConfig.flowControlThreshold = 48;
    uartConfig.Rx.maxBufSize = 6;
    uartConfig.TX.maxBufSize = 6;
    // uartConfig.idleTimeout = 6;
    uartConfig.intEnable =真;
    uartConfig.callBackFunc = uart0RxCb;
    HalUARTOpen (HAL_UART_PORT_0、&uartConfig);
    }
    
    //在周期函数
    DevInfo_SetParameter (DevInfo_email_ID、sizeof (read_Buf)、(char*) read_buf);
    

    我的代码中缺少的任何内容。 请帮帮我

    HAL_UART=true
    HAL_UART_DMA=1

    DMA 是否也使用流控制????

    谢谢、此致。

    Siddharth

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    能不能有人帮我。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您向 UART 发送内容时、是否会调用 uart0RxCb?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 YiKai、

    我们无法检查我没有连接调试器。

    我们尝试检查了 UartRXBuffer 的大小、但它没有任何内容、甚至移动设备上没有弹出"0"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请使用调试器检查在发送 UART 消息时是否调用了 uart0RxCb。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们计划使用 DMA 方法而不是轮询。

    节电(xPOWER_SAVing)已禁用、我们能够无缝连接 BLE 模块、但仍无法从 UART 获取预期数据。

    我们尝试从 UART 接收5个字符(例如30.50)的数据、但未收到任何数据。 我们已将 Rx 和 Tx 缓冲器的缓冲区大小更改为5

    中断

    这是代码

    //HAL UART
    {
    HalUARTInit();
    halUARTCfg_t uartConfig;
    uartConfig.configured =真;
    uartConfig.波特 率 = HAL_UART_BR_9600;
    uartConfig.FlowControl =错误;
    uartConfig.flowControlThreshold = 48;
    uartConfig.Rx.maxBufSize = 5;
    uartConfig.TX.maxBufSize = 5;
    uartConfig.idleTimeout = 255;
    uartConfig.intEnable =真;
    uartConfig.callBackFunc = uart0RxCb;
    HalUARTOpen (HAL_UART_PORT_0、&uartConfig);
    }
    
    //Callback 函
    数 void uart0RxCb (uint8端口、uint8事件)
    {
    while (HAL_UART_RxBufLen (port))
    ){
    HalURead (端口、READ_BUART5)};
    
    }
    

    以及如何将 uint8数组转换为 cha*数组

    DevInfo_SetParameter (DevInfo_email_data_ID、5、(cha*) read_buf);

    这里是预处理器设置

    HAL_UART=true
    HAL_UART_DMA=1
    HAL_UART_DMA


    请帮我们解决这个问题...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从 UART 接收数据30.50意味着什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    这只是一个示例('3'、'0'、'。'、'5'、'0') 表示传入 cc2541 UART 的数据。

    Siddharth

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

    uartConfig.Rx.maxBufSize = 5;
    uartConfig.TX.maxBufSize = 5;

    ???
    尝试将其设置为

    uartConfig.Rx.maxBufSize = 128;
    uartConfig.TX.maxBufSize = 128;