【问题】
中的:
现在项目组在搞裸机开发,每个模块都要去初始化,配置,我觉得我根本就不知道这些芯片要怎么配置才能通顺,所以我也不会遇到没有响应的时候,怎么去调节使之与时序图同节奏,我学的嵌入式都只说IIS和SPI,UART等在系统Linux的用法,但是这些都已经果断把硬件抛开了,我觉得很迷茫了,求解惑。 我根本就调不好一个模块。再加上硬件都是他们自己定义随意的跳线改变各个pin的功能。 |
【问题解答】
1."在搞裸机开发"
我没理解错的话,估计你指的是:
没有操作系统的情况下,直接针对硬件写驱动
就像类似于在Uboot中实现某硬件的驱动
是吧?
2.“每个模块都要去初始化,配置”
先说有操作系统的情况:那也是需要你去配置很多东西,才能让硬件工作起来的
只是:
无操作系统的时候,往往要自己写更多的代码,去配置硬件,才能使其工作
而且是要,真正理解硬件的工作原理,硬件的资源,寄存器等等
然后才能写出正确的代码,初始化硬件,才能使其工作
3.“我觉得我根本就不知道这些芯片要怎么配置才能通顺” “遇到没有响应的时候,怎么去调节使之与时序图同节奏”
基本的逻辑是:
先搞懂硬件本身的物理上的工作原理
以及相关的软件协议
再去对照着硬件的收据手册,即datasheet,去看看对应的对应的硬件是如何配置的
往往都是参考示例代码(和datasheet中的说明)去配置对应的寄存器
配置对了,硬件就可以正常工作了
就可以获得你所希望得到的“响应”了
4.“我学的嵌入式都只说IIS和SPI,UART等在系统Linux的用法,但是这些都已经果断把硬件抛开了”
你学的,是人家教程中,关于在某种平台下,比如嵌入式Linux,比如WinCE等环境下,如何写对应的驱动
的确是和,没有这些环境,即无操作系统,无OS情况下,直接裸机写驱动,是不同的;
但是根据原理是一致的:
都是你要明白:
硬件的工作原理
软件协议
有OS时
- 相关系统框架做了哪些事情
- 剩下还有哪些事情需要你去实现
- 底层硬件初始化,配置对应的寄存器,申请对应的资源等等
无OS时:
- 如何配置寄存器,使其工作
- 可能会涉及,申请部分的资源
但是你要明白的是:
人家根本没有抛开硬件
因为所有的驱动开发,硬件调试,都是基于:
对应的某种软件的协议,比如SD,USB,SPI等等,加上对应的硬件的实体,比如SPI的控制+SPI的从设备模块,USB的主控+USB的从设备,等等
才可以:
实现真正的对应的协议,实现对应的功能的,比如SD的卡的数据读写,USB的U盘的数据读写等等。
你所说的:
在嵌入式Linux等环境下,谈及驱动开发,实际上不是“抛开了硬件”
只不过是:
从驱动层次和代码层次来说,没有像裸机,无OS的情况下,那么直接的,让你看到和操作对应的硬件而已
只不过是人家的系统(比如嵌入式Linux)针对硬件,又多做了很多层软硬件的封装而已
所以:
在有OS时搞驱动开发:你不仅要
- 明白硬件的工作逻辑
- 软件的协议
- 还要明白该OS对于你的硬件这部分做了哪些抽象,做了哪些框架
- 这些框架都干了啥,搞清楚剩下还需要做哪些事情
- 这才是你驱动所要干的事情;
而无OS时,相对来说,只需要:
- 明白硬件的工作逻辑
- 软件的协议
- 无需了解更多的有OS时候的哪些框架
- 但是往往也要对环境有所了解
- 比如Uboot中实现某驱动的话,也要搞清楚Uboot帮你已经实现了哪些功能
- 剩下才是你要去写驱动实现的内容
- 如果纯粹是无OS,连Uboot之类的环境都没有
- 那么真的是:从头到尾,和硬件对应的软件协议,和写代码如何初始化,如何操作硬件
- 所有的这部分的工作,都要你自己去写代码,写驱动去实现了
- 此时,你要写的驱动,代码量更多,更累
- 当然如果真的能真正实现,那么也更加透彻的理解了对应的硬件工作原理和对应的软件协议了。
5.“再加上硬件都是他们自己定义随意的跳线改变各个pin的功能”
我没理解错的话:
是人家(估计是其他懂行的软件开发人员,比如写驱动的人,或者是对应的硬件工程师)帮你把对应的芯片引脚接好了
变成了你所看到的:
一堆的pin脚,连了一堆的线
但是你却:
不知道为何要连接这些线
让你自己连,你也不会,不知道怎么连接的
还以为人家是:“随意”连接,而“改变了pin脚的功能”
实则是:
如果你真正搞懂了:
对应硬件的工作原理,对应的pin脚功能,然后自己去接线的话,
你也会和其他连的一样的
只是正确的连接pin脚后,看起来,比较乱而已
到底该如何在无OS情况下,去搞懂调试某个硬件?
简单说:
没办法直接给出你答案。
因为这个这世上存在成千上万的硬件模块
每个硬件模块,有成千上万的差别
但是,可以给你讲解大致思路
并且给出之前的一个教程,做例子,供你参考
然后剩下的就是你自己摸索和折腾了。
如何调试硬件?
先说物理上的接线:
对应要先搞懂,对应的硬件模块,物理上有哪些pin脚
每个pin脚的功能是什么
- 是Vcc电源
- 还是GND接地
- 还是某个数据信号,比如
- USB的D+和D-等等
- SD卡的DATA0/DATA1/DATA2等等
- 比如某个(好像是SPI接口的)FM收音机硬件模块的SPI接口的MOSI,MISO等等
然后:
搞懂你的硬件模块,和你的电路板上面的pin脚的对应关系
或者是插针,对应的,哪个引脚对应接哪个引脚
随便举个例子:
举例说明的SPI接口的FM硬件模块如何连接pin脚
则说明了:
搞清楚主次关系:
- 你的电路板,作为SPI的Host主控端
- 和你的SPI接口的FM硬件模块,作为SPI的Slave从设备端
然后根据此主次关系,以及对应的协议中规定的连接方法
此处,即去用跳线,连接对应的:
你主板上,SPI主控的对应的物理pin脚,接到对应的,你的SPI接口的FM模块上对应的物理pin脚
关于,具体是哪个pin脚,接哪个pin脚,则需要去:
- 搞懂本身此硬件协议是怎么规定的
- 再去看对应的该硬件模块的手册中,该硬件模块是哪几个pin脚
- 此处就是去看该SPI的FM模块的pin脚定义
- 找到对应的该SPI接口的FM模块的对应的数据手册
- 去看看对应的各个引脚,哪个是SPI的SCLK,MOSI,MISO,SS等等。
注:
1.不同协议,具体物理引脚不同,当然对应的信号线,即pin脚不同
比如SPI协议和SD协议不同
对应的SPI的主控和外设
SD卡的主控和外设,对应的硬件的物理引脚,个数都不同,功能和含义更不同
都要搞清楚具体含义才可以。
2.同一种协议,有的有多种模式,硬件的引脚接法也不同
比如SD卡协议,有SPI模式,1bit的SD总线模式,4bit的SD总线模式:
- SPI模式:一位数据,相关数据位,只连接MISO即可;
- 1bit的SD总线模式:相关数据位,只接DAT0;
- 4bit的SD总线模式:相关数据位,要接:DAT0,DAT1,DAT2
比如,SPI协议,可以一个主控接多个外设:
自然,如果用到这种模式,也要你自己搞懂对应的:
主控的引脚和多个外设之间的引脚的具体接法的。
如何去调试对应的硬件模块?
搞懂物理上的硬件连接后
还需要去搞懂软件上,如何写代码,写驱动,让硬件工作起来。
对应的,此处无OS的话,则是:
初始化硬件
往往都是:
看对应的数据手册
此处是SPI的FM模块的数据手册
搞懂其功能的用法
一般对应的手册里面有解释,如何去设置,设置哪些寄存器,怎么设置
使得此模块可以正常的初始化
对应的代码,往往就是配置相应的和初始化相关的寄存器了。
实现数据的读写
接下来,再去实现对应的函数
实现数据的读写
也是去看对应的数据手册
此时还是那个SPI的FM模块的数据手册
看看其如何解释的
一般另外也有对应的示例代码供你参考
然后去写出自己此处的,实现数据读写的代码
一般也就是读写对应的数据寄存器之类的
然后实现数据的读写
由此,基本上就实现了:
- 物理上SPI引脚连接正确
- 上电后,对应的初始化代码,可以正确的配置SPI模块
- 接下来可以正常的实现数据的收发,即数据的读写
此处即:
- SPI的FM模块,物理上的引脚连接正确后(看起来也很可能是一堆跳线,显得很乱,但是实际上是正确的接法)
- 然后上电初始化后,对应的代码可以正常初始化SPI,可以通过SPI和内部模块通讯
- 接下来,可以实现数据的收发,读写,即可以通过SPI去配置FM的频率,扫描电台,可以正常播放FM电台
注:
1. 关于物理上的引脚,比较原始的,是上述说的,用跳线,一点点连接:显得很乱
2. 更好的做法是:
有硬件工程师,或者本身模块和主控方,都有对应的插槽:不用自己用跳线接pin脚,直接把模块插入对应的板子上的插槽即可
- 当然,有些模块,是不分方向的,所以需要你自己搞懂1号引脚在哪,对应的搞懂pin脚的顺序,注意不要插反了
- 实际上,越来越多的模块插槽,都做的更好了:物理上的接口,就有防插反涉及
- 只要你直接能插上,说明pin脚顺序就是对的,无需你操心细节了
更多示例说明,如何调试硬件,如何搞驱动开发
之前陆续写了点教程:
有的写的相对完整,有些还没完成,只有部分内容。
贴出来,供参考:
如何实现Linux下的U盘(USB Mass Storage)驱动
上面虽然基本都是在有OS,即嵌入式Linux下的开发,但是基本逻辑,和无OS时写驱动的逻辑,也是相同的,所以还是有参考价值的。
总结
国内的计算机方面的资料,
尤其是嵌入式方面的,
的确很缺乏,
导致:
大多数人,包括我最开始,也是,完全的一头雾水,完全的没有概念
完全就是在深林里迷路,而且还是上了大雾的,结果啥也看不懂,看不见。
搞开发时,连概念和背景逻辑都不清楚,自然无法顺利的接线,写代码。
只有:
靠自己多经历,多联系,
慢慢的才有所了解。
上述的一点总结,希望对相关的人员有帮助。