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

怎么写器件驱动的一点个人经验  

[复制链接]
万里-363223 发布时间:2015-1-12 09:40
学驱动就应该学一类,比如 24C02,不知道你有没有完全搞懂,如果你随便下载个程序调试到能读写就放下,那么你永远学不会。如果完全搞懂了,那么对于其他 I2C接口的芯片驱动,你就有思路了至少通讯是没问题,你发个命令过去,看芯片回应什么。对着datasheet来搞就行了。
5 q- V3 u4 M% g# w# s( ^
/ x3 a3 j& r% A( T$ v对于一些基础的接口驱动,例如模拟I2C,模拟SPI,硬件I2C,SPI,串口等,都必须自己写代码做到灵活运用。另外就是需要懂得怎么阅读时序图,这个比较重要。然后其他功能芯片大多都是基于这些通讯接口进行命令和数据的交换。
  D5 p: B- H9 T* f* W! B5 y+ _% h( G5 R) T' `
当然,搞驱动就是难,有些芯片有时序的先后要求,搞错就不工作了,不过芯片厂商也提供相应的文档,例如 application note
. h3 N' ^2 x- j0 O4 O; I! E9 Vevaluate board 等各种形式并提供demo源代码,你就要学会怎么找到这些源代码,其实都在厂商的网页上,这也是一项技能。' O& u1 E. `& [7 o- k, T; O5 O( R

8 p* q+ i+ a; z& l0 E- Z, [我接到一个芯片的,首先浏览一下datasheet,清楚需要用到什么接口模块,是I2C,还是SPI,还是IO口直接驱动。然后就看datasheet的" G+ C% _6 f! s( M
时序图,看看这时序有什么特点(基础接口的时序你已经非常熟悉)就有思路着手了。7 z- S4 L0 j! W3 s4 T
7 [- j# P! i3 U% C
这时参考官方的例子就很快能上手了。
; U6 p7 A1 h' `4 S& S' D! H
+ R+ O8 `" o2 F" ^4 _" T5 j举个真实的例子
* M7 t0 z! {9 C) o最近因工作需要我需要开发SPI flash ,型号是 MX25L16061 K# p+ {* l5 ]7 u
1,首先我拿到了硬件同事给我的 demo板(当然了有其他功能的,我只是举这个例子)和硬件原理图,搞驱动的必须懂硬件,我自己百度找了这个
. F$ f7 n. h* Z# }8 P( b" q9 B( S" EFLASH 的datasheet。仿真器什么的都准备好,主控使用 STM32。
8 y3 C, T5 e' F, _& S7 a7 A/ i; L0 ^9 S" W( p$ C) G' g6 G
2,我开始阅读datasheet,先读引脚定义部分,理解清楚每个引脚的定义,有效电平,例如 /WP 表示低电平写保护,当然了这里有经验的话就比较容易8 u/ Z& \: g0 H- r3 I9 s" o  B$ v
理解,没经验的话只能折腾和积累了。最后发现硬件原理图错了,SPI flash 的SPI接口和 STM32 连错了,MOSI 和 MISO 和CLK 连线搞错了。于是只能* W' V, e) f) ~0 \. c
割线,然后飞线连接。可见,第一步是确定硬件连接没问题,这个非常重要。我手上通常都拿着万用表,每个引脚都先量一下是否导通,有没有虚焊等。  X5 K( N$ D& I9 W
先搞好硬件,你就能将问题定位到软件上面了,否则就算你软件怎么调,硬件是错的话就悲剧了。; u8 v# d& q/ e: J( Z' ^
; W" O' c& G6 d, h/ X1 I
3,话说回来,搞好了硬件之后,接着我就大概的阅读了datasheet的剩余部分,只需要大概阅读,重点看看时序图,因为我对SPI总线非常熟悉(基础接口驱动)所以很容易就抓住了重点,CPOL 和 CPHA 决定了使用哪种模式,datasheet给出了mode 0 3,就用mode0 (如果你连CPOL和CPHA都不知道是什么,那就说明你的基础接口知识不过关了)" ^( u" E5 Z# E# l; G
其实这类存储类接口芯片非常适合初学,他的操作都很典型,就是读,写,写保护,其他功能都是在这几个基本功能上面扩展的。
5 d7 [* b5 f; ^; }0 B一开始就写一大段程序来验证是有点难度的,最简单的办法就是通过ID来判断,一般flash器件,甚至其他很大一部分的芯片都有一个ID标识的,有命令读取6 a- Z4 j3 r- t$ Q$ N
这是最简单的,只需要发命令字,没有其他参数。
0 `8 L3 f7 ^/ {* d; X; K3 v
+ z6 q9 U1 D) L! [9 l% r! r4,在datasheet中找到了这个读写ID的命令之后,开始写一个最简单的SPI发送一个字节,SPI接收一个字节的函数,如果基础好的话,复制之前调好的来用就行了。接着用逻辑分析仪捕捉一下 /CS  SCK  MOSI 这几个信号是否正确,逻辑分析仪自带了分析功能,可以判断你发的时序是否正确。
7 t% {  o! Y: B4 I; p0 ~$ h" V8 x& G+ C3 }: c* v, N. }
5,明确了接口是正确之后,就可以发读ID命令,例如我这个flash需要发一个1字节的命令,然后接收 3个字节的器件ID。有了基础函数就很简单了,直接收发。运行仿真,用逻辑分析仪捕捉信号,对照datasheet,严格判断时序是否和需要的一样。如果是一样的,那么从逻辑分析仪上面可以看到,数据已经发出去而且ID已经接收到了。: ]/ M' S! K7 W( V* Y, C
4 u" o/ I8 v% }1 D( P5 O
6,当ID接收到,则表示,硬件没有问题,接口时序没有问题。剩下的就很简单了,对着datasheet,将命令一个一个的实现,项目也就完成了。& p4 T6 E# j7 v' e7 n4 K0 y5 |
我之前完全没有接触过这个spi flash,但是我对SPI协议比较熟悉,于是按照以上的顺序,仅仅用了2个小时,就将 ID 读出来了。剩下几天的工作,就是慢慢写其他读写功能,或者这里干脆搜搜别人的程序,修改一些就用了,没什么关系,因为最关键的驱动部分,你已经搞懂,并且驱动成功了。
; A8 h+ q' B0 i
7 F3 ^% J+ E; y/ C. q" H: W4 g( ^搞驱动需要知识比较丰富,需要点耐心,因为好几天搞不出来,甚至一点思路都没有,也是很正常的事情。
8 q% R! b7 r2 u$ O0 @9 d; h+ A( \/ @需要一定的硬件知识,什么布板,放大电路,数字电路都能看懂,改进。7 a- K$ {" B$ g6 @9 E
需要过硬的软件编程,因为你主要还是在写程序,硬件只是辅助。
1 L. p2 u  i3 [. X. l需要了解各种调试工具和手段,什么万用表,示波器,逻辑分析仪都要上阵0 G7 h5 e! u- |$ N
更重要的是需要经验,驱动过各种类型的器件后,你就发现,其实都差不多。
  O1 e) ?1 Q% {# c, p7 M; k7 t; x' O3 t  V0 E* b, |" i
对于比较常用的芯片来说网上有比较多的资料,对于什么资料都没有的器件,只有官方一份简单的datasheet,那就得看自己的真功夫了.......
0 I5 @3 e, i+ k" |1 k# }# G6 B, E/ V; }) C
! J2 k& }2 p7 u* g5 E' n& R

- b7 C) u$ h" X4 f6 r. j2 S
赞 收藏 评论34 发布时间:2015-1-12 09:40

举报

34个回答
万里-363223 回答时间:2015-1-12 14:24:27
harvardx 发表于 2015-1-12 13:13
) F4 o7 t3 E1 w& `) v, I/ x4 d9 V我喜欢直接利用经典代码 自己写比较费时间.

! @# M3 `/ p. {4 I; X) ^7 K- c有些比较常用的,就直接调用就行了,节约时间....调高效率嘛
harvardx 回答时间:2015-1-12 14:08:26
风中的IT 发表于 2015-1-12 13:22
* W$ A# a/ N" w) h# Y8 V* q我感觉对于写代码时间不长的还是自己写写,那样才能学到东西,等很熟悉了再用经典的便于节省研发时间 ...

7 u8 m" e# \6 v7 A  m$ z嗯 刚开始自己学写. 哈哈 学到东西, 就可以走点小捷径了 .不然也无从辨识 所借鉴程序的好坏
风中的IT 回答时间:2015-1-12 13:22:45
harvardx 发表于 2015-1-12 13:13
3 _* L" p0 d( Z2 L我喜欢直接利用经典代码 自己写比较费时间.

" {. w( @: V% I1 F& y2 `+ ]我感觉对于写代码时间不长的还是自己写写,那样才能学到东西,等很熟悉了再用经典的便于节省研发时间
大秦正声 回答时间:2015-1-12 10:33:18
很好的经验
iwqt1983 回答时间:2015-1-12 10:36:00
分享的经验很用的,推荐大家看下。
万里-363223 回答时间:2015-1-12 10:38:14
大秦正声 发表于 2015-1-12 10:33
% S1 t+ R8 m. q* O) J0 ~很好的经验

, y1 {0 v* t& v& q% ~% E: p感觉挺有用的,值得学习........
万里-363223 回答时间:2015-1-12 10:38:47
iwqt1983 发表于 2015-1-12 10:36
, e% O- L* s6 r- b9 o2 T分享的经验很用的,推荐大家看下。

* P1 h; h( c: C  w) k% x* c( Y( W  X谢谢支持..........
fjjjnk1234 回答时间:2015-1-12 10:43:43
感谢分享!!!学习了
万里-363223 回答时间:2015-1-12 11:15:20
fjjjnk1234 发表于 2015-1-12 10:43
0 s2 p! {7 n" I& F. ^" ~感谢分享!!!学习了
; `; J( A7 f! n/ k
大家一起学习...........
kqh1120 回答时间:2015-1-12 11:37:55
感谢分享!!!
coolblood 回答时间:2015-1-12 11:52:16
很好  学习了
麟狮蕟 回答时间:2015-1-12 12:00:51
学习了
xyc2690 回答时间:2015-1-12 12:47:17
自己动手写才理解深刻!
harvardx 回答时间:2015-1-12 13:13:30
我喜欢直接利用经典代码 自己写比较费时间.
子曰小玖 回答时间:2015-1-12 13:49:54
感谢分享!!!学习了
123下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版