原创 关于协议和SPI通信(转)

2011-4-24 22:45 1647 4 4 分类: MCU/ 嵌入式

下面该说说跟协议有关系的东西了。嵌入式中涉及的协议是很多的,简单的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和引脚都比较小,

但其读取速度比较慢,无法存放执行代码,一般用来存放字库或图片等耗费Rom的内容。
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /3 下一条