本帖最后由 丿灬幸灬 于 2018-11-2 21:55 编辑 ' S2 R2 ]4 Y4 N6 |
( Z, O! r7 B& A1 K" Q概述3 r) N: A# Q# _) v0 c9 m
这个一个项目日志是我的STM32冒险。
s0 }, w% n1 o- d我的玩具盒包括亚马逊Dash按钮,WiFimCu和其他一些零星杂物。
! {4 M9 }: b* Q# s8 P* u- y
/ c/ ^ N! a) F$ h基于UART的I2S PCM/ D) | R" f7 Y9 n0 s8 @9 D1 z
; K/ Y# O7 n' a8 v1 W! Q" W
我把被敲打的I2S数据转储到DASH的串行控制台,并将其记录到一个文件中。经过几个小时的等待,我能够启动一个小的No.js程序,把ASCII转换成二进制BLB。把它导入Advand并得到这个甜美的波形。太糟糕了,听起来像是静止的。& b4 N! h( E# \ A( E
2 k T! V& z) `
# ^+ d5 Z3 _7 ^, e' @* Z代码如下5 [# l" i* K' ]3 b0 L2 s/ g
- var fs = require('fs');" ?( U2 K4 e4 o9 D
- var convertHex = require('convert-hex');
7 P: W( v- y+ G6 y% ]- x! I3 @ - var tokenizer = require('tokenizer');
& {2 W( _! G& [# V) Z; W+ v- s$ j
5 l9 v* L( F' d" z/ S' d6 u- var t = new tokenizer();$ D [& q0 ~/ o) \3 X
- t.addRule(/^0x[0-9A-Fa-f]+$/, 'half');
9 b5 f! F" ~# j9 k7 x - t.addRule(/^\w+$/, 'junk');" S: { j8 e% Z& _
- t.addRule(/^\s+$/, 'whitespace');& R; e# x$ w1 F9 b
- t.addRule(/^.$/, 'whitespace');/ ]8 P" M- p$ j; r
; B0 R9 S# S# y+ |4 Z- var pcm = fs.createWriteStream('pcm.raw');6 j5 \2 w' c k' J6 o7 z
1 H" t" n0 }7 H7 P5 I2 |- var bytes = [];
6 A. K7 V6 o4 t1 P* p8 t - t.on('token', function(token, type) {8 H8 E/ w. w$ f! Y
- if (type == 'half') {
: ]: D# w. o+ Z8 E/ Z, X$ G* d - if (token.content.length == 6) {
5 X4 D2 ^8 ^' [$ q* }/ a y* V - var b = convertHex.hexToBytes(token.content);
6 \2 p5 }# f2 I3 D4 | - bytes.push(b[0], b[1]);/ n: o2 z) G4 S4 W3 _0 b
- }
( Z3 n; R2 ~5 A9 M& | - }
' d/ b, v0 s# O$ L+ r9 I - });- Z0 S! V( l4 _7 V d6 o7 K
- r T. {# c; y- t.write(fs.readFileSync('../audio.log', { encoding: 'utf8' }));$ B0 d. e3 @8 S. A1 _
- 5 X/ J, F& L9 s
- t.on('data', function() { });7 G3 W7 i; a, ]: c m
. W6 R1 J2 n/ X2 W' b0 ]; h- t.on('error', function(error) {
4 J1 K" {$ L& n - console.log(error);
9 p5 ~1 B0 J$ e# U# n' f( o) h6 ? - pcm.write(new Buffer(bytes));
% G' o( Q4 Q0 t* Y - pcm.end();
3 n8 }- q8 V7 ]+ s$ [/ S* F - });5 e; z- h# }) M, [4 R( A* B C! }
2 H9 C5 P$ l' L$ _( ~" N/ }- t.on('end', function() {+ s* Q9 t8 O/ u
- console.log("DONE");
) i0 y/ S* {1 W) k - pcm.write(new Buffer(bytes));! `9 _- L% r% o9 x
- pcm.end();1 m% D$ l1 B, U1 {( P1 v# c
- });9 }0 Q+ j4 `; W- j% `
, Q3 Z. @# B+ R' t- t.end();
复制代码 ; `6 U! c/ r: B6 `' k) m$ @
Amazon Dash的软件I2S
& E' ~; }$ Y/ n5 l7 F' H
Z$ p' u8 p6 b$ K过去的几个晚上我一直在拼凑需要的麦克风。我对时钟、锁相环、DMA,甚至I2S都不太了解,所以对于哪种代码去哪儿有很多头脑不清楚和手舞足蹈。
$ K7 H, X& g- m7 V/ r( {7 R- E* ] H V. L( ?4 p- \! O
WSDICSDK中的STM32 F2代码库缺少一个PielFixI2S.C驱动程序。我举起了STM32 F4的PielFixI2S.C,删除了让我迷惑的东西。在调用我的新._i2s.c之前,我编写了一个短小的ADMP441驱动程序来设置正确的GPIO,它将在这里设置I2S块和DMA通道。
1 g% A! e8 U9 b3 _/ o7 B# I
# O$ ?: q; p) g, Z# Z我一直在努力让DMA在一块麦克风数据完成后生成一个中断,因此我关闭了该代码,而专注于通过等待SPI RX中断并有效地轮询总线来获取数据。我只得到零或挂起的过程,所以我怀疑要么时钟/PLL设置是错误的,要么麦克风只是没有启用。
9 o. r; D8 u( D( O4 F2 ^4 J% e( O# f7 S# v
我没有逻辑分析器(实际上我今天在eBay上订了一个便宜货),所以我不能验证Dash的CLK和WS引脚是波形还是恒定电压。我想,一旦逻辑分析仪收到邮件,我就可以使用热气枪来移除麦克风,并在两者之间插入探针,以帮助调试DMA问题。
6 M# m: M: N( o0 |' b. f
9 [0 Y3 `3 {# G' x. b不管怎样,今天我设法从I2S SPI端口获得实际数据。
* Q) o0 C! C. {# {) I
0 t( \8 ^' Y& c$ {0 G! n$ Y1 m
我不知道这是不是真正的PCM数据,但它肯定比一堆什么都不是的好。. R( x- U" C" U6 j9 d% k
j' n( q- a: N5 \7 I0 G
* K" X1 N* N2 Q9 P) M
. @" [: k2 V8 W* D5 ?8 J8 b; [Dash按钮的I2s麦克风+ i5 k+ r. @# g8 i0 R1 Z
+ F$ T7 S* k0 ?' ]9 t5 I我一直致力于迫使亚马逊短跑的I2S麦克风用WSDE SDK生成一些IRQ,但到目前为止还没有运气。
9 i/ w) v* }3 F0 x* C s' g
9 k) N/ s8 V9 E! D" W我已经把芯片EN(PC1)高了,可以看到它在我的DMM上保持很高。我已经通过stm32f2xx_spi.c库调用打开了I2S PLL,在SCK(PB10)上测量了1.5V——没有范围,我希望这是一个波形,而不是恒定电压。( E6 D+ k+ I. [
0 J R+ Y' }+ b/ j* @3 ?3 K这是我的Github RePo上的一个分段补丁。大部分代码都是从WSDICSDK中的STM32 F4XX文件夹复制粘贴的。
# U1 J, h2 z) \+ ^/ r. h: u, ?. f" n( \4 P3 R3 u; a- ^
Github 库, x9 M" I' k& X/ {& @7 v9 d2 d ^: g
: ~( G7 M* p2 J
我在这里安装了一个GITHUB存储库:http://github.com/gtalusan/redash这有一个指令,建立一个固件,并部署它与一个Stlink链接V2的亚马逊Dash。
4 `6 Q1 @7 m# m E, I8 I
}8 {, u8 _( b9 R/ L# a" H随性的SPI
9 L6 _2 k: Y9 A: L5 q: E我试图找出为什么我只能成功地写和擦除我的短跑闪光灯一扇区一次。左边是M25P16的数据表,中间是Broadcom的WICED SDK用来擦除扇区和整个芯片的SPI命令,右边是SST25VF016B的数据表。
: T2 J. v, k( m/ {
7 }6 L" s! r) }4 b/ z+ Y; ]什么都没有排队!5 @& A8 j! P8 Z
$ n0 P2 n3 _& N* x: n: }( t* p
. S$ r' f; \! b! S; u7 R9 m0 F! q$ a3 S" d8 H% j G/ @. a* n
亚马逊Dash的spi flash
. V, P. J N9 J) h( [5 b) Z. D8 x O1 q
我设法利用SPI flash来连接多个dash的 micro M25P16芯片。
! |7 Z4 t5 A$ ~/ z0x202015是M25P16在被要求总线识别时返回的魔幻JEDEC号码。) k# o3 _2 ]) y" Z6 {
0 @2 `. c8 ~) g% |# s. E+ Z) q9 e
5 d U6 }& c% {) a8 i9 t) v. A# j5 A, D7 c* I2 h
0 F1 d5 E/ b( J( ]( a+ D1 ?
原文请见hackaday
( K4 C% U5 M/ r% ?
% J: {" w" A+ Y& q c |
老哥有经验,我就说语气咋怪怪的