SPI实现单总线硬件控制器的理论研究和实现方法(菜农)
转载本帖应注明雁塔菜地: http://blog.**/hotpower/ 本例程未经过实战检验,若应用于产品而出错者,菜农不负任何责任,特此声明.
菜农HotPower@126.com 2008.2.29(四年等一回的日子) 于雁塔菜地
常用的单总线有2大类: 1-Wire和HDQ16
1-Wire和HDQ16都采用单线数据双向通讯,特别是有些1-Wire系列器件甚至不需电源。 单总线和I2C,SPI相比接线简单,但时序要求很严格,一般采用IO模拟定时器辅助的方法.
做主机其缺点还不太明显,若作为从机设备时,IO模拟一般还需外部中断协助. 最大特点是CPU占有率太高.甚至根本无法实现.故双机之间很少采用单总线通讯, 更别指望一主多从或多主多从通讯.
SPI实现单总线硬件控制器的接线方法很简单,为防止MOSI和单总线线与,可加二极管防止。
这样加上拉电阻并短接MISO后即构成单总线1-Wire或HDQ16.
一.单总线时序的研究:
单总线一般由3大时序构成(简化): 1.总线复位 因为在空闲时,总线由上拉电阻拉到高电平,这个状态很有"物理意义"---对从机充电. 此时从机实际是在等待或休眠状态,故必须要由外部唤醒.
为保证从机的唤醒和联接的可靠及加速单线通讯的速率,故需长时间的复位(拉低电平). 使其复位周期和数据周期拉大距离以便区分。
HDQ16的总线复位周期由190uS的低电平和45uS的高电平组成,在高电平期间不需从机应答. 1-Wire的总线复位周期由480uS的低电平和480uS的高电平组成,在高电平期间可从机应答.
1-Wire与HDQ16的最大不同在于总线复位周期里包含从机的应答时序.
2.写'0' 在空闲中总线被下拉(同步)就表示启动单总线的数据操作过程的开始. 由于总线被下拉导致通讯而阻塞(线与),故本时序只能作为主机操作过程.读回数据恒为0.
3.写'1' 这个操作实际是写'1'和读'0'及读'1'三个时序的综合. 因为TXD的开漏输出,故单总线实际就是51的准双向IO. 只有在此期间方可读取从机数据。
将写'0'和写'1'时序进一步合并后,即可实现单总线读写一体化操作.
二.SPI时序的研究: SPI时序很简单,一般都支持4种模式. 主要由SS,SCK的开始电平状态。 这里我们只能采用模式3即SPI空闲时,SS,SCK都为高电平。 由于要将SPI做单总线控制器,故不需要SS,SCK这2个硬件信号!!!但软件必须设置SPI主机模式3。 这对于MCS/ARM/DSP等基本类同。以下只以SPI模式3举例,而且是在主机模式下。
1.协议开始 SPI本身是以SS的跳变开始一帧信号数据的传输的,数据位数一般为8位和16位。 但有的DSP的McBSP可以在128位内进行选择。 从以下的分析中可以看出位数和分辨率的关系的。 即SS下降沿启动SPI时序.
2.数据发送和接收 在SCK节拍下,SCK的下降沿一般发送数据,在上升沿接收数据。也有在同边沿收发数据的。 这要看具体硬件配置了.
3.协议结束 在传送数据期间,SS跳变到初始状态后都会强行结束一帧数据的收发. 即SS上升沿结束SPI时序.
三.SPI和1-Wire/Hdq16的不同点和共同之处 从以上分析可以看出它们的共同之处: 1.空闲状态到工作状态的切换都是采用拉低总线来唤醒从机以实现同步.(起始位S) 2.每位数据都是由一定宽度的高低电平组成.并严格保持一定的有效时间.(数据串D0D1..DX) 3.释放总线结束表示数据的结束.(停止位P)
最大的不同在于"每帧"SPI是多位(5,6,7,8等)数据位,而单总线为一位数据. 当SPI数据位串为连续的0或1时,就可组成一位单总线的数据位!!! 即该方法是用数据位数的宽度来凑够单总线的时序脉宽.
四.实现方法举例(硬件只要MOSI,MISO) SPI和UART的不同在于它没有起始位和停止位的高低电平的固定变化. 故控制数据位模拟高低电平更加随意.但分辨率可能受到损失(8位SPI数据不如UART的一帧高)
以下只分析单总线DS18B20的实现方法,HDQ16等其他单总线类同 由于单总线的复位/应答周期需要480+480=960uS,故每位SPI数据需要960/8=120uS即BPS=8333 由于从机的应答脉宽为60~240uS,故可能收不到应答信号,不过在UART的104uS实战中是可以收到的.
总之SPI凑数算法简单,即单总线需要的周期/SPI-帧收发的位数
注意SPI一般先发送最高位.而UART一般先发送最低位.
例:(N=8)BPS=8300 T=120.48us (1-Wire复位/应答时序) 0x0f ->00001111 即4T个0,4T个1 波形: 低电平481.92uS, 高电平481.92uS 周期:963.84uS
例:(N=8)BPS=133300 T=7.501us (1-Wire写'1'/读'0'/读'1'时序) 0x7f ->01111111 即1T个0,7T个1 波形: 低电平7.501uS, 高电平52.507uS 周期:60.008uS
例:(N=8)BPS=133300 T=7.501us (1-Wire写'0'时序) 0x01 ->00000001 即7T个0,1T个1 波形: 低电平52.507uS, 高电平7.501uS 周期:60.008uS
五.程序实现方法(待续)
5.单总线的协议硬件控制器终成正果
由于采用了SPI作为单总线的协议硬件控制器,故在传送期间不怕中断,时序不会错乱.
|