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

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

[复制链接]
qianfan 发布时间:2015-5-20 16:19
本帖最后由 QianFan 于 2015-10-24 17:08 编辑
' w7 M5 _0 A. A9 s
) ~& m: r( h. }2 \2 F: @    I am master!使用Nucleo334打造新一代的调试利器。! {3 [+ b* D0 t# O1 ~

( h0 Y2 B5 ^% X( d- s1 W. C    通常,我们调试一个芯片的时候,往往是编写程序---下载---更改---下载。。。这种方法固然好,但是像我这样的懒人不大喜欢,我喜欢找一种一劳永逸的方法来解决。于是,开始动手写了这个I am Master!顾名思义,就是将Nucleo作为一个主机,与我们需要使用的软件进行通信。可能这样说你不是很理解,没关系,下面还会一 一介绍的。
7 ~5 {6 ~) t( f! Q! S$ s% w8 c   电脑作为控制端,通过串口与我们的Nucleo进行通信,而Nucleo根据电脑发送的字符,解析,并且产生一定的时序,与我们需要使用的芯片进行通信。
9 U2 \6 n" i* t1 e. W: ^" h  y0 M2 m, q4 ~8 L
whatsname.png 0 @* B8 f; m9 n' e$ p$ a5 {

; _( a% V5 l) R, @+ ~0 m; \    比如,电脑端通过串口向Nucleo发送 input 0 1 2,代表Nucleo需要将 0 1 2这三个引脚设置成为输入状态. 在我的程序中,将Nucleo左边的A0~A5作为IO部分,分别对应编号0-5。可以用于执行比较简单的任务。
1 S8 h3 b, n/ w9 s# N" c
- v" W  I1 d5 U4 G注意:为了保证电脑端有一个良好的人机界面,大家务必使用能够满足linux终端要求的串口软件。比如puTTy,smartty。或者是超级终端。像一般的串口软件无法完成这个项目的要求。因为他们不能够改变字体的颜色。这里推荐大家使用smarTTY,如果使用puTTY的话需要更改我上传的程序。因为当我们按下Enter的时候,puTTY发送的是'\r',而smarTTY发送的是'\n'。在附件中有最新的smarTTY的安装版软件。
9 Y6 q& [8 I, v5 B9 k" o( h& N
, r3 |/ G, T5 f8 P; Y    如果在使用smarTTY的时候,发现换行符不能正确显示,请进行这样的设置:
4 i/ U0 J3 m  Y- Z% H+ w smartty.png 1 Z' |% s& \( {; Z( W( C, ]

+ i4 L$ c; O4 c- b! ^
0 W1 i- Q6 a  k4 _  A: S+ P, y$ r4 }: A

8 _3 F; \9 h& F  L6 C版本更新介绍:
4 h  X3 D8 _; |7 Z2 q* M. N' r+ j) Z" A- M
V1.0.0支持函数:" s7 Z4 s  Q7 X- G  W' ?. Z  {6 J# ?

2 O6 a% V& @5 g( w/ S& j* X
  • input
  • output
  • set & Q# X: H  H% u- Q6 C0 @
  • reset
  • toggle
  • read
  • spi
  • spi-config
  • man
    . W) o$ p/ v* T8 n: ~
4 q6 m& ^/ {2 r
V1.0.1新增函数:
: ]7 x* X' t; m$ Q# n( C
  • servo
  • i2c-online
  • i2c-write
  • i2c-read5 W0 Y: B* V# Z7 w4 `8 d' X

    * B+ a1 F6 t9 Y
V1.0.2更新说明:' c7 t' c# _4 M8 ^: t1 O
  • 将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 1# H0 |6 H" G7 K& m! {4 W4 o
  • 新增函数clear,用于清屏。2 B- {( T' Z8 U* Y
    9 ?. l- {- k( l6 J  i
V1.0.3更新说明:
5 m1 v* I3 g( M3 ]
  • 为了在STM32系列中的可移植性,进行了一些并无实际卵用的更新。新建了config.h头文件。STM32F3系列的其余Nucleo包马上就会放出。. \, r2 ~/ z3 |% G5 t1 z9 d
  • 修复了在不输入任何字符,仅按下回车的情况下,提示Unknow command的bug。. |  V8 O! j/ f8 x! H( Q- a
   bug.png
; I3 w; W4 i/ w5 Q" ]8 e0 IV1.0.4更新说明:
7 [- {$ o# V3 Y  W6 B( @8 l
  • 上电之后SPI的模式被修改为模式0,时钟为4Mhz。
  • SPI读取(由-r参数指定的)数据被缓冲,使相临两次读取的时间由原先的100us缩减为7us。                                                                                                                spi-read.png
  • 串口数据改为中断输入方式,使用RingBuffer(1KB)进行缓存。
    ( X# i' H0 i# Q# f
  • 支持发送命令文件。即将所有要发送的命令写入文件,每一条命令占用一行,通过smarTTY直接发送文件。具体的细节请参考本帖第6楼。7 \& {) b- E$ `3 w

    8 e" f$ h( b  k3 \6 F3 F& n
8 T0 n- e7 C' |: B
v2.0.0(重要更新)。" I7 P! j& V" G2 @* K3 Y, J
  • 优化代码结构。如果仅仅为了使用,而不是阅读代码的话,那么这次更新并无卵用。
  • 不再使用占用大量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。如果提供参数,将对参数进行解析。
    6 X0 Q8 b" ]1 d3 h, G

    ; Y$ X3 X, a& R; K) ^6 I

. f$ r- Q  ^& y) M/ z( b
: T3 m, }6 W* M* @/ M( }' p# `, h& h3 R) M/ G

1 e$ I+ I2 a& }
/ z; ~0 O8 b2 f/ j4 t

$ y3 Z$ ~0 q; d; C! b- P% P
6 g( M; W8 r& _0 {& n6 Z# \3 ~* {4 }# h; D& J- L  ]4 ^+ ?
吐槽,意见,或者建议请联系(PS有没有E语好的大神,帮忙翻译一下man的说明部分):1 A5 E% v8 L7 ?
qianfanguijin@163.com
1 j- |) K7 X7 S% J9 a) Fqianfanguijin@gmail.com
' ^, i  U2 E7 Q

" t) A  H) \3 [+ j8 O) y9 H$ \版权声明:
0 Z0 F: D! I  |本软件仅供与学习交流之用,未经允许,不得用于商业用途。0 _/ h- S5 F& S
8 e% T0 @8 E3 p( P0 r
: q! a' Y* Q1 y3 U( h
如果你有其他的板子而不是334,请查看这个帖子地址:
5 U2 T  \2 ~. E1 bhttps://www.stmcu.org.cn/module/forum/thread-601818-1-1.html
  `" }# c/ J0 x0 F5 \# Q; t

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 编辑 8 K9 ^7 Q) x' G" g& V
# L: ]7 M+ F* K+ ^: j1 r
在v1.0.1版本中,新增了四个命令,servo,用于控制舵机的。函数的参数在500~2500之间,代表在舵机的50000us中,高电平占用的时间。比如servo 1000代表高电平是1000us,占空比是1000/50000=2%。但是写完之后发现控制舵机并没有什么卵用。因此这里就不再多废话了,主要是讲如何使用I2C接口。' l" z' l( f: A: n5 H% x3 Q
& g4 r; F0 v9 x: |5 k8 K9 j
I2C
4 }6 X# S% n4 t  n
    STM32F1和STM32F4使用的I2C接口是一类,用起来各种复杂,不好用。但是STM32F3的I2C却非常好用。之前看见有人说STM32的I2C是鸡肋,只能说明他没有用过STM32F3的。下面就说说I2C如何使用。主要操作的芯片是LM75,一个温度传感器。
8 D$ \  ^+ b0 K+ m首先介绍三个命令:
& B/ v% H" w  l! F% l7 v7 ]
  • 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,用于指定需要读取的寄存器地址。
    $ M6 ?& i7 d9 I% m2 C6 `
    0 A( y1 C; w; N$ u  C
: C9 {! e! L* J7 D
为了编写程序的简便,I2C的操作使用流的方式,即只能采用内置的通信方式(START,STOP)。不能指定RESTART。一般的I2C的读取操作是 START+devAddr[Write]+regAddr+ReStart+devAddr[Read]+{some bytes}+STOP。由于不能采用ReStart,所以像这样的读取应该分成先写在读两部分,即:
4 Y2 b3 Q- h/ w3 b& z/ d
  • START+devAddr[Write]+regAddr+STOP
  • START+devAddr[Read]+{read some bytes}+STOP
    + [$ q' `  {9 ]$ h/ S0 h
  • devAddr代表设备地址
  • regAddr代表需要读取或者写入的寄存器地址。
    9 R( ^# K  O9 e  p
( n; T6 o: j  t
我的I2C总线上挂接了一个LM75,但是我懒得查数据手册去找他的设备地址,所以可以使用i2c-online查看所有在线的i2c设备的设备地址:$ Y$ }2 g$ a( R& \+ i
i2c.png 6 _1 ?+ r* s; k. a9 g9 h% b
注:在V1.0.2种将i2c-online更改为i2c-scan,并根据设备地址添加了提示。如下图。( |. f( R2 Y6 ~1 [+ E3 a8 q; J
iic.png - [; J" @; t% H
3 \/ [7 p0 E; n( {3 b1 A
通过这条命令查出了唯一的地址,0x90 。那么这个地址就是LM75的设备地址了。之后我们要进行的读和写的操作都要靠这个地址。其实这条命令的实现很简单,只不过从0-127挨个询问,看设备是否应达就行,通过逻辑分析仪抓包如下:(只截取了部分)
! a- R) y- ]) w. a4 N i2c.png / I4 W+ p$ d& ~& w

2 O9 B# ]1 V5 @# @/ Q
( a4 W5 S* ]3 g( m# r# l好了,有了地址就可以进行操作了,先来看看LM75的寄存器:5 S/ [8 h1 Q) c6 Q  j+ M
i2c.png ' V( e3 D- p! J- U0 g) S
从上图中可以看出,0x00是温度寄存器的地址。要想读这个地址处的数值,必须首先发送寄存器地址:# G* N9 U  U- Z2 |# G8 _2 p
i2c.png , ~  u8 S, t$ f
- e2 `, D5 C% l# H; L( N' O
i2c.png
# N: p! L8 c5 d+ C+ \' y( `& vi2c-write必须要有-d参数,用于指示设备地址。其余的数据是要发送的数值。如果想通过i2c发送0x00 0x01 0x02 0x03 这四个数字可以使用这样的命令:) t3 A3 z8 n* @; g5 C! r7 ^- o
  • i2c-write -d 0x90 0x00 0x01 0x02 0x03
    & M6 T1 W/ Z& Y
  • i2c-write 0x00 0x01 0x02 0x03 -d 0x90
  • i2c-write 0x00 0x01 -d 0x90 0x02 0x03
  • ...
    ( E: i- e* q7 H: M; E

    5 w" J( f1 I; O/ D! w
设备地址0x90必须紧跟在-d的后面。除了i2c-write的位置之外,出现在什么地方都是可以的。
. ~) _+ N% I3 f0 i: G2 {  M1 F2 B2 ^+ l

. m9 g! }9 C, |5 F在发送完寄存器地址之后,就可以读取寄存器中的数值了。查看数据手册,可以看到LM75的温度寄存器由两个字节组成。在发送的时候先发送高字节,在发送低字节。
6 D% l# f& r. }1 | i2c.png 0 _5 M0 K- _" H7 W, @
之后将两个字节合并成一个16位的有符号数字,数字使用2的补码表示。正温度有正的有符号数表示(最高为是0),负温度的最高位是1 。之后将数据去掉符号右移5位,加上符号,乘以0.125就是所需的温度值。这里有几个事例值,感兴趣的话可以算一下:
/ W" [; x" Q+ d5 m! o i2c.png
6 Y: }- I" x7 F2 \/ Q$ ?8 g先使用i2c-read来读取一下这两个字节:高字节在前:
" B5 \, d( q0 R% Z3 u9 x9 Y i2c.png
: {1 i/ O% e: F4 o% f& i! Z0 R. I  M' \6 G" _
i2c.png 6 H: f. y+ Z: J% G0 d9 Q3 D

1 u# U' F( O; I5 ]最后来计算一下结果:0x16C0 >> 5 =0xB6 =1869 ]) D( E* k5 e1 [% v# v* T
所以温度值为186*0.125=23.25
: `# W/ c1 T7 k# ]' Y9 l9 }) s; M/ B  b
可以看出,烟台的晚上还是非常凉爽的!5 g% E4 L/ M6 l

; T: U3 ~" i, F+ k( |注:在V1.0.2版本中,i2c-read函数新增参数-a,用于指定寄存器地址(寄存器地址只能为1个字节。如果寄存器地址多于1个字节,只能使用先写在读的方式进行操作)。$ N( J: M6 z7 h$ r; x
iic.png & K5 S; o/ c8 {" ~0 T

- U" n% _: n9 R- \) F( q" ~5 v
6 K$ ?+ ~' R; @另外,需要补充一点的是,i2c-write和i2c-read在正确写入和读取的时候不会输出任何信息的。只有在发生错误的时候才会进行提示:
  F( P. a' }" d8 s; y0 E5 o0 |" { i2c.png
, E" A6 ?7 d0 S) T) u* d

) P% \, R4 f+ j/ Y# i i2c.png 4 c' y( G0 ^# }. m( U, {

4 H/ B, h! J2 p. n( [$ ]3 I
; @. V/ w" J; ?0 Y8 B0 j
: h8 K: s8 D+ i* `& a, \6 B" g0 _
  M# ~, o% Z8 k! F2 w) w, B: l, I! q7 X1 g
7 g: V; {+ j: R7 Z. l6 `
7 D* q( h' ~4 p4 _) B8 `6 {& p! d# ^# x

LM75A.pdf

下载

137.07 KB, 下载次数: 7

LM75数据手册

qianfan 回答时间:2015-5-20 16:20:01
本帖最后由 QianFan 于 2015-5-21 12:00 编辑 - I& X. Z6 p. H6 S

' n4 s' w2 m5 o/ _$ V( {* m  M
一起来开发,定制你自己的命令! a5 x5 x' }4 R! c- O2 g( y  R0 k

7 A$ n; q+ g$ \9 Z' b  可能你觉得这些命令远远不够用,或者你希望定制一个你自己的命令,比如man 你的名字。其实,定制一个这样的命令是一个很简单的事情。
% T  |- _' {, q8 p$ ?  在串口中接受到的字符,最终是要交给shell [void shell ( char * cmd_str) ; ]这个程序来处理的,这个程序将串口接收到的一行字符,在空格处分割,并且转换成为int argc,char *argv[]的形式。这个形式是man函数的标准形式。argv[0]表示的需要调用的应用程序的名字。例如串口输入input 0 1 2,经过shell的处理之后:( g# S: ~% ^7 P+ ]+ l3 K
  • argc=4;
  • argv[0]="input"
  • argv[1]="0"
  • argv[2]="1"
  • argv[3]="2"
  • argv[4]=NULL
    , N2 h0 i  |# e7 s
    ! V8 d( g9 U4 K) Z! P% b$ g
处理之后,shell去一个cmdList列表中寻找名字叫做input的函数。如果找到了,将控制权和argc,argv一起交给input函数。而input就是我们需要编写的,只需要遍历argv,读取每一个引脚的编号,并且设置成为输出即可。具体shell函数在cmdList中寻找input函数的方法在后文中会详细讲到。
1 y1 \& d' |9 ^6 ^下面是一个简单的input函数的实现:7 U; K) C+ m1 l' M0 p; \
int input(int argc,char *argv[])
0 Y. P. I4 k2 A8 p{  n% d2 K, Q8 a3 {& n6 l( n% V
  int i=0;; S7 B3 [; T$ Y; G8 g# u: z
  for(i=0;i<argc;i++)
1 j1 O5 v& t2 E0 f8 R  {
6 I6 h  Z# B  y" J$ a- p    //设置argv表示的引脚为输入方式0 ?7 L3 `3 I- M0 @1 [4 [, G, B
  }3 D2 m( ^9 U' q3 l1 G* ]
}' D3 O$ l" t, ]# A" Y
. v5 x. |1 r. K6 O' W% S/ g: h  X
好了,下面就来说说定制命令的详细步骤:, {/ ^! w$ C8 x( b! b7 M3 F
  • 每一个命令都需要一个入口函数,格式是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
    8 d% ~/ p. Q, |! @( H

    + R0 j! d- s9 J( S
3 p9 z/ n. O( O$ z
更多更有趣的功能欢迎你来实现!
9 o2 s- S; S7 w/ }. {: p. @* g! U9 E2 _

% J2 [. [: h% }( |" x' k% b8 {
7 w, q8 ~7 N( o2 v& r; K* l
qianfan 回答时间:2015-5-20 16:19:26
本帖最后由 QianFan 于 2015-5-21 11:24 编辑 9 @9 s# w* C- B
+ S) N& Q6 {+ t8 v
使用入门:
" o& h" C9 _, B
  • 从附件中下载工程文件I am master 和 smarTTY软件并解压。
  • 打开工程,将hex文件下载至Nucleo334.将使用HSI作为时钟源。
  • 打开smarTTY,新建一个串口通信,115200,8bit,无校验,停止位1.
    " K! e/ _) L1 V! Z

6 q" f; c# R5 W/ C0 T, \, m$ [3 |Nucleo通电之后,通过串口发送这样的信息:
/ m1 g2 P: |* S9 M: S; ?& v$ A/ j$ x3 v start.png
0 r8 d( ?9 v' l) [. s2 Y9 ~( `先来认识一个命令 man ,类似于linux中的man 。当你遇到某一个命令而不知道如何使用的时候,可以使用这个命令。比如获取input这个命令的解释:3 R1 y" A/ [/ ]; Y4 w
start.png
8 s/ T) f# _9 R# i' {  ]这个命令的功能是将引脚设置成为输入模式,引脚的范围是0-5,对用Arduino接口的A0-A5.现在,我们在0号引脚上面挂接一个LED,在1号引脚上面挂在一个开关(平时为1,按下为0)。可以通过input,output两条命令来切换他们的模式:8 X1 l( Y9 x8 X+ n' \
start.png
* ~# O9 \- {: l6 k1 u# L+ l
# d* r7 q4 V; s; S4 I
- L+ T& A6 Q8 D/ H3 a
在将引脚设置成为输出模式之后,就可以使用set,reset,toggle三条命令来设置引脚了。set是置1,reset是清零,toggle是反转。如果引脚的模式是输入模式,可以使用read来读取。如果read的参数不是0-5范围之内,那么显示的数值就会用N来代替。例如read 0 1 255! I/ X/ K5 @' ]+ `/ _3 E
==> 1 1 N& u# }4 i. V/ f. d( Z* Z+ @
显示0,1引脚的电平值为1,255是一个非法引脚。/ ]% M4 R3 Y' T4 i9 b  u; [" ~
0 b# ?8 d  Y* W

2 @& M- |7 A; }* [$ ]9 i其余命令的解释大家可以使用man来查看。我的英语很不好,man的解释大部分都是通过谷歌翻译的。大家可以帮助修改一下源文件的翻译,还请告知。谢谢!5 |! Y7 l9 h' f3 i) p

$ k1 a" W( V4 B6 h6 e

$ o" Y3 ?' \$ a
qianfan 回答时间:2015-5-20 16:19:43
本帖最后由 QianFan 于 2015-5-20 17:20 编辑 ) _0 l+ I& O" v8 o; t: k
6 N5 u8 {& C9 k+ [, r, L0 }/ U" z
在我们平时的调试中,光使用IO接口恐怕难以满足我们的要求。还需要一些更复杂的通信协议,比如说SPI。下面我们就来说说SPI的使用。8 U- c2 r; x0 L6 r, W8 F& z. D# a

6 P( M* _8 f& J* J不管什么时候,man总是我们靠谱的好朋友。
% i0 a5 C6 \3 p/ b, X( J7 P start.png & N. H- Y" `# F. U4 A
在SPI通信上,使用板子上面表示的SPI引脚。这里就不详细解释了。可以看一下板子上面的丝印。( u8 C4 Z* ~, x: I4 l+ T

8 z9 S9 p, _& _5 x+ y2 E4 Hspi的参数有着固定的要求:( J; v- j; W2 P+ r
  • [ 表示将CS信号线拉低。注意[也是一个参数,后面需要至少一个空格;
  • r:9表示从SPI总线上读取多少个字符。后面的9代表读取9个字符,需要使用十进制表示。
  • 其余的参数使用十六进制表示,不区分大小写。前缀可以加0x,也可以不加。想FF,ff,0xFF表示的都是同一个数。
  • ] 表示将CS信号拉高。同样 ] 也是一个参数,需要后面至少一个空格。
    ; ]% {2 D) z6 r1 l+ g/ d  n6 t

, y$ Y, s/ v: U$ q. v# D  d$ ]6 H好了,就这么多,下面就来通过spi这条命令,读写SPI存储芯片W25X16.他的数据手册在附件中,大家可以下载学习一下。
- V, N+ b  _  X0 \& U先看W25的一个指令表:
% P- a1 j! v0 g/ w6 m* A start.png
+ }$ c! K" f0 f* ?- M# W7 t; @4 O( f  e2 j2 N" S7 U. [
在原PDF的第17页。可以看到上面有一条指令是读ID,解释如下:
$ \! S8 m- t' C) x; F" ] start.png ( p- K+ `+ m( l. B; V1 I
5 \' s  K' p  f8 [
在面包板上面插好线之后,使用spi命令与之进行通信:
/ d! f- Z( M/ P, Z  m( Y start.png
0 l1 d* |) R6 m: O* m2 W* J回应了两个数字,0xEF,0x14,正好与上表的数据吻合。说明通信正确。; s" p% Z9 x5 K

: m* j: y* p0 r& H" y通过查看数据手册可以看出,要想往一个地址内写数据,首先要写一个WriteEnable命令,在写完WriteEnable命令之后,StatusRegister寄存器中相应的WEL为会被置1,说明允许写。, E2 ~& @- `. `. C3 w9 i
start.png 2 u# O, J# t8 ~0 r8 r& Z! X
start.png * d; ~. Q0 w0 |
在写完WriteEnable命令之后,可以看到WEL位已经被置1了,说明操作正确。  ]$ h+ Q( b/ `
! B' }$ t3 T4 {
下面将第一扇区格式化,之后往里写如一些数据:
8 J) `0 w: X* j: D start.png 4 B- \; `# q' d" _- x; V. n" Y+ U& u
0x20是格式化命令,格式化命令之后WEL位被清零,说明不能在继续写数据。为了能够继续写数据,只好在重新发送一遍WriteEnable命令了。
6 z4 f! H$ t+ G, P6 v: L! G' ]
' V9 P2 @, t+ I读取一下格式化之后0x00处连续10个地址的数据:读取的命令是0x03
5 h. g% @5 g! L( }% [: [. p start.png 9 e' |, C0 ]/ a
数据全是0xFF,说明格式化成功了。下面再将0x00连续地址处写如0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A十个数字,写入之后再读取:. D3 S( x, s5 \' `6 g
start.png
# G( V- G* x# _) I; P这里写入了10个数据,读取了11个数据,可以看到第11个数据是0xff,也就是没有被更改,写入和读取都正确。
' ^: E$ q0 U$ f8 R$ L7 v
7 q2 m$ e* b+ q3 V! z# J1 W: @, b* q! v0 H: L& B" f2 X
好了,spi的操作就说到这里。
/ c/ c, V& _" h+ |当然,你可能疑问,这使用了默认的模式3,如果我想使用模式0怎么办呢?大家可以使用man spi-config寻找答案。( K, X9 A0 z) H0 A- _

8 |- t. c! D8 n7 k. O% ]( ^) n9 e
% B, A! ]4 v4 Y
& w; l3 ]$ R9 D- H

102801-0001R-SPIFlash.pdf

下载

1.26 MB, 下载次数: 23

W25X16

qianfan 回答时间:2015-5-20 16:20:51
本帖最后由 QianFan 于 2015-5-29 13:07 编辑
: R: q0 E3 a, m' q2 w2 p" k5 `
( R# o4 A5 N) c" m+ G# b7 S
V1.0.4命令文件说明* C" j2 i( I* f* g4 O% |" Q
    在1.0.4版本中,新增了直接发送命令文件这一特色。下面就针对命令文件结合TCP/IP芯片W5100,进行一下说明。
: O3 P, R5 }* x6 i- W    spi-read.png
+ C8 x; e9 p& r7 N2 ^4 [    5100使用SPI方式进行通信,并且仅仅支持模式0. 还需要注意的是,对5100芯片进行读写的时候,SPI的速率不能太低。在之前的操作中,发现使用256KHz的SPI进行通信,不能正常的进行读写。因此在1.0.4版本中,将SPI的时钟频率提升到了4MHz。
2 a  m1 T5 B* w- k/ S: n4 i: ^    上图是SPI通信的协议图。分为3部分。第一部分是操作码。读的时候,操作码是0x0F1 z4 x+ c/ V( i
,写的时候操作码是0xF0 。 第二部分是5100寄存器地址,2个字节,分为两次发送。第三部分是需要写的数据。1个字节。$ b7 ?; ~; r2 p5 l8 G7 a
: s4 I  j8 F) ?+ [- U

* T" ^; ~! U7 m! x6 ^8 f2 _8 J& {. q& V* c    看一下相关的寄存器:
+ I5 [8 V9 \8 m6 @( i2 x    spi-read.png 1 G4 \3 _$ [' P5 m7 t1 `) p
比如说设置本机IP,就要分四次来写(本机IP由4个字节组成,每次只能对1个字节进行读写),如果设置成为192.168.1.3,那么应该使用这样的命令:1 _( I4 f+ l+ a6 k' S. d& e! o
  • spi [ 0xf0 0x00 0x0f  0xc0 ]
  • spi [ 0xf0 0x00 0x10 0xa8 ]
  • spi [ 0xf0 0x00 0x11 0x01 ]
  • spi [ 0xf0 0x00 0x12 0x03 ]
    . T% z% i  x3 l  Z
    7 Y% G+ E* k$ O* l3 l  c7 x  R1 f
除了本机IP,还需要设置网关IP,子网掩码,MAC地址,共需要20次操作:$ u$ p2 D% b$ Y6 v7 C; l. y8 _0 b
  1. spi [ 0xf0 0x00 0x01 0xc0 ]
    " }" P, P# m+ `: {
  2. spi [ 0xf0 0x00 0x02 0xa8 ]
    : ~* D" ?: T7 J) c( [
  3. spi [ 0xf0 0x00 0x03 0x01 ]8 N; k# S8 ^: x0 Y
  4. spi [ 0xf0 0x00 0x04 0x01 ]! b9 q) A2 }. n7 T8 ~8 V5 w3 R" K

  5. " Y: y% M% c$ {9 S/ b0 R
  6. spi [ 0xf0 0x00 0x05 0xff ]
    4 f7 A$ K8 P& {) W6 j1 Z+ t
  7. spi [ 0xf0 0x00 0x06 0xff ]; A3 `8 k7 W0 C& a
  8. spi [ 0xf0 0x00 0x07 0xff ]
    . Y' w1 w/ m+ I& t. ^) u
  9. spi [ 0xf0 0x00 0x08 0x00 ]
    1 ^3 `" \! c) p5 c: p" B) I
  10. ' j) j& m* o8 |3 G
  11. spi [ 0xf0 0x00 0x09 0xde ]( K# U" M* B$ `+ m
  12. spi [ 0xf0 0x00 0x0a 0xad ]# ^  l4 I# l$ u: e" B% N4 A6 S1 W
  13. spi [ 0xf0 0x00 0x0b 0xbe ]3 n8 ?9 ^9 j/ @2 d3 K: h7 L* {& D) e1 B
  14. spi [ 0xf0 0x00 0x0c 0xef ]$ W' `: o) o) m7 G
  15. spi [ 0xf0 0x00 0x0d 0xfe ]
    ( T/ \/ z* l4 `9 K  d& ^; z
  16. spi [ 0xf0 0x00 0x0e 0xed ]
    5 f: X) u: w4 W
  17. # Y; p7 v; r8 s! H+ ~, X$ I6 G
  18. spi [ 0xf0 0x00 0x0f 0xc0 ]1 T9 D* p7 \# ]3 Z4 H) Z# W3 d9 h/ p
  19. spi [ 0xf0 0x00 0x10 0xa8 ]
    ; e' }* l2 I  o9 }# u! j
  20. spi [ 0xf0 0x00 0x11 0x01 ]
    ) R# a3 f/ C% W" z$ ~4 J  \
  21. spi [ 0xf0 0x00 0x12 0x03 ]
    * n+ u; q6 U1 L5 v
  22. 3 X* S4 c, e1 ?& `8 p
  23. spi [ 0x0f 0x00 0x01 r:1 ]1 @; G; J* B: {3 l- p% o' S8 v
  24. spi [ 0x0f 0x00 0x02 r:1 ]  i1 V1 n: V! \! v% O6 e7 [
  25. spi [ 0x0f 0x00 0x03 r:1 ]
    ' ~# p1 y+ X% Y+ |- V
  26. spi [ 0x0f 0x00 0x04 r:1 ]
    ; a) g! w9 l' B3 z" ?. Z
复制代码
# k7 I7 k. o% v/ m# I1 @# K4 v8 j2 m
在每次给5100通电的时候,都需要重新发送一下这样的字符,太麻烦了,所以索性将这些命令保存在一个txt文件中,直接通过smarTTY发送文件:* @5 E1 ^# q& @6 d. z" |: I+ n* S
spi-read.png
: S+ O' z) h. r! D点击smarTTY中的send a binary file(在上图中用圆圈圈出),选择w5100.txt :
- V9 n1 C- N7 N- K, Y$ U spi-read.png $ S1 Z  x- ~4 M# O6 s! @4 Q. y0 f! N
最后四个命令是读取网关的ip地址。在设置完这些寄存器之后,就可以使用windows上的ping命令来测试一下了:5 {7 H8 j5 j& C) P# g( n/ F# Y
spi-read.png
# X  g, N6 X, |; W. Z- Z+ `. C' U1 O- ]$ i. l
断开5100的网线再ping一下:
; f7 U; k( v3 c4 N4 ?2 ], Y( }1 n spi-read.png " u# h9 K4 v4 f8 U
8 j+ W5 g) v" I* \1 T2 M

# L( E2 j$ Z4 U" ?
  _9 A" c- G/ w6 n6 C* u; n8 b

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 手机版