下面该说说跟协议有关系的东西了。嵌入式中涉及的协议是很多的,简单的I2C、SPI,复杂的USB、 |
以太网等等。当你接触多了这类东西,你就会发现事物的本质都是一样的。 |
以前有朋友和我交流单片机知识时,我告诉他说,所有的IC,功用不过都是让某个管脚在某个时间置 |
高或者置低。协议也一样,不过就是让某条线路某段时间持续高电平或者低电平。其实嵌入式里所有的协 |
议,看起来复杂,实际上基本原理都是一样。就像海面上两艘军舰的信号兵用旗帜打信号,所有的协议, |
不过都是严格按照某种规律传递最简单不过的信息(比如是打红旗还是打蓝旗),让对方(芯片or器件) |
明白某些事先定义好的信息序列。你若告诉你的QQ好友,以后我们聊天我说一句你才能说一句,我想这 |
就是你定义的最简单不过的协议了。 |
当你明白了这个原理,所有的协议在你看来都变得简单了,我们只需要弄懂上面提到的“规律”— 每 |
种协议定义者规定的信息传递法则,不管是使用协议还是编写协议,都会像QQ聊天这么简单。 |
现在说回SPI,SPI一共有三根线,一根MOSI,一根SCK,一根MISO。看名字很好理解很好记。MOSI |
又称SI,是master output,slaver input(主出从入)的缩写,Sck是时钟信号,MISO和MOSI正好相反, |
主入从出。这三根线就可以完成通讯任务,当然有时为了协调总线上的多个器件,需要片选信号。 |
其基本规则是这样的,当我要读哪个器件的时候,主CPU将片选(nCS)拉低,然后在SCK上给脉冲 |
信号(空闲时SCK是低电平),传输时,通过软件在SCK上给8个高电平脉冲。在这8个脉冲里,在SCK |
拉高的瞬间,MOSI上的状态就表示1个Bit的信息,被器件读取,MOSI为高就是1,为低就是0。同样, |
在SCK为高电平时,MISO上的状态也代表了1个Bit的信息,被主处理器读取。8个脉冲组合在一起就是 |
1个字节的信息,先传高Bit位,再传低Bit位。MOSI上传递的信息是主写,MISO上传递的信息是主读。 |
当你读明白上面这段话时你就会明白通信就这么简单,I2C那些协议也是一样,只不过定的传递规则不 |
一样而已。 |
明白了原理,其实我们可以通过IO来模拟SPI总线了,SCK上不停的给脉冲,给高电平之前先把MOSI |
线根据信息位拉高或拉低即可。要读的话呢,在SCK为高电平的时候读出MISO的状态,再组合成字节即 |
可。下面给个IO口模拟SPI的例程给大家看看,加深理解: |
|
用IO模拟SPI时序 |
大家会发现,读和写是伴随着的。如果只是需要单纯的读,那么写入的数据为任意值即可,一般设置 |
|
为0xff。 |
当然了,在没有spi支持的单片机里,用io模拟是没有办法的办法,效率是比较低的。但是在有spi |
支持的单片机里,一般都有对应的寄存器,我们操作寄存器即可。一般情况下,有一个buf寄存器,有一 |
个status寄存器。对于我见到的大多数处理器而言,其流程都是将要传递的字节写到buf里,然后等待status |
的状态完成即可。下面是stm32的处理: |
|
STM32 的SPI处理 |
这个SPI_I2S_SendData函数是库里的,如果我们要操作的话,其实很简单,初始化spi后,调用库里 |
的函数就行了。但是我希望看了这篇日志之后,大家对通信协议有一个比较深入了解。 |
Spi Flash其实就是对spi总线的一个应用。在我们的嵌入式系统中,往往需要大容量的存储器,然而并 |
行flash需要占用大量的总线引脚和PCB,其优点是读取快速。串行flash虽然需要的pcb和引脚都比较小, |
文章评论(0条评论)
登录后参与讨论