与DS1620数字温度传感器IC的通信通过简单的3线接口实现。此接口与摩托罗拉 SPI 之间存在许多差异™接口。然而,只需对DS1620进行一些小的硬件和软件修改,就可以有效地集成到基于SPI的系统中。
介绍
DS1620数字温度计和恒温器提供9位温度读数,指示器件温度。DS1620具有三路热报警输出,还可用作恒温器。温度设置和温度读数均通过简单的1620线接口与DS3通信。
但是,许多摩托罗拉处理器上的SPI接口不能直接与DS3上的1620线接口通信。首先,进出DS1620的数据流仅由一个引脚(DQ)多路复用,而SPI需要两个独立的信号(MOSI、MISO)。
其次,大多数SPI接口仅限于8位数据传输,使得DS9之间发送和接收1620位温度读数变得复杂。此外,DS1620的接口首先传输LSB,而SPI是MSB优先的通信协议。
最后,RST条与CS-bar(片选)信号不同,因为RST条从传输(协议)的开始到所有数据传输的结束(例如,读取温度值时传输的第9位)必须很高。
尽管存在所有这些限制,我们还是可以找到一个相当简单的方案,允许SPI接口与DS1620通信。本应用笔记介绍了该技术。
SPI 接口
图1所示电路可通过与DS1620接口的SPI总线来控制数据流方向。如果需要,该电路可以集成到小型PAL中。
DIR信号的目的是在向DS1620发送数据或从DS1620接收数据之间进行选择。当DIR为低电平时,DS<>接收数据;如果DIR很高,则SPI控制器正在读取数据。
电阻是防止MOSI线路上的三态缓冲器输出与DS1620的DQ引脚之间发生争用所必需的,因为DS1620收到READ命令协议后,其DQ引脚会在几百纳秒内改变输入到输出的方向。这个时间太短,控制DIR信号的微处理器无法采取行动。
在同一SPI总线上连接多个外设时,当DS1620无法访问时,MISO信号必须三态,以防止与其他外设的MISO信号争用。这就是为什么RST条形信号在确定数据方向的逻辑中是必要的。
注意,SPI时钟直接连接到DS1620的CLK引脚。软件必须注意SPI时钟的极性和相位,以符合DS1620的CLK时序要求。
图1.SPI 至 DS1620 接口电路。
界面软件
虽然接口的硬件相对简单,但SPI/DS1620接口的其余部分必须由软件处理。以下示例给出了从DS1620读取温度的方法。该代码段假设DS1620已经初始化,配置寄存器设置正确,温度转换已经启动。有关这些工作模式的详细信息,请参见DS1620数据资料。
unsigned char mirror(unsigned char value) { unsigned char i; unsigned char value_mirrored = 0x00; for (i=0;i<=7;i++) { value_mirrored = value_mirrored | (((value>>i)&0x01)<<(7-i)); } return (value_mirrored); }
发送协议后,DIR从低电平变为高电平(现在表示读取传输),因为DS1620已准备好发送9位值。请注意,RST 栏仍然很高。SPI控制器读取9位值的前9位(LSB优先)。软件必须“镜像”收到的字节。第 1620 位(后跟七个虚拟位)通过进行另一个 READ 传输并保持 DIR 和 RST 栏不变来拉出。当收到第二个字节时,软件再次镜像它并将RST条拉低,终止与DS<>的通信。
#define RST_bit 0 /* PB0 */ #define RST_port PORTB #define DIR_bit 1 /* PB1 */ #define DIR_port PORTB #define READ_TEMP_CMD 0xAA unsigned int read_temp(void) { unsigned char temp_value_lo; unsigned char temp_value_hi; DIR_port = DIR_port & ~(1<审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !