一站式电子元器件采购平台

华强商城公众号

一站式电子元器件采购平台

元器件移动商城,随时随地采购

华强商城M站

元器件移动商城,随时随地采购

半导体行业观察第一站!

芯八哥公众号

半导体行业观察第一站!

专注电子产业链,坚持深度原创

华强微电子公众号

专注电子产业链,
坚持深度原创

电子元器件原材料采购信息平台

华强电子网公众号

电子元器件原材料采购
信息平台

如何将3线DS1620数字温度传感器连接到SPI微控制器

来源:analog 发布时间:2023-11-14

摘要: 通过简单的3线接口实现与DS1620数字温度传感器IC的通信。此接口与Motorola SPI 接口之间有许多不同之处。然而,一些小的硬件和软件修改允许DS1620有效地纳入一个基于SPI的系统。

介绍

DS1620数字温度计和恒温器提供9位温度指示设备的温度。DS1620有三个热报警输出,也可以作为恒温器。温度设置和温度测量都通过简单的3线接口与DS1620进行通信。

然而,许多摩托罗拉处理器上的SPI接口不能直接与DS1620上的3线接口通信。首先,进出DS1620的数据流仅在一个引脚(DQ)上多路复用,而SPI需要两个单独的信号(MOSI, MISO)。

其次,大多数SPI接口仅限于8位数据传输,这使得从DS1620发送和接收9位温度信号变得复杂。此外,DS1620的接口首先传输LSB,而SPI是msb优先通信协议。

最后,RST-bar不同于CS-bar(芯片选择)信号,因为RST-bar必须从传输(协议)开始到所有数据传输结束(例如,当恢复温度值时传输的第9位)都是高电平。

尽管有这些限制,但可以找到一个相当简单的解决方案,允许SPI接口与DS1620通信。本应用笔记中描述了这种技术。

SPI接口

图1所示的电路可用于通过SPI总线接口到DS1620来控制数据流方向。如果需要,这个电路可以集成到一个小PAL中。

DIR信号的目的是在向DS1620发送数据或从DS1620接收数据之间进行选择。当DIR低时,DS1620正在接收数据;如果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数据表。

在访问DS1620之前,为了发生WRITE传输,DIR信号必须被断言为低电平。RST-bar必须驱动高电平才能使能DS1620。SPI控制器将协议(8位长)发送到DS1620。再次注意,SPI首先发送信息MSB,而DS1620首先发送信息LSB。为了实现这一点,应该使用软件“镜像”来反转位顺序。这样一个函数的例子如下:

Unsigned char镜像(Unsigned char值){Unsigned char i;Unsigned char value_mirror = 0x00;(i = 0; i&lt = 7,我+ +){value_mirrored = value_mirrored | (((, value&gt的在我),0 x01) & lt; & lt;(我));}返回(value_mirrored);}

发送协议后,DIR从低变为高(表示现在是READ传输),因为DS1620准备发送9位值。注意,RST-bar仍然很高。SPI控制器读取9位值的前8位(LSB优先)。软件必须“镜像”接收到的字节。第9位(后面跟着7个假位)通过进行另一次READ传输并保持DIR和RST-bar原样来取出。当接收到第二个字节时,软件再次镜像它并将rst条拉低,终止与DS1620的通信。

#define RST_bit 0 /* PB0 */#define RST_port PORTB#define DIR_bit 1 /* PB1 */#define DIR_port PORTB#define READ_TEMP_CMD 0xAAunsigned int read_temp(void){unsigned char temp_value_lo;Unsigned char temp_value_hi;DIR_port = DIR_port &~ (1 & lt; & lt; DIR_bit);/* DIR = LO: WRITE mode */ RST_port = RST_port | (1<<RST_bit);/* RST = HI: DS1620 enabled */ SPDR = mirror(READ_TEMP_CMD);/*发送协议到DS1620 */ DIR_port = DIR_port | (1<<DIR_bit);/* DIR = HI: READ mode */ while ((SPSR &(1<<SPIF_bit)) == 0);/*等待SPI flag = ready */ temp_value_lo = mirror(SPDR);/*接收最低8位*/ temp_value_hi = mirror(SPDR);/*接收8位最高位*/ RST_port = RST_port &~ (1 & lt; & lt; RST_bit);/* RST = LO: temp_value_hi<<8)+temp_value_lo);/*返回9位值*/}



声明:本文观点仅代表作者本人,不代表华强商城的观点和立场。如有侵权或者其他问题,请联系本站修改或删除。

社群二维码

关注“华强商城“微信公众号

调查问卷

请问您是:

您希望看到什么内容: