最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【问题解答】嵌入式入门问题 -> 解释如何在无操作系统的情况下调试硬件,如何写硬件的驱动

Embedded crifan 2369浏览 0评论

【问题】

嵌入式入门问题

中的:

现在项目组在搞裸机开发,每个模块都要去初始化,配置,我觉得我根本就不知道这些芯片要怎么配置才能通顺,所以我也不会遇到没有响应的时候,怎么去调节使之与时序图同节奏,我学的嵌入式都只说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脚,则需要去:

  • 搞懂本身此硬件协议是怎么规定的
    • 此处就是搞懂SPI协议本身是如何规定的
    • spi master connection with spi slave
  • 再去看对应的该硬件模块的手册中,该硬件模块是哪几个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协议,可以一个主控接多个外设:

one spi master three multiple slave

自然,如果用到这种模式,也要你自己搞懂对应的:

主控的引脚和多个外设之间的引脚的具体接法的。

 

如何去调试对应的硬件模块?

搞懂物理上的硬件连接后

还需要去搞懂软件上,如何写代码,写驱动,让硬件工作起来。

对应的,此处无OS的话,则是:

初始化硬件

往往都是:

看对应的数据手册

此处是SPI的FM模块的数据手册

搞懂其功能的用法

一般对应的手册里面有解释,如何去设置,设置哪些寄存器,怎么设置

使得此模块可以正常的初始化

对应的代码,往往就是配置相应的和初始化相关的寄存器了。

 

实现数据的读写

接下来,再去实现对应的函数

实现数据的读写

也是去看对应的数据手册

此时还是那个SPI的FM模块的数据手册

看看其如何解释的

一般另外也有对应的示例代码供你参考

然后去写出自己此处的,实现数据读写的代码

一般也就是读写对应的数据寄存器之类的

然后实现数据的读写

 

由此,基本上就实现了:

  • 物理上SPI引脚连接正确
  • 上电后,对应的初始化代码,可以正确的配置SPI模块
  • 接下来可以正常的实现数据的收发,即数据的读写

此处即:

  • SPI的FM模块,物理上的引脚连接正确后(看起来也很可能是一堆跳线,显得很乱,但是实际上是正确的接法)
  • 然后上电初始化后,对应的代码可以正常初始化SPI,可以通过SPI和内部模块通讯
  • 接下来,可以实现数据的收发,读写,即可以通过SPI去配置FM的频率,扫描电台,可以正常播放FM电台

 

注:

1. 关于物理上的引脚,比较原始的,是上述说的,用跳线,一点点连接:显得很乱

2. 更好的做法是:

有硬件工程师,或者本身模块和主控方,都有对应的插槽:不用自己用跳线接pin脚,直接把模块插入对应的板子上的插槽即可

  • 当然,有些模块,是不分方向的,所以需要你自己搞懂1号引脚在哪,对应的搞懂pin脚的顺序,注意不要插反了
    • 实际上,越来越多的模块插槽,都做的更好了:物理上的接口,就有防插反涉及
      • 只要你直接能插上,说明pin脚顺序就是对的,无需你操心细节了

 

更多示例说明,如何调试硬件,如何搞驱动开发

之前陆续写了点教程:

有的写的相对完整,有些还没完成,只有部分内容。

贴出来,供参考:

【详解】如何编写Linux下Nand Flash驱动

如何在Linux下写无线网卡的驱动

如何实现Linux下的U盘(USB Mass Storage)驱动

 

上面虽然基本都是在有OS,即嵌入式Linux下的开发,但是基本逻辑,和无OS时写驱动的逻辑,也是相同的,所以还是有参考价值的。

 

总结

国内的计算机方面的资料,

尤其是嵌入式方面的,

的确很缺乏,

导致:

大多数人,包括我最开始,也是,完全的一头雾水,完全的没有概念

完全就是在深林里迷路,而且还是上了大雾的,结果啥也看不懂,看不见。

搞开发时,连概念和背景逻辑都不清楚,自然无法顺利的接线,写代码。

只有:

靠自己多经历,多联系,

慢慢的才有所了解。

上述的一点总结,希望对相关的人员有帮助。

 

参考资料

Serial Peripheral Interface Bus

Secure Digital

转载请注明:在路上 » 【问题解答】嵌入式入门问题 -> 解释如何在无操作系统的情况下调试硬件,如何写硬件的驱动

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
81 queries in 0.161 seconds, using 22.09MB memory