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.

[参考译文] CC1312R:使用由外部信号触发的 UDMA 从 IO 引脚捕获8位数据

Guru**** 2556560 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1022661/cc1312r-capture-8bit-data-from-io-pins-using-udma-triggered-by-external-signal

器件型号:CC1312R

您好!

在我的 CC1312设计中、我尝试使用连接到 GPIO16..GPIO23的外设的 UDMA 8位数据进行捕获(读取)、但我遇到了问题、需要您的帮助。

目标是 UDMA 通道13执行乒乓传输-由具有有效上升沿的外部选通信号触发、并在每个上升沿从 GPIO_O_DIN31寄存器读取(捕获) 32位数据。

选通信号连接到 GPIO27、其频率= 1.5MHz。

我将 GPIO27配置为数据输入、以便在上升沿生成 IOEV_AON_PROG2事件(IOC_O_IOCFG27寄存器中的 IOEV_AON_PROG2_EN 位设置)。

此外、在 MCU 事件结构 EVTOMCUSEL 寄存器中、我将 AON_PROG2_EV 设置为0h ->来自 DIO 的边沿检测 IO 事件、该 DIO 已启用对中 IOEVV_AON_PROG2的贡献

因此,UDMA 通道13永远不会被触发,我无法理解原因。

我尝试以与 SPICC26x2DMA 驱动程序类似的方式使用 uDMA 通道。

在 TRM 文档中,我找不到 UDMA 和 GPIO 中断在我的案例中到底如何工作的说明。 您能给我提供更多详细信息吗?

芯片中是否存在一些硬件限制?

问题是在我的案例中如何设置 UDMA 和 GPIO 外设?

 

此致

Emil

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

    您好、Emil、

    很难将您尝试执行的操作可视化、您能否发布代码片段或图?

    我在勘误表中看不到有关通道13的任何信息。  

    谢谢、

    玛丽·H.

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

    您好、Marie H、

    正如我在第一封信中所描述的、我已经通过8位并行总线将器件连接到 CC1312。 该器件开始流式传输8位数据和数据有效选通信号(数据在选通信号的上升沿有效)、频率约为1.5MHz。

    目标是在数据有效选通信号的每个上升沿(每666纳秒)使用 CC1312 UDMA 捕获这8位数据。

    选通信号连接到 DIO27、引脚设置为在上升沿生成 IOEV_AON_PROG2事件(IOC_O_IOCFG27寄存器中的 IOEV_AON_PROG2_EN 位置位)。

    DIO16 DIO23被设定为输入。

    我修改我之前的代码以使用由 IOEV_AON_PROG2事件触发的 uDMA 通道14。

    结果- uDMA 开始捕获数据-但结果我在 DMA 缓冲区中看到了额外的数据。 (请参阅下图中位于地址0x20001B20的存储器浏览器中的 ImageBuff)

    我连接了数字分析器、并在 UDMA 传输的瞬间捕获所有信号的真实状态。 (下图)

    问题是为什么 UDMA 加载到缓冲区"额外"字节的时间(实际上在缓冲区中加2倍的实数捕捉字节)?

    这是 CC1312芯片的勘误文件硬件问题中未描述的问题还是我的 UDMA 初始化错误?

    在 TRM 文档中,我找不到 UDMA 和 GPIO 中断在我的案例中到底如何工作的说明。 请提供有关此方面的更多详细信息。

    此致

    Emil

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

    您好、Emil、

    数据是否直接从 GP 定时器读取? 如果是这样,您会看到公告 GPTM01 ( https://www.ti.com/lit/swrz078 )。  

    您能否发布我可以用来重现问题的代码片段?

    谢谢、

    玛丽·H.  

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

    您好、Marie H、

    为什么要说 GP 计时器?  我在项目中不使用 GP 计时器...

    您无法在您的一侧重现此问题、因为您没有真正的硬件设备-连接到 CC1312。

    (硬件设备是摄像头(图像传感器))。

    下面是与 DIO27和 UDMA 初始化相关的代码片段。

        // Set IOCFG27 to generate AON_PROG2 event on rising edge
     
        iocfgRegAddr = IOC_BASE + IOC_O_IOCFG27;
        iocfgRegVal = HWREG(iocfgRegAddr);
        // Input edge detection asserts AON_PROG2 event
        iocfgRegVal |= IOC_IOCFG27_IOEV_AON_PROG2_EN;
    
        // Set Positive edge detection
        iocfgRegVal &= ~((uint32_t)(1 << 16));
        iocfgRegVal |= (uint32_t)(1 << 17);
    
        // * Writes to the first byte of the IOCFG register will cause a glitch
        // * on the internal IO line. To avoid this, we only want to write
        // * the upper 24-bits of the IOCFG register when updating the configuration
        // * bits. We do this 1 byte at a time.
        key = HwiP_disable();
            HWREGB(iocfgRegAddr + 1) = (uint8_t) (iocfgRegVal >> 8);
            HWREGB(iocfgRegAddr + 2) = (uint8_t) (iocfgRegVal >> 16);
            HWREGB(iocfgRegAddr + 3) = (uint8_t) (iocfgRegVal >> 24);
        HwiP_restore(key);
    
        
        ....
        
        
        
        UDMACC26XX_init (UDMA_handle);
        UDMA_handle = UDMACC26XX_open();
    
        HWREG(UDMA0_BASE + UDMA_O_CLEARCHANNELEN) = (uint32_t)(1<<UDMA_CHAN_DMA_PROG);
    
        DmaTableEntry = &uDMA_GPIO_Rx_PriControlTableEntry;
        DmaTableEntry->pvSrcEndAddr = (void *)(GPIO_BASE + GPIO_O_DIN31_0 + 2);
        DmaTableEntry->pvDstEndAddr = (void *)ImgageEndAddrPtr;
        ImgageEndAddrPtr += uDMA_TRANSFERRED_ITEMS_NUM;
        DmaTableEntry->ui32Control = UDMA_DST_INC_8 | UDMA_SRC_INC_NONE | UDMA_SIZE_8 | UDMA_ARB_1 | UDMA_MODE_PINGPONG;
        DmaTableEntry->ui32Control |= UDMACC26XX_SET_TRANSFER_SIZE((uint16_t) uDMA_TRANSFERRED_ITEMS_NUM);
    
        DmaTableEntry = &uDMA_GPIO_Rx_AltControlTableEntry;
        DmaTableEntry->pvSrcEndAddr = (void *)(GPIO_BASE + GPIO_O_DIN31_0 + 2);
        DmaTableEntry->pvDstEndAddr = (void *)ImgageEndAddrPtr;
        ImgageEndAddrPtr += uDMA_TRANSFERRED_ITEMS_NUM;
        DmaTableEntry->ui32Control = UDMA_DST_INC_8 | UDMA_SRC_INC_NONE | UDMA_SIZE_8 | UDMA_ARB_1 | UDMA_MODE_PINGPONG;
        DmaTableEntry->ui32Control |= UDMACC26XX_SET_TRANSFER_SIZE((uint16_t) uDMA_TRANSFERRED_ITEMS_NUM);
    
        // Enables single transfer requests on channel UDMA_CHAN_DMA_PROG
        HWREG(UDMA0_BASE + UDMA_O_CLEARBURST) = (uint32_t)(1<<UDMA_CHAN_DMA_PROG);
    
        // Selects the primary data structure for channel UDMA_CHAN_DMA_PROG
        HWREG(UDMA0_BASE + UDMA_O_CLEARCHNLPRIALT) = (uint32_t)(1<<UDMA_CHAN_DMA_PROG);
    
    
        // Channel UDMA_CHAN_DMA_PROG uses the high priority level.
        HWREG(UDMA0_BASE + UDMA_O_SETCHNLPRIORITY) = (uint32_t)(1<<UDMA_CHAN_DMA_PROG);
    
        // Set EVTOMCUSEL AON_PROG2 event source
        RegVal = HWREG(AON_EVENT_BASE + AON_EVENT_O_EVTOMCUSEL);
        RegVal &= ~AON_EVENT_EVTOMCUSEL_AON_PROG2_EV_M;
        RegVal |= AON_EVENT_EVTOMCUSEL_AON_PROG2_EV_IOEV_AON_PROG2;
        HWREG(AON_EVENT_BASE + AON_EVENT_O_EVTOMCUSEL) = RegVal;
    
    //    HWREG(EVENT_NONBUF_BASE + EVENT_O_UDMACH14BSEL) = 0x3;
    
        // Enables channel UDMA_CHAN_DMA_PROG to generate DMA requests.
        HWREG(UDMA0_BASE + UDMA_O_CLEARREQMASK) = (uint32_t)(1<<UDMA_CHAN_DMA_PROG);
    
        // Clear the requested bits in the uDMA interrupt status register.
        HWREG(UDMA0_BASE + UDMA_O_REQDONE) = (uint32_t)(1<<UDMA_CHAN_DMA_PROG);
    
        /* Set constraints to guarantee operation */
        Power_setConstraint(PowerCC26XX_DISALLOW_STANDBY);
        
        ....
    
        // When device is ready to start data streaming .... 
    
    
    
        Enable_DataStrobe_Rising_Edge_Interrupts();
    
    
        // Set UDMACH14BSEL to be triggered by AON_PROG2 event
        HWREG(EVENT_NONBUF_BASE + EVENT_O_UDMACH14BSEL) = EVENT_UDMACH14BSEL_EV_AON_PROG2;
    
        // Enable UDMA_CHAN_DMA_PROG channel
        HWREG(UDMA0_BASE + UDMA_O_SETCHANNELEN) = (uint32_t)(1<<UDMA_CHAN_DMA_PROG);
    
     

    此致

    Emil

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

    您好、Marie H、

    为了不花时间和您的时间-您能否将我的问题重定向到熟悉 CC1312外设的人
    请?

    这个问题与 TRM 中没有这么好的文档记录功能相关、也没有软件示例(无论是否有 RTOS)。

    概率必须重定向到 ter、Siri 或 Sverre Hellan。

    谢谢你
    Emil

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

    您好、Emil、

    不幸的是、我、ter 或 Sverre 都不是 UDMA 的专家。 就我从驱动程序的文档中可以看出、该驱动程序不是由应用程序直接使用的:

    UDMACC26XX 驱动程序目前仅支持使用 UDMA 外设(例如 SPICC26XXDMA)的驱动程序进行内部使用。 换言之、应用程序不应调用此文件中的任何函数。"

    但是、来自驾驶员团队的人员承诺至少要查看这一点、看看他是否能找到有关您观察到的情况的任何解释。

    我想您共享代码(至少相关部分)会有所帮助。 我知道您不想在论坛上分享、但您可以将其直接发送给我、我可以与驾驶员团队分享。

    BR

    Siri