学驱动就应该学一类,比如 24C02,不知道你有没有完全搞懂,如果你随便下载个程序调试到能读写就放下,那么你永远学不会。
如果完全搞懂了,那么对于其他 I2C接口的芯片驱动,你就有思路了
至少通讯是没问题,你发个命令过去,看芯片回应什么。对着datasheet来搞就行了。
对于一些基础的接口驱动,例如模拟I2C,模拟SPI,硬件I2C,SPI,串口等,都必须自己写代码做到灵活运用。
另外就是需要懂得怎么阅读时序图,这个比较重要。
然后其他功能芯片大多都是基于这些通讯接口进行命令和数据的交换。
当然,搞驱动就是难,有些芯片有时序的先后要求,搞错就不工作了,不过芯片厂商也提供相应的文档,例如 application note
evaluate board 等各种形式并提供demo源代码,你就要学会怎么找到这些源代码,其实都在厂商的网页上,这也是一项技能。
我接到一个芯片的,首先浏览一下datasheet,清楚需要用到什么接口模块,是I2C,还是SPI,还是IO口直接驱动。然后就看datasheet的
时序图,看看这时序有什么特点(基础接口的时序你已经非常熟悉)就有思路着手了。
这时参考官方的例子就很快能上手了。
举个真实的例子
最近因工作需要我需要开发SPI flash ,型号是 MX25L1606
1,首先我拿到了硬件同事给我的 demo板(当然了有其他功能的,我只是举这个例子)和硬件原理图,搞驱动的必须懂硬件,我自己百度找了这个
FLASH 的datasheet。仿真器什么的都准备好,主控使用 STM32。
2,我开始阅读datasheet,先读引脚定义部分,理解清楚每个引脚的定义,有效电平,例如 /WP 表示低电平写保护,当然了这里有经验的话就比较容易
理解,没经验的话只能折腾和积累了。最后发现硬件原理图错了,SPI flash 的SPI接口和 STM32 连错了,MOSI 和 MISO 和CLK 连线搞错了。于是只能
割线,然后飞线连接。可见,第一步是确定硬件连接没问题,这个非常重要。我手上通常都拿着万用表,每个引脚都先量一下是否导通,有没有虚焊等。
先搞好硬件,你就能将问题定位到软件上面了,否则就算你软件怎么调,硬件是错的话就悲剧了。
3,话说回来,搞好了硬件之后,接着我就大概的阅读了datasheet的剩余部分,只需要大概阅读,重点看看时序图,因为我对SPI总线非常熟悉(基础接口驱动)
所以很容易就抓住了重点,CPOL 和 CPHA 决定了使用哪种模式,datasheet给出了mode 0 3,就用mode0 (如果你连CPOL和CPHA都不知道是什么,那就
说明你的基础接口知识不过关了)
其实这类存储类接口芯片非常适合初学,他的操作都很典型,就是读,写,写保护,其他功能都是在这几个基本功能上面扩展的。
一开始就写一大段程序来验证是有点难度的,最简单的办法就是通过ID来判断,一般flash器件,甚至其他很大一部分的芯片都有一个ID标识的,有命令读取
这是最简单的,只需要发命令字,没有其他参数。
4,在datasheet中找到了这个读写ID的命令之后,开始写一个最简单的SPI发送一个字节,SPI接收一个字节的函数,如果基础好的话,复制之前调好的来用
就行了。接着用逻辑分析仪捕捉一下 /CS SCK MOSI 这几个信号是否正确,逻辑分析仪自带了分析功能,可以判断你发的时序是否正确。
5,明确了接口是正确之后,就可以发读ID命令,例如我这个flash需要发一个1字节的命令,然后接收 3个字节的器件ID。有了基础函数就很简单了,直接收发。
运行仿真,用逻辑分析仪捕捉信号,对照datasheet,严格判断时序是否和需要的一样。如果是一样的,那么从逻辑分析仪上面可以看到,数据已经发出去
而且ID已经接收到了。
6,当ID接收到,则表示,硬件没有问题,接口时序没有问题。剩下的就很简单了,对着datasheet,将命令一个一个的实现,项目也就完成了。
我之前完全没有接触过这个spi flash,但是我对SPI协议比较熟悉,于是按照以上的顺序,仅仅用了2个小时,就将 ID 读出来了。剩下几天的工作,就是慢慢
写其他读写功能,或者这里干脆搜搜别人的程序,修改一些就用了,没什么关系,因为最关键的驱动部分,你已经搞懂,并且驱动成功了。
搞驱动需要知识比较丰富,需要点耐心,因为好几天搞不出来,甚至一点思路都没有,也是很正常的事情。
需要一定的硬件知识,什么布板,放大电路,数字电路都能看懂,改进。
需要过硬的软件编程,因为你主要还是在写程序,硬件只是辅助。
需要了解各种调试工具和手段,什么万用表,示波器,逻辑分析仪都要上阵
更重要的是需要经验,驱动过各种类型的器件后,你就发现,其实都差不多。
至于工资高不高,就天知道了,反正能胜任这个的人比较少,很多都是用别人的程序调一下就搞定的半吊子。