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.

[参考译文] RTOS/LAUNCHXL-CC2640R2:通过 UART 发送中断信号

Guru**** 2595800 points
Other Parts Discussed in Thread: CC2640

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/595455/rtos-launchxl-cc2640r2-sent-break-signal-via-uart

器件型号:LAUNCHXL-CC2640R2
主题中讨论的其他器件:CC2640

工具/软件:TI-RTOS

您好!

我尝试通过 UART 发送一个最小为13位乘以长度的中断信号。

CC26xx UART.h 的文档显示、可以通过以下方式完成:

_static_inline void
UARTBreakCtl (uint32_t ui32Base、bool bBreakState)
{
//
//检查参数。
//
assert (UARTBaseValid (ui32Base));

//

将中断条件设置为请求。

//
HWREG (ui32Base + UART_O_LCRH)=

(bBreakState?

(HWREG (ui32Base + UART_O_LCRH)| UART_LCRH_BRK):

(HWREG (ui32Base + UART_O_LCRH)&~(UART_LCRH_BRK))));
} 

还有以下注意事项:

为了正确传输一个中断命令、至少两个完整帧的中断必须被置为有效

有人可以使用该命令为我提供代码示例吗? 我没有完全理解、笔记的含义是什么。

谢谢你

祝你一切顺利

马西米兰

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

    我正在等待再次听到、以了解如何将其与 driverlib 结合使用。 敬请期待!

    关于该注释、我认为您可能必须:

    1.启用 UARTBreakCtrl( baseAddr ,1)
    然后至少发送到 UART 帧。 我想您可以使用2个字节执行 UART_Write()。
    3、之后禁用 UARTBreakCtrl (baseAddr、0)

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

    您好、Tom、

    我已经通过以下方式尝试了这种方法:

    while (1){
    HWREG (UART0_BASE + UART_O_LCRH)=
    (对吗?
    (HWREG (UART0_BASE + UART_O_LCRH)| UART_LCRH_BRK):
    (HWREG (UART0_BASE + UART_O_LCRH)&~(UART_LCRH_BRK)));
    
    GPIO_WRITE (Board_GPIO_LED1、Board_GPIO_LED_ON);
    UART_WRITE (UART、中断、1);
    UART_WRITE (UART、中断、1);
    HWREG (UART0_BASE + UART_O_LCRH)=
    (错误?
    (HWREG (UART0_BASE + UART_O_LCRH)| UART_LCRH_BRK):
    (HWREG (UART0_BASE + UART_O_LCRH)&~(UART_LCRH_BRK)));
    
    Task_sleep (1000 *(1000 / Clock_tickPeriod));
    GPIO_WRITE (Board_GPIO_LED1、Board_GPIO_LED_OFF);
    } 

    它会进行编译、但看起来像 UART_write()命令中的器件残桩。  

    这可能是一个愚蠢的问题、但您能告诉我如何使用 CC26xx 驱动程序库吗? 在我的 UART.h 文件中、函数 UARTBreakCtl 未声明为我在上面发布的函数。

    我使用的是 SimpleLink CC2640R2 SDK 1.30.00.25

    谢谢。

    马西米兰

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

    1.启用 UARTBreakCtrl( baseAddr ,1)
    然后至少发送到 UART 帧。 我想您可以使用2个字节执行 UART_Write()。
    3、之后禁用 UARTBreakCtrl (baseAddr、0)

    如果 UART_Write()只是将字节放入 TX FIFO 中,则经过的时间基本上为零。

    UART 将用于发送实际数据、因此可能会有中断处理程序、当告知发送了两个意外字节时、中断处理程序可能会执行一些奇怪的操作。

    因此、我想正确的顺序是:

    1. 等待 TX FIFO 为空(UARTBusy());
    2. 禁用 TX 中断;
    3. 启用中断;
    4. 发送两个字节;
    5. 等待 TX FIFO 再次清空;
    6. 禁用中断;
    7. 重新启用 TX 中断。

    我不知道忙等待在这个应用中是否是一个好的…

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

    [引用用户="Clemens Ladisch"]

    因此、我想正确的顺序是:

    1. 等待 TX FIFO 为空(UARTBusy());
    2. 禁用 TX 中断;
    3. 启用中断;
    4. 发送两个字节;
    5. 等待 TX FIFO 再次清空;
    6. 禁用中断;
    7. 重新启用 TX 中断。

    [/报价]

    我已经按以下方式尝试了这一点:

    while (1){
    
    GPIO_WRITE (Board_GPIO_LED1、Board_GPIO_LED_ON);
    
    if (UARTBusy (UART0_BASE)== false){
    UARTIntDisable (UART0_BASE、UART_INT_TX);
    UARTBreakCtl (UART0_BASE、TRUE);
    UART_WRITE (UART、0x00、1);
    UART_WRITE (UART、0x00、1);
    }
    if (UARTBusy (UART0_BASE)== false){
    UARTBreakCtl (UART0_BASE、false);
    UARTIntEnable (UART0_BASE、UART_INT_TX);
    }
    
    GPIO_WRITE (Board_GPIO_LED1、Board_GPIO_LED_OFF);
    
    Task_sleep (1000 *(1000 / Clock_tickPeriod));
    } 

    目前、我没有可用的 Oszilloscope、因此如果代码正常工作、我将尝试使用 LED1来确定它。  

    根据代码、LED1应该必须闪烁、但它不会闪烁。 它始终保持开启状态。  

    我对编程非常陌生。 您能不能给我一个提示、说明可能出现了什么问题?

    祝你一切顺利

    马西米兰

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

    "IF"不会实现等待。 要等到 UART 不忙、请使用如下代码:

    while (UARTBusy (UART0_BASE))
    ;//不执行任何操作 

    如果 UART_WRITE()需要一个缓冲区指针,为其提供0x00将使其爆炸;您必须使用一个单字节缓冲区(或使用两字节缓冲区的单次调用)。

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

    您好!

    同时也不起作用。

    unsigned char LIN_break[2]={0x55、0x55};
    

    while (UARTBusy (UART0_BASE));//等待 UART 可用
    
    UARTIntDisable (UART0_BASE、UART_INT_TX);//禁用 TX 中断
    UARTBreakCtl (UART0_BASE、TRUE); //设置中断
    // Task_sleep (1050/Clock_tickPeriod);//断言两个帧时间
    
    UART_WRITE (UART、&LIN_break、2);
    while (UARTBusy (UART0_BASE));//等待 UART 可用
    
    UARTBreakCtl (UART0_BASE、false); //取消设置中断
    UARTIntEnable (UART0_BASE、UART_INT_TX);//启用 UART 中断
    

    器件在 UART_write()命令处挂起。 如果我注释掉这些行、它会运行、但不会生成中断。

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

    没有人知道如何实施中断?

    祝你一切顺利

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

    对于主器件、如果 UART Tx 引脚可被分配为 GPIO 模式、您可以将其设置为该模式、然后生成下降沿信号以用于在677us 至1ms 之间以13位低电平状态进行中断或更多状态中断、 然后、您可以将其驱动为高电平、然后简单地将模式切换到 UART 模式。 从器件可以将低电平状态识别为中断信号。

    或优化9600bps 模式以使用0x00生成中断信号、然后切换到19200bps 模式、然后同步(0x55)+ PID。

    根据我的经验、GPIO 驱动比波特率切换更容易。

    对于 salve、您可以使用相同的方法。 首先、UART Rx 引脚应用作 GPIO、该引脚应生成下降沿和上升沿的中断/系统事件。

    当触发边沿时、您需要检查对以及下降和上升之间的持续时间、如果持续时间超过1ms、则信号应被丢弃。

    如果成功、中断信号被很好地检测到、则立即切换到 UART 模式以接收同步+ PID。 在 UART 运行期间、如果接收到的数据不是您想要的、 则需要再次立即切换至 GPIO 模式以再次检测中断信号。 UART 运行期间使用19200bps。

    BR、
    吉元

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

    [引用 USER="Ji Won Lee">对于主器件、如果 UART Tx 引脚可被分配为 GPIO 模式、则可以将其设置为模式、然后生成下降沿信号以在677us 至1ms 之间以13位低电平状态或更高状态进行中断、 然后、您可以将其驱动为高电平、然后简单地将模式切换到 UART 模式。 从器件可以将低电平状态识别为中断信号。[/QUERP]

    在我的硬件设计中、这将是我的备用解决方案。

    [引用用户="Ji Won Lee">或优化9600bps 模式、以使用0x00生成中断信号、然后切换到19200bps 模式、然后同步(0x55)+ PID。
    [/报价]

    这正是我的解决方案正在发挥作用的时刻。 缺点 是、我无法控制中断字节和同步字节之间的字节间空间、因为我必须关闭 UART、切换波特率并再次启用它。  

    我不知道要使用 CC2640、因为我知道、中断信号的生成很容易。  

    似乎不是:-/

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    无论如何、GPIO 驱动比波特率切换更容易处理中断信号和 IBS。
    祝你好运。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如今,Rx 的实现是通过 scifUartRxGetChar() API Sensor Controller 提供的返回标志来完成的。
    在这种情况下、不需要使用 GPIO 触发。

    uint16 return_value = scifUartRxGetChar();
    uint8 rx_data = return_value & 0x00ff;
    if ((RX_DATA == 0x00)&&(RETURE_VALUE & 0x0300))

    //Display_print0 (dispHandle、2、0、"\r\n 检测到 Break 或帧错误\r\n);
    setBreakSignalDetect (真);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想您正在谈论接收、但我想传输一个中断信号。

    这不是一种非常严肃的方法、但现在我通过波特率切换发送了中断、它起作用了。

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

    我知道。

    我只是想与您和其他人分享我的事情。

    我还通过传感器控制器提供的 API 生成中断信号。

        if (DEV_idx = MAIN_CENTRAL_DEVICE_NODE)

        {    

          //启用波特率生成

          scifUartSetBaudRate (9600);   

          scifUartTxPutChar (stBuff.data_buff[0]);

          scifWaitOnNbl(500);

          //启用波特率生成

          scifUartSetBaudRate (19200);       

          scifUartTxPutChars (&stBuff.data_buff[1]、u8Length -1);

    BR、

    吉元

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

    您是否还创建了定制硬件?

    如果是、您使用的是哪个模块或封装?

    目前、我正在尝试使用 cc2640 launchpad 刷写我的定制板、并搜索 innocomm bm15模块的 board.h 文件

    祝你一切顺利

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

    是的、我正在使用我们的定制板、可以通过 Launchpad 板进行编程、而无需使用跳线。

    我们的板包含 CC2640R2-Q1芯片组。 非模块。

    BR、

    吉元