你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 HAL库使用SPI+DMA驱动WS2812优化方案  

[复制链接]
waiman 发布时间:2018-2-6 15:03
阅读主题, 点击返回1楼
1 收藏 28 评论77 发布时间:2018-2-6 15:03
77个回答
jjbboox 回答时间:2018-3-21 17:36:10
本帖最后由 jjbboox 于 2018-3-21 17:39 编辑

其实把SPI的速度调到2.25Mbps,用3bit代表1位即可。这样24bit只需要用8个字节就OK了。
STM32F103C8T6 SPI2 16分频 2.25Mbps完美实现。
yyq006 回答时间:2018-3-22 09:03:00
SPI速度调到2.5Mbps,对W2812来说时序确实更准确一些。不过一个像素是用9个字节。
waiman 回答时间:2018-3-22 10:06:37
jjbboox 发表于 2018-3-21 17:36
其实把SPI的速度调到2.25Mbps,用3bit代表1位即可。这样24bit只需要用8个字节就OK了。
STM32F103C8T6 SPI2  ...

厉害!
但3bit要对齐8bit的变量点难度哦。
请教一下用什么方法对齐变量的?
yyq006 回答时间:2018-3-22 15:21:03
按颜色处理,每种颜色正好3个字节,处理不算复杂。
压缩存储位可以节省空间,但数据处理要多花一些时间,使用中要根据实际情况来选择。
waiman 回答时间:2018-3-23 22:54:57
yyq006 发表于 2018-3-22 15:21
按颜色处理,每种颜色正好3个字节,处理不算复杂。
压缩存储位可以节省空间,但数据处理要多花一些时间,使 ...

相当于用Flash和运算时间换RAM空间。
jjbboox 回答时间:2018-3-24 11:24:04
本帖最后由 jjbboox 于 2018-3-24 11:25 编辑
waiman-156411 发表于 2018-3-22 10:06
厉害!
但3bit要对齐8bit的变量点难度哦。
请教一下用什么方法对齐变量的? ...

110代表1
100代表0

sztyzhi 回答时间:2018-3-24 16:12:20
谢谢LZ
sztyzhi 回答时间:2018-3-24 16:12:54
再次感谢
nanren0542 回答时间:2018-3-24 21:23:21
好资料,需要学习
lin-ba-xin 回答时间:2018-3-27 22:04:41
請問 我目前只驅動一顆WS2812
所以我將PIXELS_LEN 改成 1 後 燈就不動作
能問一下還有什麼地方沒注意到的
感謝
jjbboox 回答时间:2018-3-27 23:02:26
lin-ba-xin 发表于 2018-3-27 22:04
請問 我目前只驅動一顆WS2812
所以我將PIXELS_LEN 改成 1 後 燈就不動作
能問一下還有什麼地方沒注意到的

可能是你的reset信号不正确,或者说低电平的持续时间不够。
翱翔云端的鸟 回答时间:2018-4-9 15:02:45
jjbboox 发表于 2018-3-21 17:36
其实把SPI的速度调到2.25Mbps,用3bit代表1位即可。这样24bit只需要用8个字节就OK了。
STM32F103C8T6 SPI2  ...

2.25Mbps   3bit表示24位中的一个位     那一个完整的颜色需要24*3=72bit  的SPI数据   也就是72/8=9byte
这里24bit应该是9byte的数据吧?
   
jjbboox 回答时间:2018-4-10 07:30:42
本帖最后由 jjbboox 于 2018-4-10 07:35 编辑
翱翔云端的鸟 发表于 2018-4-9 15:02
2.25Mbps   3bit表示24位中的一个位     那一个完整的颜色需要24*3=72bit  的SPI数据   也就是72/8=9byte ...

是的,其实两头各还要加一个RESET信号,大概在32个字节左右吧。
比如8颗粒的灯条,那么分配的内存就应该是8 * 9 + 32 = 104字节。
16颗粒的灯条就是 16 * 9 + 32 = 176 字节
翱翔云端的鸟 回答时间:2018-4-10 09:42:55
jjbboox 发表于 2018-4-10 07:30
是的,其实两头各还要加一个RESET信号,大概在32个字节左右吧。
比如8颗粒的灯条,那么分配的内存就应该是 ...

我现在遇到一个问题    3bit表示一个code     001  表示0code         110表示1code     
当我要发送9byte的一个24bit颜色值的时候  比如是传输红色
按照G R B  传输 为   0x00  0xFF  0x00   

转换为二进制
001 001 001 001 001 001 001 001 001 001 001
110 110 110 110 110 110 110 110 110 110 110
001 001 001 001 001 001 001 001 001 001 001

SPI数据为:
        0x24                0x92                0x49
0010 0100   1001 0010    0100 1001  
        0xDB                0x6D                0xB6
1101 1011   0110 1101    1011 0110
        0x24                0x92                0x49
0010 0100   1001 0010    0100 1001


这里的问题是当我SPI发送完0x24之后  发送0x92的时候  0x24的最后一位是0  0x92最后一位是1   导致0x24的最后一个0码和0x92的1码混合了  
翱翔云端的鸟 回答时间:2018-4-10 09:43:50
jjbboox 发表于 2018-4-10 07:30
是的,其实两头各还要加一个RESET信号,大概在32个字节左右吧。
比如8颗粒的灯条,那么分配的内存就应该是 ...

另外  楼主这里的4M  是不是改为 3.2M更合适啊   

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版