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

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 编辑
) T/ r$ _: g# [3 g3 L+ d6 ^
# R* b7 x) {7 o0 r$ Z其实把SPI的速度调到2.25Mbps,用3bit代表1位即可。这样24bit只需要用8个字节就OK了。. D' P1 U; C6 Q7 N( V
STM32F103C8T6 SPI2 16分频 2.25Mbps完美实现。
3 j1 n1 Z, Q& b$ E5 r
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
6 c5 T1 s, r0 M* n: i其实把SPI的速度调到2.25Mbps,用3bit代表1位即可。这样24bit只需要用8个字节就OK了。3 D! r4 x' P5 r$ B; `+ c" c
STM32F103C8T6 SPI2  ...
% F3 q; n3 v& q) b4 l$ a5 t' _& p! D
厉害!
5 V1 E6 ]8 p, A) Z; I/ F4 z4 G但3bit要对齐8bit的变量点难度哦。( @0 I& |6 u; U6 e2 |1 k
请教一下用什么方法对齐变量的?
yyq006 回答时间:2018-3-22 15:21:03
按颜色处理,每种颜色正好3个字节,处理不算复杂。- |- g0 R  t$ `& N1 r
压缩存储位可以节省空间,但数据处理要多花一些时间,使用中要根据实际情况来选择。
waiman 回答时间:2018-3-23 22:54:57
yyq006 发表于 2018-3-22 15:21' M! \3 T3 I" e0 c+ U! o2 s! N
按颜色处理,每种颜色正好3个字节,处理不算复杂。+ m8 u2 o- Z& I
压缩存储位可以节省空间,但数据处理要多花一些时间,使 ...
# K& r; m% A5 k* \& g/ I
相当于用Flash和运算时间换RAM空间。
jjbboox 回答时间:2018-3-24 11:24:04
本帖最后由 jjbboox 于 2018-3-24 11:25 编辑
1 ]# X+ h7 |: v: n3 E5 x3 m
waiman-156411 发表于 2018-3-22 10:06: p0 h0 S+ F9 O, S  q# Y) g4 S; o, f
厉害!
# E) g7 S3 b* [8 l但3bit要对齐8bit的变量点难度哦。1 K3 n5 D- A. ~; w: ]' B& R  p
请教一下用什么方法对齐变量的? ...

, L. e5 ?3 r- A  i. k, L110代表1) G1 _- b$ q0 E" T- n
100代表0
; A4 P  A/ m) t) K# d/ p# k; Y! j5 Y1 h% J. D
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
) \( l1 C0 u8 P. s; i& l3 l所以我將PIXELS_LEN 改成 1 後 燈就不動作
$ _6 q# s/ i! I' J5 [% C+ A能問一下還有什麼地方沒注意到的# i; h7 s, e% w
感謝
jjbboox 回答时间:2018-3-27 23:02:26
lin-ba-xin 发表于 2018-3-27 22:04
+ j/ u1 c3 n+ W+ [請問 我目前只驅動一顆WS2812 & z- @1 g! T% `
所以我將PIXELS_LEN 改成 1 後 燈就不動作
1 v8 `  ?2 B/ m0 J! P, F能問一下還有什麼地方沒注意到的

' P7 t6 M$ u" w/ s' I可能是你的reset信号不正确,或者说低电平的持续时间不够。
翱翔云端的鸟 回答时间:2018-4-9 15:02:45
jjbboox 发表于 2018-3-21 17:363 J9 {! U: k) I) Z
其实把SPI的速度调到2.25Mbps,用3bit代表1位即可。这样24bit只需要用8个字节就OK了。
, ^% q# F3 T0 l% M+ ^% |STM32F103C8T6 SPI2  ...
1 c& {7 l8 w; e3 j
2.25Mbps   3bit表示24位中的一个位     那一个完整的颜色需要24*3=72bit  的SPI数据   也就是72/8=9byte
1 z" t$ B1 t' ~: t/ ?- N' z这里24bit应该是9byte的数据吧?
' j/ l. D% ]! m' @: D% `   
jjbboox 回答时间:2018-4-10 07:30:42
本帖最后由 jjbboox 于 2018-4-10 07:35 编辑
  d  k/ c0 a. C7 s/ B: @0 B8 z8 ^( f
翱翔云端的鸟 发表于 2018-4-9 15:02
: r( g; Y. o; F  `0 ~2.25Mbps   3bit表示24位中的一个位     那一个完整的颜色需要24*3=72bit  的SPI数据   也就是72/8=9byte ...

3 R+ b" ^, U) ?) q# ]: L/ H% Z是的,其实两头各还要加一个RESET信号,大概在32个字节左右吧。% T' v- g. @! {# O, i. v
比如8颗粒的灯条,那么分配的内存就应该是8 * 9 + 32 = 104字节。' N, D8 f  W4 z
16颗粒的灯条就是 16 * 9 + 32 = 176 字节
. A/ k2 c4 w; `- G; x. M+ r. b
翱翔云端的鸟 回答时间:2018-4-10 09:42:55
jjbboox 发表于 2018-4-10 07:303 A3 ?, b$ e1 r# ~, j: R: Y& ?1 L) _
是的,其实两头各还要加一个RESET信号,大概在32个字节左右吧。0 m3 ^" m4 R% |5 f) T
比如8颗粒的灯条,那么分配的内存就应该是 ...
2 k/ D$ ~" _/ J
我现在遇到一个问题    3bit表示一个code     001  表示0code         110表示1code     
' K9 [# `9 G: W) T0 Q6 q当我要发送9byte的一个24bit颜色值的时候  比如是传输红色
5 Z0 @' k% l: M4 Q) F' A按照G R B  传输 为   0x00  0xFF  0x00   3 G& i2 u: W9 F5 G2 Z( h& J

# z/ F  T3 g  h转换为二进制6 E- ^* w. ~( c6 W2 Q
001 001 001 001 001 001 001 001 001 001 001
; r' }& s4 a2 P, b  K7 z110 110 110 110 110 110 110 110 110 110 110/ s: ~$ s& L1 U
001 001 001 001 001 001 001 001 001 001 001
$ R/ y# [& S* i" z) \7 c2 J
/ u! N- Y, y$ kSPI数据为:* M  Q1 X) y" M; j2 m
        0x24                0x92                0x49
) I/ O) o: Z, i/ B5 Z0010 0100   1001 0010    0100 1001  
/ l6 g: v+ R6 K: b        0xDB                0x6D                0xB6
9 S, X; ?+ g- }/ m8 h  f1 ~1101 1011   0110 1101    1011 0110. U* o& R& m% h  c- @0 X
        0x24                0x92                0x49
. n4 o- o' l2 Z- H/ g1 ~- o4 @) L0010 0100   1001 0010    0100 1001 ( J1 x4 a( `- Y8 v6 J2 `

; Y! F; T2 k# ?- r/ L, ]* r( _8 }4 T) v
这里的问题是当我SPI发送完0x24之后  发送0x92的时候  0x24的最后一位是0  0x92最后一位是1   导致0x24的最后一个0码和0x92的1码混合了  
翱翔云端的鸟 回答时间:2018-4-10 09:43:50
jjbboox 发表于 2018-4-10 07:30- g7 Z, _% }- @, \2 d/ e
是的,其实两头各还要加一个RESET信号,大概在32个字节左右吧。% D+ D4 g) k& }) U& P- q' y6 A% ?  I
比如8颗粒的灯条,那么分配的内存就应该是 ...
$ F6 ?# g8 D" h5 d# ]! ~) Q
另外  楼主这里的4M  是不是改为 3.2M更合适啊   

所属标签

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