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

I am Master!自制新一代调试利器! 精华  

[复制链接]
qianfan 发布时间:2015-5-20 16:19
本帖最后由 QianFan 于 2015-10-24 17:08 编辑 6 c0 \- `# ?4 K. S' j6 W7 n

8 E' g& ]# Z5 }7 j2 w    I am master!使用Nucleo334打造新一代的调试利器。
( G; [' |7 X. S. \2 O
1 S4 ^+ o6 W  z+ y8 ^4 G* d( G    通常,我们调试一个芯片的时候,往往是编写程序---下载---更改---下载。。。这种方法固然好,但是像我这样的懒人不大喜欢,我喜欢找一种一劳永逸的方法来解决。于是,开始动手写了这个I am Master!顾名思义,就是将Nucleo作为一个主机,与我们需要使用的软件进行通信。可能这样说你不是很理解,没关系,下面还会一 一介绍的。1 K7 \2 n5 w" C( x
   电脑作为控制端,通过串口与我们的Nucleo进行通信,而Nucleo根据电脑发送的字符,解析,并且产生一定的时序,与我们需要使用的芯片进行通信。
: ^# ^5 R9 c4 z+ I7 e- q
& `6 B& F9 e1 X8 J. q8 E# @ whatsname.png 6 p' K  m- Z5 |, I4 a% F
5 ?: W& w7 j& M$ z, X4 v9 }
    比如,电脑端通过串口向Nucleo发送 input 0 1 2,代表Nucleo需要将 0 1 2这三个引脚设置成为输入状态. 在我的程序中,将Nucleo左边的A0~A5作为IO部分,分别对应编号0-5。可以用于执行比较简单的任务。
+ e1 j: S2 F% }8 y7 A4 ^4 w4 }: ]5 |7 Z  o1 p5 n2 {4 x
注意:为了保证电脑端有一个良好的人机界面,大家务必使用能够满足linux终端要求的串口软件。比如puTTy,smartty。或者是超级终端。像一般的串口软件无法完成这个项目的要求。因为他们不能够改变字体的颜色。这里推荐大家使用smarTTY,如果使用puTTY的话需要更改我上传的程序。因为当我们按下Enter的时候,puTTY发送的是'\r',而smarTTY发送的是'\n'。在附件中有最新的smarTTY的安装版软件。
0 Y6 Q6 X" F* A  Q, i9 p* R, N" |
: x0 c( X4 C9 {    如果在使用smarTTY的时候,发现换行符不能正确显示,请进行这样的设置:4 X9 n& E) j  I% m
smartty.png
0 u" m9 n5 S2 L# I' D. E  o, L! g- d8 E9 A) V" c

/ K  [7 Z" [5 Y3 A0 X! Q
; Z  w9 E  o* B9 i2 T+ J# X0 I4 |/ B, \5 @( L. O0 J9 K; g: S
版本更新介绍:; A. K" f) U8 s3 {* r
, Z' n9 S% M3 r* Y2 C) |( E
V1.0.0支持函数:
. f0 _/ L* ?! s% u! ^; k% \" d0 v
; O: H0 ~; f% |# `
  • input
  • output
  • set % {$ Z5 O+ F6 a, a5 I" W9 W$ z& n3 l9 C
  • reset
  • toggle
  • read
  • spi
  • spi-config
  • man# S. |. R0 `) ]7 w- B

. J& ?9 l) w+ C; R, d1 q! ~V1.0.1新增函数:
4 _9 h3 {+ O) k
  • servo
  • i2c-online
  • i2c-write
  • i2c-read2 `; E- j/ N$ ]/ u( |+ H
    ( x6 Q% m8 g. ]9 O  ?5 r% J
V1.0.2更新说明:
' B* a2 P# U) [3 D' |+ {4 D
  • 将i2c-online更改为i2c-scan
  • i2c-read命令新增参数-a 可以用于在读取中指定一个寄存器地址。例如:从设备地址为0x90,寄存器地址为0x00的设备处读取1个字节可以使用 i2c-read -d 0x90 -a 0x00 -r 1 。需要注意的是:如果寄存器地址多于1个字节,只能先使用先写地址,在读的方式。例如:从设备地址为0x90,寄存器地址为0x0100的设备处读取1个字节只能分成两部:(1) i2c-write -d 0x90 0x01 0x00  (2) i2c-read -d 0x90 -r 19 ?: Q& ~' p2 H2 d
  • 新增函数clear,用于清屏。3 y$ |( N9 B) _) F% E. m
    - \3 G0 F6 [, S* {) b) ^
V1.0.3更新说明:. v4 a% t: S0 l
  • 为了在STM32系列中的可移植性,进行了一些并无实际卵用的更新。新建了config.h头文件。STM32F3系列的其余Nucleo包马上就会放出。
    % ]' l  K5 X# J; s/ J$ m% U: h
  • 修复了在不输入任何字符,仅按下回车的情况下,提示Unknow command的bug。) o( ?2 u9 F2 T! f9 a8 q
   bug.png # X4 j- ?4 ^9 l) Z
V1.0.4更新说明:
, D: r! r, H) ]* j& H( ?
  • 上电之后SPI的模式被修改为模式0,时钟为4Mhz。
  • SPI读取(由-r参数指定的)数据被缓冲,使相临两次读取的时间由原先的100us缩减为7us。                                                                                                                spi-read.png
  • 串口数据改为中断输入方式,使用RingBuffer(1KB)进行缓存。% W4 y2 J  P% o1 k
  • 支持发送命令文件。即将所有要发送的命令写入文件,每一条命令占用一行,通过smarTTY直接发送文件。具体的细节请参考本帖第6楼。# s8 |3 a3 I) ^% i2 l0 W# H
    ' {2 F9 A5 b5 ?) S

$ F" d: u( K3 Pv2.0.0(重要更新)。9 g1 k$ j) u) ^2 l: h& x6 b
  • 优化代码结构。如果仅仅为了使用,而不是阅读代码的话,那么这次更新并无卵用。
  • 不再使用占用大量CPU时间的printf,改为termiosXXX函数。
  • 从gcc库中移植getopt。为命令行解释提供了统一的方法。
  • shell函数解析的时候,将使用 "" 引起的字符作为一个参数。不管""内的字符是不是含有空格。例如:输入spi [ "Hello world" 0x24 0xff ] ,经过shell解析传给spi的命令参数为:argv[0]==spi , argv[1] =[ , argv[2] ="Hello world" ,argv[3]= 0x24, argv[4]=0xff, argv[5] = ] 。注意:"Hello world"是一个参数,不同于windows和linux,这里为参数保留了引号。
  • 修改spi-config,如果spi-config未提供任何参数,将显示出现在spi的模式。包括模式,时钟频率,Msb/Lsb First。如果提供参数,将对参数进行解析。
    & @$ K; A2 {2 O

    4 j$ b# t7 s( `2 Y9 N( ^4 o

7 K; H( Q- {& U3 ?6 J/ V; ^! }$ Q( `

  J6 p1 q; x% e7 [3 P
, P3 t/ v# @  j- r# x9 I& E4 ]8 Y
) f" x* Y; n& q8 m# z5 X- `' b& R- D

3 K3 \' z9 z  D: P- O
: ^0 O4 E9 ?* U& ]) C0 g5 \8 ~# _) L  h1 \* k6 o! o8 k3 E
吐槽,意见,或者建议请联系(PS有没有E语好的大神,帮忙翻译一下man的说明部分):  U) m4 j7 d+ O2 D, `, l: V6 z
qianfanguijin@163.com
; h6 ]/ t2 B! ?6 aqianfanguijin@gmail.com
9 \/ {/ O+ L2 o! S

& c8 ~# I) t- Y6 g+ l# ]! v版权声明:
& E) K  N/ c9 W2 }. `本软件仅供与学习交流之用,未经允许,不得用于商业用途。% ~7 j7 G% [8 p# b
5 E2 R2 M) I- c9 W- [

/ F' p, ?; Z+ t( O% o7 F如果你有其他的板子而不是334,请查看这个帖子地址:
6 ]3 W- ]1 Z5 K4 i7 Ehttps://www.stmcu.org.cn/module/forum/thread-601818-1-1.html
5 l' a* _' t; }; y

I am master.rar

下载

1.6 MB, 下载次数: 58

v1.0.0

SmarTTY-2.0.rar

下载

4.14 MB, 下载次数: 129

I am master.rar

下载

2.22 MB, 下载次数: 29

v1.0.1

I am master.rar

下载

2.22 MB, 下载次数: 24

V1.0.2

I am master.rar

下载

2.22 MB, 下载次数: 12

V1.0.3

I am master.rar

下载

2.24 MB, 下载次数: 39

V1.0.4

master.hex.rar

下载

21.51 KB, 下载次数: 10

V1.0.4hex文件

I am master.rar

下载

2.3 MB, 下载次数: 100

V2.0.0

评分

参与人数 1 ST金币 +30 收起 理由
zero99 + 30

查看全部评分

收藏 16 评论98 发布时间:2015-5-20 16:19

举报

98个回答
qianfan 回答时间:2015-5-20 16:22:40
请管理员不要删除这些评论,这些评论的位置留以后更新之用。。。
qianfan 回答时间:2015-5-20 16:20:21
本帖最后由 QianFan 于 2015-5-25 20:58 编辑
2 R* f+ Q: {  {2 o* D  o( Y2 F4 v) `+ [. l
在v1.0.1版本中,新增了四个命令,servo,用于控制舵机的。函数的参数在500~2500之间,代表在舵机的50000us中,高电平占用的时间。比如servo 1000代表高电平是1000us,占空比是1000/50000=2%。但是写完之后发现控制舵机并没有什么卵用。因此这里就不再多废话了,主要是讲如何使用I2C接口。
! L, f! z( i# ^8 u) g' k. G: L7 Z  l" a# x# a. w% _6 W
I2C( ^/ @8 J: E, T
    STM32F1和STM32F4使用的I2C接口是一类,用起来各种复杂,不好用。但是STM32F3的I2C却非常好用。之前看见有人说STM32的I2C是鸡肋,只能说明他没有用过STM32F3的。下面就说说I2C如何使用。主要操作的芯片是LM75,一个温度传感器。+ c% \" h9 D# M( ^
首先介绍三个命令:
& \' Y# k* M- p! n* Z" R3 j
  • i2c-online:用于获取挂接在I2C接口上所有芯片的设备地址。
  • i2c-write:将数据通过I2C接口发送出去。必须指定的参数:-d(设备地址)。
  • i2c-read:通过I2C接口读取制定数量字节。必须指定的参数:-d(设备地址),-r(读取的字节数)。
  • 注:在V1.0.2版本中,将命令i2c-online改名为i2c-scan
  • 注:在V1.0.2版本中,i2c-read新增参数-a,用于指定需要读取的寄存器地址。
    4 {6 I+ c. e0 G/ Y) l2 F9 \) r
    . _% B9 _9 B# U( F" @& t

, a! t8 v, ^2 J8 f- ?% Y5 c: |为了编写程序的简便,I2C的操作使用流的方式,即只能采用内置的通信方式(START,STOP)。不能指定RESTART。一般的I2C的读取操作是 START+devAddr[Write]+regAddr+ReStart+devAddr[Read]+{some bytes}+STOP。由于不能采用ReStart,所以像这样的读取应该分成先写在读两部分,即:
9 X. O5 ?6 G$ C: Q
  • START+devAddr[Write]+regAddr+STOP
  • START+devAddr[Read]+{read some bytes}+STOP$ h4 @+ M( Y* B0 D2 @
  • devAddr代表设备地址
  • regAddr代表需要读取或者写入的寄存器地址。
    , V% f8 }# f( V2 x$ c
6 n2 a0 X0 I# N1 m- v4 J
我的I2C总线上挂接了一个LM75,但是我懒得查数据手册去找他的设备地址,所以可以使用i2c-online查看所有在线的i2c设备的设备地址:
! I. [$ f- u5 E/ } i2c.png
1 R1 Z" [# c6 x1 w, C4 |注:在V1.0.2种将i2c-online更改为i2c-scan,并根据设备地址添加了提示。如下图。- i. r9 O8 E4 K9 w( t0 q: ?/ q! n! g
iic.png
+ z6 T, g9 G% b+ q7 ^, A  F9 G: d& h- T/ g1 r$ @, `. ?
通过这条命令查出了唯一的地址,0x90 。那么这个地址就是LM75的设备地址了。之后我们要进行的读和写的操作都要靠这个地址。其实这条命令的实现很简单,只不过从0-127挨个询问,看设备是否应达就行,通过逻辑分析仪抓包如下:(只截取了部分)
7 d0 s1 E5 q7 D( t3 g! @ i2c.png 1 W! S+ C7 {9 q! w. u
. s' f! G- q  f$ Y. q

+ d8 K. X# W5 m% ]好了,有了地址就可以进行操作了,先来看看LM75的寄存器:5 J+ t# w: Y9 v% [& ~+ a7 M  Z
i2c.png
' i' G  E7 f) o7 Y2 S7 l从上图中可以看出,0x00是温度寄存器的地址。要想读这个地址处的数值,必须首先发送寄存器地址:5 L1 w# o7 f0 F- V! a# `# l. q/ j
i2c.png 4 y3 Y! m6 t# \  f

9 D$ k+ ^  r4 d( `: D% T i2c.png , \! G" B' B) w# N# y! o, Q( G. \! {* w
i2c-write必须要有-d参数,用于指示设备地址。其余的数据是要发送的数值。如果想通过i2c发送0x00 0x01 0x02 0x03 这四个数字可以使用这样的命令:1 `& n: ^! f4 O3 ^2 b7 \
  • i2c-write -d 0x90 0x00 0x01 0x02 0x03 2 O$ J! \* o: B
  • i2c-write 0x00 0x01 0x02 0x03 -d 0x90
  • i2c-write 0x00 0x01 -d 0x90 0x02 0x03
  • ...
    " H( x2 K# \8 i# |
    - s& i. K* u# O9 G' z1 l# U8 U" o
设备地址0x90必须紧跟在-d的后面。除了i2c-write的位置之外,出现在什么地方都是可以的。
7 H9 l& U. N2 k( I% ]
' O- D( m& N, P& ?# t& z/ p/ y# d* ~$ @
在发送完寄存器地址之后,就可以读取寄存器中的数值了。查看数据手册,可以看到LM75的温度寄存器由两个字节组成。在发送的时候先发送高字节,在发送低字节。
1 v1 \* J/ }1 G* G. |% _% E i2c.png . c4 x+ E  w2 }
之后将两个字节合并成一个16位的有符号数字,数字使用2的补码表示。正温度有正的有符号数表示(最高为是0),负温度的最高位是1 。之后将数据去掉符号右移5位,加上符号,乘以0.125就是所需的温度值。这里有几个事例值,感兴趣的话可以算一下:: M" u( ]7 U! e# ?% \
i2c.png
1 ^7 {2 I  w! p7 e7 V. I+ _先使用i2c-read来读取一下这两个字节:高字节在前:
0 M8 V  n2 t5 `/ v' B i2c.png * M2 U% A1 w- p* s! |7 ?! Y! f
' q- M0 s1 ?4 D6 N+ q
i2c.png
1 k2 M  y( w+ i- C# ]" {( }* T
  J. y7 d) z# H* s) z7 d. L7 a) a0 h0 J最后来计算一下结果:0x16C0 >> 5 =0xB6 =186
! z9 t$ `& w9 a; K% a所以温度值为186*0.125=23.25
- @8 D0 f1 i0 ^' {5 Z, Z/ N8 w  R+ }5 ]2 Y) M
可以看出,烟台的晚上还是非常凉爽的!
' C, Z* ]' ~) e, m7 Q" F8 R0 d
; @& ?4 R; Q0 n1 x- ]注:在V1.0.2版本中,i2c-read函数新增参数-a,用于指定寄存器地址(寄存器地址只能为1个字节。如果寄存器地址多于1个字节,只能使用先写在读的方式进行操作)。
9 B( Z/ h* u: u$ A iic.png 8 P. ^: N# R, Y5 `; H0 ~& }5 S
' ~1 x% @- P6 j+ {
/ U* ~6 l* w3 o+ v2 @0 N# v0 h- J: z
另外,需要补充一点的是,i2c-write和i2c-read在正确写入和读取的时候不会输出任何信息的。只有在发生错误的时候才会进行提示:
0 D$ }, R: H1 Y' B( A8 T i2c.png
0 I" D5 [$ O2 V3 k; c0 j; h

( s8 ?$ u- }9 p2 ?9 m8 P6 J) z8 s i2c.png
) f; c+ c/ g% Y: v- [& G
: a) k6 ~4 S7 J! t% [( [  h' F7 Q8 u$ f( R

7 x$ O4 W4 y% a/ d$ t6 L8 B/ P6 o& j  i/ z+ l

1 e% d- O" J1 Z  [" `) V
/ q: H" |1 ]! D" p8 U
; m% K0 A; |! ^; S+ M

LM75A.pdf

下载

137.07 KB, 下载次数: 7

LM75数据手册

qianfan 回答时间:2015-5-20 16:20:01
本帖最后由 QianFan 于 2015-5-21 12:00 编辑 + T( w3 `! ~  M5 X9 w: f

! P3 v3 `6 F0 v
一起来开发,定制你自己的命令
- _0 H0 `% h; }( ~+ n8 \3 B; t

; N' L' \: T9 n  可能你觉得这些命令远远不够用,或者你希望定制一个你自己的命令,比如man 你的名字。其实,定制一个这样的命令是一个很简单的事情。% [' m7 N( j- W
  在串口中接受到的字符,最终是要交给shell [void shell ( char * cmd_str) ; ]这个程序来处理的,这个程序将串口接收到的一行字符,在空格处分割,并且转换成为int argc,char *argv[]的形式。这个形式是man函数的标准形式。argv[0]表示的需要调用的应用程序的名字。例如串口输入input 0 1 2,经过shell的处理之后:
  O0 P" m& \4 s2 Q, L9 \
  • argc=4;
  • argv[0]="input"
  • argv[1]="0"
  • argv[2]="1"
  • argv[3]="2"
  • argv[4]=NULL- P9 P, k# R- n  {% A( B/ x

    " G/ j0 l3 d# E
处理之后,shell去一个cmdList列表中寻找名字叫做input的函数。如果找到了,将控制权和argc,argv一起交给input函数。而input就是我们需要编写的,只需要遍历argv,读取每一个引脚的编号,并且设置成为输出即可。具体shell函数在cmdList中寻找input函数的方法在后文中会详细讲到。# C$ w# v/ ?' o. P0 p! {; i5 s& S
下面是一个简单的input函数的实现:
3 n, m1 X4 `- l, Z. O% u( q/ Cint input(int argc,char *argv[])
+ v+ M0 O/ ?, o/ |: }% S2 J: f$ Y{
: K" d+ a* v' Q4 n. e  int i=0;4 C& X0 h5 P) S% F
  for(i=0;i<argc;i++)! u9 ?3 S7 n: i$ K: l1 S
  {
9 L3 v+ j+ A* P. f1 A; X! z' p- l    //设置argv表示的引脚为输入方式
6 u: O, b2 B) o5 U0 o  }
5 f% l# D- v  K$ f4 P# C6 K9 A+ j}
2 R5 f. L. I7 }( q) k1 c
, p+ ?5 G! ?# w
好了,下面就来说说定制命令的详细步骤:
  {9 B$ ^  H0 ]- |
  • 每一个命令都需要一个入口函数,格式是int test (int argc,char *argv[])。
  • 每一个命令都需要一个解释函数,用于man的调用。格式是void manTest(void);当然,函数的名字可以自己取。
  • 计算函数名字的hash,用于shell快速寻找函数的入口点。不过这个hash只是特别简单的计算方法,在后续的更新中,会考虑更换他的计算方法。目前的方法主要是将函数的名字的各个字符异或(^ )。在工程文件下tools/computer_xor下有一个xor.exe,是用于计算hash的。只要在控制台下调用这个程序,参数写你需要求的字符串。例如: xor.png
  • 上面算出的test的hash值是0x16,记下这个数字,我们在后续中会使用到。
  • 打开commands.h,在里面添加两个函数的声明:test和manTest: xor.png
  • 打开commands.c文件,在cmdList中添加manTest和test:      xor.png
  • 新建一个源文件,test.c,并添加到工程中。写上test和manTest两个函数的实现: xor.png
  • 好了,目前一切需要做的已经做好了,编译,下载,打开smarTTY,稍微测试一下: xor.png
    / p; j( W9 S' ~0 d$ C9 }  O
    1 R, H( e( f% `& y

( y8 Z: a2 u. j( H更多更有趣的功能欢迎你来实现!
. a4 t$ Z5 p  s& L; y& Y: a8 @# A
& q/ n' m% t0 m; m
4 c7 W" \9 t5 p
, {* {5 k1 f* H/ C' C8 }9 o
qianfan 回答时间:2015-5-20 16:19:26
本帖最后由 QianFan 于 2015-5-21 11:24 编辑 5 Z& Q% X/ o: o' k

! a8 g; K- f: M  @使用入门:
+ c; d0 }1 O  L- O. k* `! r7 }. j
  • 从附件中下载工程文件I am master 和 smarTTY软件并解压。
  • 打开工程,将hex文件下载至Nucleo334.将使用HSI作为时钟源。
  • 打开smarTTY,新建一个串口通信,115200,8bit,无校验,停止位1.
    : [. Z# w5 s# {) r

+ a' W3 J* K, [5 MNucleo通电之后,通过串口发送这样的信息:- `, N2 V0 n2 @& k/ f1 `
start.png ( Y% x/ ^: z# T3 V7 e  U' X  E2 I
先来认识一个命令 man ,类似于linux中的man 。当你遇到某一个命令而不知道如何使用的时候,可以使用这个命令。比如获取input这个命令的解释:0 R# w% e1 E9 _) \1 A2 K
start.png
: }2 P5 q1 j: s2 b这个命令的功能是将引脚设置成为输入模式,引脚的范围是0-5,对用Arduino接口的A0-A5.现在,我们在0号引脚上面挂接一个LED,在1号引脚上面挂在一个开关(平时为1,按下为0)。可以通过input,output两条命令来切换他们的模式:
; k, P$ n! h, w4 V$ u) M start.png : l- v% U6 V2 j) l$ F0 M' v

4 Y* \4 r- V7 |' r5 q6 c
3 f) H' Q; A2 f+ [& U6 b
在将引脚设置成为输出模式之后,就可以使用set,reset,toggle三条命令来设置引脚了。set是置1,reset是清零,toggle是反转。如果引脚的模式是输入模式,可以使用read来读取。如果read的参数不是0-5范围之内,那么显示的数值就会用N来代替。例如read 0 1 255
! i; d- q& e; A. C==> 1 1 N; d  B* Z; N/ s8 y- |1 p
显示0,1引脚的电平值为1,255是一个非法引脚。
* L/ i* p! x* h: x+ H5 `
! n0 I$ j' W5 d; ^, F2 ]4 F
$ I7 B3 T$ f; T4 q. k2 D8 ]) W其余命令的解释大家可以使用man来查看。我的英语很不好,man的解释大部分都是通过谷歌翻译的。大家可以帮助修改一下源文件的翻译,还请告知。谢谢!+ Q0 H; T, `& c; J
) f; W: R. J" U& y5 q
  z/ n6 E. b: X
qianfan 回答时间:2015-5-20 16:19:43
本帖最后由 QianFan 于 2015-5-20 17:20 编辑
! _' E! f+ Y6 `1 d, y/ k& h7 B- J' t9 B7 W7 l/ F3 N5 ~. Z2 n
在我们平时的调试中,光使用IO接口恐怕难以满足我们的要求。还需要一些更复杂的通信协议,比如说SPI。下面我们就来说说SPI的使用。
$ N7 L5 S; f( l5 D' g  K+ @1 g' T! O# Z8 l
不管什么时候,man总是我们靠谱的好朋友。
7 p7 o+ d! _' w3 a7 S) S7 [ start.png + q& [8 c3 [' k) Y+ b$ O: |
在SPI通信上,使用板子上面表示的SPI引脚。这里就不详细解释了。可以看一下板子上面的丝印。" b2 H6 l# W5 C. G+ X; R1 P4 R

! @& [! w- u5 S$ l9 F2 Dspi的参数有着固定的要求:
6 I- A9 S  L) P$ g1 k
  • [ 表示将CS信号线拉低。注意[也是一个参数,后面需要至少一个空格;
  • r:9表示从SPI总线上读取多少个字符。后面的9代表读取9个字符,需要使用十进制表示。
  • 其余的参数使用十六进制表示,不区分大小写。前缀可以加0x,也可以不加。想FF,ff,0xFF表示的都是同一个数。
  • ] 表示将CS信号拉高。同样 ] 也是一个参数,需要后面至少一个空格。
    ; G* \# m8 m- T+ b" r" Z# O5 C, a
5 x8 x" w  b! f: S9 X. u
好了,就这么多,下面就来通过spi这条命令,读写SPI存储芯片W25X16.他的数据手册在附件中,大家可以下载学习一下。
' \3 T& g& P% y; \8 y先看W25的一个指令表:
1 O. {9 X5 \1 O& P9 ?- i) H start.png ; j# i' |' w, S) S4 y. p

" k# f6 \! ?( y6 f, Q  E) O在原PDF的第17页。可以看到上面有一条指令是读ID,解释如下:
1 X( W/ F/ J/ J6 n# h0 o1 |* D start.png 2 t9 ~0 @4 }- R/ }9 u# P% {
) s* c0 x  h3 |: s% W; O5 c7 L  O
在面包板上面插好线之后,使用spi命令与之进行通信:
- H1 h) A0 u' F% d% Z5 ?* p start.png
. X9 R9 q5 F5 A, P回应了两个数字,0xEF,0x14,正好与上表的数据吻合。说明通信正确。, T$ Z0 @0 z. D- V3 p1 t

: ~. w) `+ R. H9 c4 x2 R- o0 B通过查看数据手册可以看出,要想往一个地址内写数据,首先要写一个WriteEnable命令,在写完WriteEnable命令之后,StatusRegister寄存器中相应的WEL为会被置1,说明允许写。
- v2 I5 A- i& d" L start.png * T$ M+ Y, l6 w: ]; i5 j
start.png 4 ~1 U( S+ Y: I0 T5 Z$ ]2 o3 D
在写完WriteEnable命令之后,可以看到WEL位已经被置1了,说明操作正确。
9 V- A9 D' P- d7 K9 E4 i
) K5 m8 O8 j: r: y3 W' y, F下面将第一扇区格式化,之后往里写如一些数据:3 z2 N- d* M5 X4 `( a: |4 @
start.png
$ Y5 h2 Z5 P6 ?) o! ?; @7 _0x20是格式化命令,格式化命令之后WEL位被清零,说明不能在继续写数据。为了能够继续写数据,只好在重新发送一遍WriteEnable命令了。3 g% h( z1 t7 H& ?" e6 u" [

6 Y- W& k$ c2 s; r读取一下格式化之后0x00处连续10个地址的数据:读取的命令是0x03
5 `4 t' x- f& o" \- \+ R start.png
" B3 l+ Q  D, P$ M$ K- t数据全是0xFF,说明格式化成功了。下面再将0x00连续地址处写如0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A十个数字,写入之后再读取:
8 j7 w. S- P' c2 p start.png $ j9 Q6 I1 X2 ?' k6 @- E# E
这里写入了10个数据,读取了11个数据,可以看到第11个数据是0xff,也就是没有被更改,写入和读取都正确。
+ w& V' Q  V2 c) ?# _8 M& o6 `  ~& K9 J7 F$ c7 d; Z! y

  q4 W1 i4 l+ g好了,spi的操作就说到这里。  i2 p6 T% ]& V$ @( L* I' z: d
当然,你可能疑问,这使用了默认的模式3,如果我想使用模式0怎么办呢?大家可以使用man spi-config寻找答案。3 z# x2 B* ^9 u3 C! U, L

8 y+ W9 V1 t# s0 b9 B& ~; o. h5 [* V+ W6 l" e7 M8 s' M
% B/ M4 d# N/ X) K) e2 ~" y

102801-0001R-SPIFlash.pdf

下载

1.26 MB, 下载次数: 23

W25X16

qianfan 回答时间:2015-5-20 16:20:51
本帖最后由 QianFan 于 2015-5-29 13:07 编辑
) o! J  K& z, s2 P6 p+ x% X2 b5 x# ?% i% h" v
V1.0.4命令文件说明
9 \, A8 T: R1 s& M
    在1.0.4版本中,新增了直接发送命令文件这一特色。下面就针对命令文件结合TCP/IP芯片W5100,进行一下说明。
: v  P$ @4 d# d; {0 u    spi-read.png 7 [  K9 h$ e. ~  a
    5100使用SPI方式进行通信,并且仅仅支持模式0. 还需要注意的是,对5100芯片进行读写的时候,SPI的速率不能太低。在之前的操作中,发现使用256KHz的SPI进行通信,不能正常的进行读写。因此在1.0.4版本中,将SPI的时钟频率提升到了4MHz。
0 E4 _& Y& V$ s& @7 [    上图是SPI通信的协议图。分为3部分。第一部分是操作码。读的时候,操作码是0x0F
- p& X5 w8 u; {5 E, {,写的时候操作码是0xF0 。 第二部分是5100寄存器地址,2个字节,分为两次发送。第三部分是需要写的数据。1个字节。
0 K0 d, ]& i6 S0 p# T# t9 L: t
* L% v& m3 x% A* w9 X8 h" b! b1 k$ z! z7 {* d8 q" A+ t
    看一下相关的寄存器:: W2 z% m# i# T$ I
    spi-read.png
5 s/ \' j$ Y* C4 H比如说设置本机IP,就要分四次来写(本机IP由4个字节组成,每次只能对1个字节进行读写),如果设置成为192.168.1.3,那么应该使用这样的命令:  U* t& h4 U5 \( Z
  • spi [ 0xf0 0x00 0x0f  0xc0 ]
  • spi [ 0xf0 0x00 0x10 0xa8 ]
  • spi [ 0xf0 0x00 0x11 0x01 ]
  • spi [ 0xf0 0x00 0x12 0x03 ]
    2 ?6 R0 b4 ]/ V3 D# R. {
    ' J, z2 ~, X6 d! V9 j* A
除了本机IP,还需要设置网关IP,子网掩码,MAC地址,共需要20次操作:
1 W* D0 M- U9 e7 E" y* }
  1. spi [ 0xf0 0x00 0x01 0xc0 ]
    # w8 s; M3 r1 t( `4 E
  2. spi [ 0xf0 0x00 0x02 0xa8 ]* y+ m' C5 \! \; L: H$ |- ?. ]: r
  3. spi [ 0xf0 0x00 0x03 0x01 ]7 P# G; K' }& a- A5 y( z. A- O
  4. spi [ 0xf0 0x00 0x04 0x01 ]% G% }' v2 W  l( r$ K( s1 G4 L& P
  5. 7 c7 h2 h% P  V, j1 N2 ^# A
  6. spi [ 0xf0 0x00 0x05 0xff ]
    . a; F& K% p/ T) B3 s( h9 w
  7. spi [ 0xf0 0x00 0x06 0xff ]) z* D; ]' C: t
  8. spi [ 0xf0 0x00 0x07 0xff ]: _8 d& h) N8 Q( c& l* T& L
  9. spi [ 0xf0 0x00 0x08 0x00 ]
    2 s9 B% V7 u( q  P4 L6 @9 z
  10. . K  G# A2 J) D% y
  11. spi [ 0xf0 0x00 0x09 0xde ]9 Q3 h9 }0 z! W
  12. spi [ 0xf0 0x00 0x0a 0xad ]
    9 C. A, i% `$ I0 a4 n
  13. spi [ 0xf0 0x00 0x0b 0xbe ]) W1 @( D7 S! X( L
  14. spi [ 0xf0 0x00 0x0c 0xef ]4 |! @8 y: X9 [
  15. spi [ 0xf0 0x00 0x0d 0xfe ]
    9 Z9 Z7 U7 k: s8 Q2 s! _) s, [
  16. spi [ 0xf0 0x00 0x0e 0xed ]0 _2 y' Y- j+ H" L* L7 j
  17. ( n- J# p9 f  O" l. C6 Z
  18. spi [ 0xf0 0x00 0x0f 0xc0 ]$ ~1 ~4 M& P4 o) U) D
  19. spi [ 0xf0 0x00 0x10 0xa8 ]/ h+ H! C; y! z8 `' w: U9 q
  20. spi [ 0xf0 0x00 0x11 0x01 ]
    & z1 W+ G/ j9 P: |  [; Y
  21. spi [ 0xf0 0x00 0x12 0x03 ]
    * l- s! [, ^2 l3 N
  22. % e9 V' A  ]& ~! a9 [* Q9 q1 g
  23. spi [ 0x0f 0x00 0x01 r:1 ]
    6 x9 D; _, i! P, L: M7 X
  24. spi [ 0x0f 0x00 0x02 r:1 ]
    # u4 L) F8 p) }& M0 m
  25. spi [ 0x0f 0x00 0x03 r:1 ]
    4 a; G/ E2 k$ w/ ]+ J
  26. spi [ 0x0f 0x00 0x04 r:1 ]
    # s' K/ I4 Z1 a8 F, N3 i
复制代码
" z8 k+ W% L9 q# V: ^
在每次给5100通电的时候,都需要重新发送一下这样的字符,太麻烦了,所以索性将这些命令保存在一个txt文件中,直接通过smarTTY发送文件:- D! Q- \& n, S. }2 |" z) s9 [, \
spi-read.png
* D: l$ {2 L0 V4 O# U" f! h- b/ [点击smarTTY中的send a binary file(在上图中用圆圈圈出),选择w5100.txt :0 K9 U& S# o/ q% C
spi-read.png # U) c1 ]/ }$ N2 A% c; h$ @8 `2 X/ j
最后四个命令是读取网关的ip地址。在设置完这些寄存器之后,就可以使用windows上的ping命令来测试一下了:. V6 ]% F3 v4 w$ y
spi-read.png ! E5 D: G; h; M* c$ A9 k
' F3 D8 O# Q9 C; C: p0 g- v4 U5 Q' L
断开5100的网线再ping一下:
! Q5 H! T( v2 E$ r  Y: S) L  K spi-read.png
4 X4 ?0 o7 v* u  ~9 v- o8 u
8 F' r7 T8 ?( _
7 ?# G- z) }& J2 ]- O, {
- f) z% _2 [0 V1 H

w5100_Datasheet_cn.pdf

下载

1.8 MB, 下载次数: 7

W5100_Datasheet_v1.2.5.pdf

下载

1.61 MB, 下载次数: 5

w5100.txt.rar

下载

214 Bytes, 下载次数: 6

命令文件

qianfan 回答时间:2015-5-20 16:21:18
请管理员不要删除这些评论,这些评论的位置留以后更新之用。。。
qianfan 回答时间:2015-5-20 16:22:01
请管理员不要删除这些评论,这些评论的位置留以后更新之用。。。
qianfan 回答时间:2015-5-20 16:22:21
请管理员不要删除这些评论,这些评论的位置留以后更新之用。。。
qianfan 回答时间:2015-5-20 16:22:55
请管理员不要删除这些评论,这些评论的位置留以后更新之用。。。
qianfan 回答时间:2015-5-20 16:23:14
请管理员不要删除这些评论,这些评论的位置留以后更新之用。。。
qianfan 回答时间:2015-5-20 16:23:31
请管理员不要删除这些评论,这些评论的位置留以后更新之用。。。
creep 回答时间:2015-5-20 16:36:45
你这要更新这么多楼么
沐紫 回答时间:2015-5-20 16:36:55
好的。要是还不够你继续占,回头我把我插楼的删了

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版