WS2812 使用小型 PSoC4 时序问题

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

我一直在尝试使用没有 UDB 的小型 PSoC 4 设备运行 WS2812 RGB+IC LED。 我的时机似乎还不够快。 看来有了 24MHz 的部件我应该没问题,只要敲一下 IO 引脚就能运行这个 WS2812 LED。 有没有使用过这种部件的人,我可能会仔细检查我的代码和设置,看看我出了什么问题。我的代码很简单,只驱动一个LED(像素)。

当我运行 ws2812_SendPixel (0, 0, 0) 例程时,我的零序列运行 880nS,这太慢了。 正在寻找 400 纳秒或更少。

Gone_0-1700173981236.png

 

另外,当我运行 ws2812_SendPixel(255、255、255)时,我的代码似乎运行正常,但发出的数据并不对称,最后 3 位与前 4 位不同。

 

Gone_1-1700174132260.png

我已经附上了我的项目。 我正在运行的 PSoC4 设备是 CY8C4025LQI-S402T

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/WS2812-Timing-Problem-with-small-PSoC4/td-p/642505

0 点赞
1 解答
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

读完 AN86439 PSoC 4 MCU-使用 GPIO 引脚文档后,有一节介绍如何使用数据寄存器更快地切换 GPIO。 在本文档中,PSoC Creator 中使用了 3 个宏,它们使用直接寄存器写入来更快地切换和读取引脚。 我使用了 CY_SYS_PINS_SET_PIN(portDR,pin)和 CY_SYS_PINS_CLEAR_PIN(portDR,pin)宏,这解决了我的计时问题。 这些宏中的每一个只有 8 个时钟周期可以运行,而不是通常的 20 多个时钟周期。 附带的代码现在可以正常运行我的 WS2812 等效 LED,没有问题。 注意特定 LED 我要求发送红色、绿色、蓝色数据,而不是 WS2812 LED,后者需要发送绿色、红色、蓝色的订单。 我在代码中注意到了这一点。 该代码应该可以在任何处理器上运行,只需很少或根本不需要调整。

我的项目使用了一个小型低成本的 4000S CY8C4025LQI-S402 PSoC4 器件,并串联驱动两个 RGB+IC LED。 我在实际设计中使用 LED 指示模式和错误指示灯。 在这款 4000S PSoC 上没有 UDB 和 DMA 可用,所以我需要稍微调整一下 WS2812 设备的时机。 如果你在 48MHz 范围内运行速度更快的 PSoC,你可以使用 SPI 来驱动 WS2812(需要 > = 2Mb/s),而有了 DMA,你可以完全在硬件上运行。 如果你的 PSoC 有 UDB,表单上已经发布了一些不错的代码了。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/WS2812-Timing-Problem-with-small-PSoC4/m-p/644935

在原帖中查看解决方案

0 点赞
7 回复数
Translation_Bot
Community Manager
Community Manager
Community Manager

你好。

我还没看过你的代码,但这是我使用 PSoc4 bit-banging 的经验。

我的 PSoc4 和你使用的不同。 我使用的是 4245,几年前进行了这个激烈的讨论。
已解决: Re: Bitbanging 循环计数 - Infineon Developer Community

我怀疑 4245 和 4025 之间的时钟周期数会相似,但我也可能大错特错。 充其量, 使用 ARM 汇编器 " strb rx、[ry] 指令需要 5 个 HFCLK 或者使用汇编器 l " dr rx、[ry]
或 r1、rz " 指令的 9 个 HFCLK 。 "

假设你没有划分 HFCLK(也就是说,它也像 IMO 一样运行 24MHz),那么 GPIO 切换速率将为:
5x41.66ns = 208nS

9x41.66ns = 375nS(取决于使用的汇编指令)。

PSoc4 GPIO PIN 手册 AN86439 中有一节讨论如何加快 GPIO 切换速度。 但是,你得到它的速度不会比我在汇编程序中显示的要快。 顺便说一句,AN86439 是一本不错的读物。 很多有用的信息。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/WS2812-Timing-Problem-with-small-PSoC4/m-p/642532

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

感谢您的快速回复...我的办公桌上现在有 AN86439。 我会读一读,看看我能从中学到什么。 我从未做过任何 ARM 汇编器编码。 有学习这个的好地方吗?

谢谢

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/WS2812-Timing-Problem-with-small-PSoC4/m-p/643240

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨。

将汇编器添加到 C 代码中非常简单。 只是语法让人烦恼。 了解如何在 C 代码中添加汇编器的最佳参考见应用笔记 AN89610。 本文档中有许多示例显示汇编器与 C 代码并排放置。 本文档还涵盖了用于构建该项目的许多其他主题。 另一本好书。

至于 ARM 指令集,您可以访问 ARM 网站并下载指令集参考指南《"通用用户指南》"。 M0+ 的架构可在"技术参考手册中找到。"
只要确保你有适用于 Cortex-M0+ 的那个即可。

至于学习汇编程序,我想你得在谷歌上搜索一下。 有大量免费的 pdf 课程。 甚至可能是 Youtube? 我确实发现这个链接可能很有用:汇
编语言编程 的失落艺术 — 使用 PSoc4 和 Creator 的物联网专家 。

由于你的应用程序是切换 GPIO 以满足 WS2812 规范,所以我不会为了花哨而挂断电话。 保持代码简单并使用测试设备检查结果。 可能需要尝试几次才能使语法正确,但我们就是这样学习的。

祝你的项目好运。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/WS2812-Timing-Problem-with-small-PSoC4/m-p/643289

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好。

我快速浏览了 main.c,发现 ws2812_SendByte 中有一个错误。
删除一行:
字节 < < = 1;
这应该修复该字节的最后 4 个信号以传输 1 而不是传输 0。

在信号时序方面,对于显示为 880nS 高时的 0,我浏览了列表并添加了时钟周期。 所有汇编器指令有 22 个时钟周期(由于内部总线结构可能减去 1 个时钟),以产生 0 的高电平信号。 当时钟 = 24MHz 时,这会产生 916ns(22 clks)或 875ns(21 clks)。 因此,完全可以解释。

顺便说一句,最后一行有 6uS 延迟,我认为应该是 300uS 延迟(或者较旧部分的 60uS 延迟)。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/WS2812-Timing-Problem-with-small-PSoC4/m-p/643465

0 点赞
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

感谢你看我的代码,我真的很感激! 我修改了你建议的代码,还添加了几行汇编代码来切换我的 WS2812 DIN 引脚。 我用了你提到的物联网专家的例子,他展示了如何在装配中切换 IO 引脚。 我使用 AN89610 中包含的信息来添加所需的行。 我不明白的是如何添加所需的包含语句,即.include "cydevicegnu_ " trm.inc。

我该如何添加此包含声明或类似内容。 我已附上我的代码以供审查。

谢谢

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/WS2812-Timing-Problem-with-small-PSoC4/m-p/644920

0 点赞
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

读完 AN86439 PSoC 4 MCU-使用 GPIO 引脚文档后,有一节介绍如何使用数据寄存器更快地切换 GPIO。 在本文档中,PSoC Creator 中使用了 3 个宏,它们使用直接寄存器写入来更快地切换和读取引脚。 我使用了 CY_SYS_PINS_SET_PIN(portDR,pin)和 CY_SYS_PINS_CLEAR_PIN(portDR,pin)宏,这解决了我的计时问题。 这些宏中的每一个只有 8 个时钟周期可以运行,而不是通常的 20 多个时钟周期。 附带的代码现在可以正常运行我的 WS2812 等效 LED,没有问题。 注意特定 LED 我要求发送红色、绿色、蓝色数据,而不是 WS2812 LED,后者需要发送绿色、红色、蓝色的订单。 我在代码中注意到了这一点。 该代码应该可以在任何处理器上运行,只需很少或根本不需要调整。

我的项目使用了一个小型低成本的 4000S CY8C4025LQI-S402 PSoC4 器件,并串联驱动两个 RGB+IC LED。 我在实际设计中使用 LED 指示模式和错误指示灯。 在这款 4000S PSoC 上没有 UDB 和 DMA 可用,所以我需要稍微调整一下 WS2812 设备的时机。 如果你在 48MHz 范围内运行速度更快的 PSoC,你可以使用 SPI 来驱动 WS2812(需要 > = 2Mb/s),而有了 DMA,你可以完全在硬件上运行。 如果你的 PSoC 有 UDB,表单上已经发布了一些不错的代码了。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/WS2812-Timing-Problem-with-small-PSoC4/m-p/644935

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

做得很好!!!

顺便说一句,你也可以使用以 3 倍速率运行的 SPI,有查找表,没有 DMA。 SPI fifo 足够深,你可以使用 SPI FIFO 中断来重新填充 FIFO。 这种方法的好处是,您可以按反向位顺序(或正常比特顺序)查找数据,然后将 SPI 配置为先发送数据 MSB 或 LSB,从而节省大量处理时间。 这为 main.c 留出了大量的 CPU 时间来运行。 唯一的缺点是存储 256 个普通字节需要 256x3 字节(每个位在表中由 3 位表示,以产生 1/3 和 2/3 的占空比)。 在我看来,这是一个很小的惩罚。

祝你的项目好运。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/WS2812-Timing-Problem-with-small-PSoC4/m-p/644950

0 点赞