外设驱动库开发笔记14:DS18B20温度变送器驱动

在一时候我们需要相对简单的检测温度信号,而DS18B20就是一款功能和应用都相对简单的温度传感器,通过单线就可以实现检测温度信号的需求。这一篇我们就来实现操作DS18B20获取温度数据的驱动。

1、功能概述

DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。单总线数字式温度传感器,由于具有结构简单,不需要外接电路,可用一根I/O数据线既供电又传输数据,可由用户设置温度报警界限等特点,近年来广泛用于粮库等需要测量和控制温度的地方。

1.1、硬件描述

DS18B20数字温度传感器提供9-12位摄氏度温度测量数据,可编程非易失存储器设置温度监测的上限和下限,提供温度报警。器件可以工作在-55°C至+125°C范围,在-10°C至+85°C范围内测量精度为±0.5°C。此外,DS18B20还可以直接利用数据线供电 (寄生供电),无需外部电源。DS18B20数字温度传感器提供有三种封装,其引脚定义分别如下表所示:

 

DS18B20数字温湿度传感器有一个64位ROM存储器,用于存储设备唯一的串行代码。暂存存储器包含2字节的温度寄存器,该寄存器存储温度传感器的数字输出。此外,暂存存储器提供对1字节的上、下报警触发寄存器(TH和TL)和1字节配置寄存器的访问。DS18B20数字温湿度传感器的功能框图如下图所示:

 

配置寄存器允许用户将温度-数字转换的分辨率设置为9、10、11或12位。TH、TL和配置寄存器是非易失性的(EEPROM),因此它们将在设备断电时保留数据。

1.2、数据通讯

DS18B20通过1-Wire总线通信,只需要一条数据线 (和地线) 即可与处理器进行数据传输。每个DS18B20具有唯一的64位序列号,从而允许多个DS18B20挂接在同一条1-Wire总线。可以方便地采用一个微处理器控制多个分布在较大区域的DS18B20。该功能非常适合HVAC环境控制、楼宇、大型设备、机器、过程监测与控制系统内部的温度测量等应用。

DS18B20传感器进行的功能操作是在发送命令的基础上完成的,上电后传感器处于空闲状态,需要控制器发送命令才能完成温度转换。访问DS18B20温度传感器需要按照固定的顺序操作:

步骤1、初始化通讯

步骤2、操作ROM命令(后面跟着任何需要的数据交换)

步骤3、DS18B20功能命令(后面跟着任何需要的数据交换)

每次访问DS18B20时,遵循这个序列是非常重要的,因为如果序列中的任何步骤丢失或顺序混乱,DS18B20将不会响应。这个规则的例外是搜索ROM [F0h]和警报搜索[ECh]命令。发出这两个ROM命令后,主机必须按顺序返回步骤1。

1.2.1、通讯初始化

在单线总线上的所有事务都以初始化序列开始。初始化序列包括由总线主发送的复位脉冲和从服务器发送的存在脉冲。存在脉冲让总线主人知道从设备(例如DS18B20)在总线上并且准备好操作。复位和存在脉冲的时间在单线信号部分有详细说明。

1.2.2、ROM操作

对传感器的功能操作的次序是首先完成对芯片内部的ROM操作,有5条操作ROM的指令可用于器件识别,它们分别是:ReadROM(33H)、Match ROM(55H)、Skip ROM(CCH)、SearchROM(F0H)、Alarm Search(ECH)。 具体描述如下表所示:

 

1.2.3、功能操作

实现DS18B20温度传感器操作,需在发送ROM指令之后发送功能指令。DS18B20温度传感器共有6条功能指令,分别是:温度转换指令(44H)、读暂存器指令(BEH)、写暂存器指令(4EH)、复制暂存器指令(48H)、重调EEPROM指令(B8H)、读电源供电方式指令(B4H)。具体描述见下表所示:

 

2、驱动设计与实现

我们已经了解了DS18B20温度传感器的基本情况和数据通讯的相关信息。接下来我们将基于此设计并实现DS18B20温度传感器的驱动程序。

2.1、对象定义

我们依然采用基于对象操作的方式来实现,在使用一个对象之前我们需要获得这个对象。同样的我们想要基于对象操作DS18B20温度传感器就需要先定义DS18B20温度传感器的对象。

2.1.1、对象的抽象

我们要得到DS18B20温度传感器对象,需要先分析其基本特性。一般来说,一个对象至少包含两方面的特性:属性与操作。接下来我们就来从这两个方面思考一下DS18B20温度传感器的对象。

先来考虑属性,作为属性肯定是用于标识或记录对象特征的东西。我们来考虑DS18B20温度传感器对象属性。每一个DS18B20温度传感器都有一个序列号,在总线上有多个DS18B20温度传感器时,是区别设备的唯一标识,所以我们将序列号作为属性。同时温度数据表示了DS18B20温度传感器当前的工作状态,所以我们也将其作为属性。

接着我们还需要考虑DS18B20温度传感器对象的操作问题。我们知道DS18B20温度传感器采用的是单总线通讯,既然是单总线就需要控制总线的输入输出方向,而且这对这条总线在不同的输入输出方向,我们需要读数据和写数据,而这些操作都依赖于硬件平台,所以我们将它们定义为DS18B20温度传感器对象的操作。处于时序控制的需要,我们需要延时操作函数,而在不同的软硬件平台延时操作会有差异,我们也将其作为对象的操作。

根据上述我们对DS18B20温度传感器的分析,我们可以定义DS18B20温度传感器的对象类型如下:

/* 定义DS18B20对象类型 */
typedef struct Ds18b20Object {
Uint8_t sn[6]; //Ds18b20元件序列号
float temperature; //温度数据
void (*SetBit)(Ds18b20PinValueType vBit);//写数据位到DS18B20
uint8_t (*GetBit)(void);//从DS18B20读取一位数据
void (*SetPinMode)(Ds18b20IOModeType mode);//设置DS18B20的数据引脚的输入输出模式
void (*Delayus)(volatile uint32_t nTime);       //延时us操作指针
}Ds18b20ObjectType;

2.1.2、对象初始化

我们知道,一个对象仅作声明是不能使用的,我们需要先对其进行初始化,所以这里我们来考虑DS18B20温度传感器对象的初始化函数。一般来说,初始化函数需要处理几个方面的问题。一是检查输入参数是否合理;二是为对象的属性赋初值;三是对对象作必要的初始化配置。据此我们设计DS18B20温度传感器对象的初始化函数如下:

/*对DS18B20操作进行初始化*/Ds18b20StatusType Ds18b20Initialization(Ds18b20ObjectType *ds18b20,Ds18b20SetBitType setBit,Ds18b20GetBitType getBit,Ds18b20SetPinModeType pinDirection,Ds18b20DelayType delayus){if((ds18b20==NULL)||(setBit==NULL)||(getBit==NULL)||(delayus==NULL)){return DS18B20_InitialError;}ds18b20->SetBit=setBit;ds18b20->GetBit=getBit;ds18b20->Delayus=delayus;if(pinDirection==NULL){ds18b20->SetPinMode=SetPinModeDefault;}else{ds18b20->SetPinMode=pinDirection;}ds18b20->temperature=0.0;ResetDs18b20(ds18b20);if(PresenceDs18b20(ds18b20)){return DS18B20_NoResponse;}GetDs18b20SerialNumber(ds18b20);return DS18B20_OK;
}

2.2、对象操作

我们已经完成了DS18B20温度传感器对象类型的定义和对象初始化函数的设计。得到对象并非我们的目标,我们的主要目标是获取对象的数据,接下来我们还要实现面向DS18B20温度传感器的各类操作。

2.2.1、初始化通讯

在单线总线上的所有事务都以初始化序列开始。初始化序列包括由主机发送的复位脉冲和从从设备(如DS18B20)发送的存在脉冲。存在脉冲让总线主机知道从设备(例如DS18B20)在总线上并且准备好操作。复位和存在脉冲的操作时序如下图:

 

其操作过程描述如下:

(1) 先将数据线置高电平“1”。

(2) 延时(该时间要求的不是很严格,但是尽可能的短一点)

(3) 数据线拉到低电平“0”。

(4) 延时750微秒(该时间的时间范围可以从480到960微秒)。

(5) 数据线拉到高电平“1”。

(6) 延时等待(如果初始化成功则在15到60微秒时间之内产生一个由DS18B20所返回的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。

(7) 若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。

(8) 将数据线再次拉高到高电平“1”后结束。

/*主机给从机发送复位脉冲*/
static void ResetDs18b20(Ds18b20ObjectType *ds18b20)
{/* 主机设置为推挽输出*/ds18b20->SetPinMode(DS18B20_Out);/* 主机至少产生480us 的低电平复位信号*/ds18b20->SetBit(DS18B20_Reset);ds18b20->Delayus(550);/* 主机在产生复位信号后,需将总线拉高*/ds18b20->SetBit(DS18B20_Set);/*从机接收到主机的复位信号后,会在15~60us 后给主机发一个存在脉冲*/ds18b20->Delayus(15);
}/*检测从机给主机返回的存在脉冲 0:成功;1:失败*/
static uint8_t PresenceDs18b20(Ds18b20ObjectType *ds18b20)
{uint8_t pulse_time = 0;/* 主机设置为上拉输入*/ds18b20->SetPinMode(DS18B20_In);/* 等待存在脉冲的到来,存在脉冲为一个60~240us 的低电平信号*//*如果存在脉冲没有来则做超时处理,从机接收到主机的复位信号后,会在15~60us 后给主机发一个存在脉冲*/while( ds18b20->GetBit() && pulse_time<100 ){pulse_time++;ds18b20->Delayus(1);}/* 经过100us 后,存在脉冲都还没有到来*/if( pulse_time >=100 )return 1;elsepulse_time = 0;/* 存在脉冲到来,且存在的时间不能超过240us*/while(!ds18b20->GetBit() && (pulse_time<240)){pulse_time++;ds18b20->Delayus(1);}if( pulse_time >=240 ){return 1;}else{return 0;}
}

2.2.2、写操作

主机写DS18B20有两种类型的写时时段:“写1”时间段和“写0”时间段。总线主机使用一个写1时间段来将逻辑1写入DS18B20,而一个写0时间段来将逻辑0写入DS18B20。所有写时段必须至少60µs持续时间与个人之间的最小1µs复苏的时间写插槽。两种类型的写时间段都是由主控器将单线总线拉低来启动的。其操作时序如下图:

 

我们可以总结其操作过程如下:

(1) 数据线先置低电平“0”。

(2) 延时确定的时间为15微秒。

(3) 按从低位到高位的顺序发送字节(一次只发送一位)。

(4) 延时时间为45微秒。

(5) 将数据线拉到高电平。

(6) 重复上(1)到(6)的操作直到所有的字节全部发送完为止。

(7) 最后将数据线拉高。

/*向DS18B20写一个字节*/
static void WriteByteToDs1820(Ds18b20ObjectType *ds18b20,uint8_t commond)
{uint8_t i, testb;ds18b20->SetPinMode(DS18B20_Out);for(i=0; i<8; i++){testb = commond&0x01;commond = commond>>1;// 写0和写1的时间至少要大于60usif (testb){ds18b20->SetBit(DS18B20_Reset);// 1us < 这个延时 < 15usds18b20->Delayus(10);ds18b20->SetBit(DS18B20_Set);ds18b20->Delayus(45);}else{ds18b20->SetBit(DS18B20_Reset);// 60us < Tx 0 < 120usds18b20->Delayus(60);ds18b20->SetBit(DS18B20_Set);// 1us < Trec(恢复时间) < 无穷大}ds18b20->Delayus(2);}
}

2.2.3、读操作

DS18B20只能在主机发出读时段时将数据传输给主机。因此,主控机必须在发出read Scratchpad [BEh]或read Power Supply [B4h]命令后立即生成都时间段,以便DS18B20能够提供所请求的数据。另外,在发出Convert T [44h]或Recall E2 [B8h]命令后,主机可以生成读时间段,以查看操作的状态,具体操作如下列时序图:

 

对上述描述和时序图我们可以得到相关的读操作步骤:

(1)将数据线拉高“1”。

(2)延时2微秒。

(3)将数据线拉低“0”。

(4)延时3微秒。

(5)将数据线拉高“1”。

(6)延时5微秒。

(7)读数据线的状态得到1个状态位,并进行数据处理。

(8)延时60微秒。

/*从DS18B20读取一个位,返回值:1/0*/
static uint8_t ReadBitFromDs18b20(Ds18b20ObjectType *ds18b20)
{uint8_t data;ds18b20->SetPinMode(DS18B20_Out);ds18b20->SetBit(DS18B20_Reset);ds18b20->Delayus(2);ds18b20->SetBit(DS18B20_Set);ds18b20->SetPinMode(DS18B20_In);ds18b20->Delayus(12);data=ds18b20->GetBit();ds18b20->Delayus(50);return data;
}

3、驱动的使用

我们已经设计并实现了DS18B20温度传感器的驱动程序。我们还需要基于这一驱动程序设计一个简单的应用来验证其是否正确。

3.1、声明并初始化对象

使用基于对象的操作我们需要先得到这个对象,所以我们先要使用前面定义的DS18B20温度传感器对象类型声明一个DS18B20温度传感器对象变量,具体操作格式如下:

Ds18b20ObjectType ds18b20;

我们虽然声明了这个对象变量,但还不能立即使用。我们还需要使用驱动中定义的初始化函数对这个变量进行初始化。这个初始化函数所需要的输入参数如下:

Ds18b20ObjectType *ds18b20,被初始化的对象变量

Ds18b20SetBitType setBit,向总线写一位操作

Ds18b20GetBitType getBit,从总线读一位操作

Ds18b20SetPinModeType pinDirection,总线输入输出模式控制

Ds18b20DelayType delayus,为秒延时操作

对于这些参数,对象变量我们已经定义了。主要的是我们需要定义几个函数,并将函数指针作为参数。这几个函数的类型如下:

/*写数据位到DS18B20*/
typedef void (*Ds18b20SetBitType)(Ds18b20PinValueType vBit);/*从DS18B20读取一位数据*/
typedef uint8_t (*Ds18b20GetBitType)(void);/*设置DS18B20的数据引脚的输入输出模式*/
typedef void (*Ds18b20SetPinModeType)(Ds18b20IOModeType mode);/* 定义延时操作函数指针类型 */
typedef void (*Ds18b20DelayType)(volatile uint32_t nTime);

对于这几个函数我们根据样式定义就可以了,具体的操作可能与使用的硬件平台有关系。具体函数定义如下:

//设置DS18B20引脚的输出值void Ds18b20SetPinOutValue(Ds18b20PinValueType setValue){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_11,(GPIO_PinState)setValue);}//读取引脚电平uint8_t Ds18b20ReadPinBit(void){return (uint8_t)HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11);}//设置引脚的输入输出方向
void Ds18b20SetPinMode(Ds18b20IOModeType mode)
{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin = GPIO_PIN_11;if(mode==DS18B20_In){  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;}else{  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;}  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

对于延时函数我们可以采用各种方法实现。我们采用的STM32平台和HAL库则可以直接使用HAL_Delay()函数。于是我们可以调用初始化函数如下:

Ds18b20Initialization(&ds18b20,Ds18b20SetPinOutValue,Ds18b20ReadPinBit,Ds18b20SetPinMode,Delayus);

3.2、基于对象进行操作

我们定义了对象变量并使用初始化函数给其作了初始化。接着我们就来考虑操作这一对象获取我们想要的数据。我们在驱动中已经将获取数据并转换为转换值的比例值,接下来我们使用这一驱动开发我们的应用实例。

/*获取数据值*/
void GetMeasureDataFromDHT11(void)
{float temperature; //温度值GetDS18b20TemperatureValue(&ds18b20);temperature=ds18b20.temperature;
}

4、应用总结

我们实现了DS18B20温度传感器的驱动程序,并基于这一驱动程序设计了简单的应用程序。我们也成功获得了温度数据,充分说明我们的驱动设计是正确的。事实上,在我们的项目中多次使用DS18B20温度传感器,这一驱动也是多次被使用到,结果令人满意。

单总线数据传输时,会改变总线的输入输出方向。在我们的应用中,我们修改了对应GPIO引脚的输入输出模式。事实上如果我们在STM32中使用时,我们可将该引脚配置为开漏输出模式,加上总线的上拉电阻,可以在不修改GPIO的输入输出模式的情况下实现读写。

使用驱动时需要注意,本驱动程序只考虑了总线上只有一个DS18B20的情况。在一条总线上有多个DS18B20温度传感器时,当前的驱动程序是不能够实现操作的,需要对驱动作相应修改。

欢迎关注:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Modbus协议栈应用实例之五:Modbus ASCII主站应用

自从开源了我们自己开发的Modbus协议栈之后&#xff0c;有很多朋友建议我针对性的做几个示例。所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例&#xff0c;这一篇中我们来使用协议栈实现Modbus ASCII主站应用。 1、何为ASCII主站 我们知道Modbus…

Modbus协议栈应用实例之六:Modbus ASCII从站应用

自从开源了我们自己开发的Modbus协议栈之后&#xff0c;有很多朋友建议我针对性的做几个示例。所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例&#xff0c;这一篇中我们来使用协议栈实现Modbus ASCII从站应用。 1、何为ASCII从站 我们知道Modbus…

外设驱动库开发笔记15:DHT11温湿度传感器驱动

与DS18B20一样DHT11也是采用单总线&#xff0c;但所不同的是DHT11可同时实现温度和湿度的检测。在我们的产品中经常使用它来检测环境的温湿度信息。这一篇我们将设计并封装DHT11的驱动程序&#xff0c;以方便重复使用。 1、功能概述 DHT11数字温湿度传感器是一款含有已校准数…

外设驱动库开发笔记16:MS5536C压力变送器驱动

压力检测也是经常会遇到的需求&#xff0c;比如环境压力或者低压气体等都会用到压力检测。这类检测压力都比较低&#xff0c;一般不会超过大气压&#xff0c;有时甚至是负压。这一篇我们要讨论的MS5536C就属于这类器件。接下来我们将设计并实现MS5536C的驱动。 1、功能概述 M…

外设驱动库开发笔记17:MS5803压力变送器驱动

很多时候我们需要检测被控对象的绝对压力&#xff0c;而且在我们的多款产品中也有这样的需求。当然检测绝对压力的传感器有很多&#xff0c;我们经常使用MS5803来实现压力检测。本篇中我们将设计并实现MS5803系列压力传感器的驱动。 1、功能概述 MS5803系列产品包含压阻传感器…

通讯接口应用笔记1:RS485通讯上下拉电阻的选择

RS485是一种常见的通讯接口方式&#xff0c;在我们的实际产品中也是多次使用。但我们平常并不会去过多考虑某一实现的细节问题&#xff0c;不过最近我们遇到了一个因如上下拉电阻的选择问题而造成的通讯故障&#xff0c;所以在这一片中我们来讨论一下RS485总线上下拉电阻的选择…

外设驱动库开发笔记18:MS5837压力变送器驱动

绝对压力的检测是常见的需求。在我们的系统中也常常会遇到。而MS5837压力传感器也是我们进场会采用的方案。在这篇里我们将讨论并实现MS5837压力传感器的驱动。 1、功能概述 MS5837压力传感器是一种可用于电路板上&#xff0c;适用于检测10-1200mbar压力范围的传感器&#xf…

外设驱动库开发笔记19:BMP280压力温度传感器驱动

压力和温度监测在嵌入式系统开发中是非常常见的需求&#xff0c;特别是对环境大气压力和温度的检测需求就更常见了。我们一般都会选择一些封装较小操作比较方便的压力传感器。BMP280就是满足这一要求的器件。在这一篇中我们将设计并实现BMP280的驱动。 1、功能概述 BMP280是一…

一个简单的空气质量数据监测站项目

大气质量数据监测站用于测试空气质量监测及数据采集&#xff0c;实现野外或者室内空气质量的检测。并通过网络将数据上传到OneNet​显示。​ 1、项目概述 本项目是一个定制项目&#xff0c;要求采集大气的压力、温度、湿度、PM25、位置等数据并上传到指定的后台服务器。但有时…

一个基于STM32实现的多组分气体分析仪项目

本篇将简要的总结一下一个基于STM32F412ZG实现的多组分气体分析仪的项目。简要描述该项目的软硬件设计及其验证。 一、项目概述 多组分气体分析仪是我公司近期研发的三个主要产品之一。采用模块化设计&#xff0c;可增减配置&#xff0c;可分析混合气体中的氧气、氢气、甲烷、…

外设驱动库开发笔记20:BME280压力湿度温度传感器驱动

嵌入式产品开发中&#xff0c;我们常常会有检测环境温度、压力、湿度的需求。如果有一个集成有这3个传感器的元件&#xff0c;无疑将是很方便的。博世的BME280就能实现这一要求。在这一篇中我们将讨论BME280的驱动设计与实现。 1、功能概述 BME280是一款专为移动应用而开发的…

外设驱动库开发笔记21:BME680环境传感器驱动

环境传感器是一类我们很常用的传感器。它可以方便我们获取压力、温度、湿度以及空气质量等数据。在这一篇中&#xff0c;我们将分析BME680环境传感器的功能&#xff0c;并设计和实现BME680环境传感器的驱动。 1、功能概述 BME680是一款专为移动应用和可穿戴设备开发的集成环境…

外设驱动库开发笔记22:ADXL345三轴数字加速度计驱动

移动设备的广泛应用增加对移动过程中各种参数的检测需求。ADXL345三轴数字加速度计可以用来检测加速度、进而测量倾斜角度等。在这一篇中&#xff0c;我们将讨论ADXL345三轴数字加速度计驱动程序的设计与实现。 1、功能概述 ADXL345是一款小而薄的超低功耗3轴加速度计&#x…

外设驱动库开发笔记23:AT24Cxx外部存储器驱动

在我们的应用开发过程中&#xff0c;经常会使用到外部的EEPROM外部存储器来保存一些参数和配置数据等。而比较常用的就是AT24Cxx系列产品&#xff0c;这一节我们来开发用于操作AT24Cxx系列产品的驱动。 1、功能概述 AT24Cxx系列EEPROM包括从1Kbit到2Mbit的各种容量。AT24Cxx系…

外设驱动库开发笔记24:FM24xxx系列FRAM存储器驱动

虽然说使用EEPROM保存参数很有效&#xff0c;但操作及使用次数均有一下限制。当我们的一些参数需要不定时修改或存储时&#xff0c;使用FRAM就更为方便一点。这一节我们就来设计并实现FM24xxx系列FRAM的驱动。 1、功能概述 我们首先说一下铁电随机存取存储器&#xff0c;F-RA…

外设驱动库开发笔记25:FM25xxx FRAM存储器驱动

在我们的项目中&#xff0c;时常会有参数或数据需要保存。铁电存储器的优良性能和操作方便常常被我们选用。FM25xxx FRAM存储器就是我们经常使用到的一系列铁电存储器&#xff0c;这一篇我们将讨论FM25xxx FRAM存储器的驱动设计、实现及使用。 1、功能概述 FM25xxx FRAM存储器…

步进电机驱动技术1:基于TMC2660的步进电机驱动

步进电机的应用非常广泛&#xff0c;在各种设备中经常会遇到&#xff0c;而步进电机的驱动则是使用步进电机必不可少的部分&#xff0c;可以有多种方式来实现步进电机的驱动&#xff0c;在这里我们来考虑一下基于TMC2660驱动芯片的步进电机驱动。 1、功能概述 TMC2660是德国T…

外设驱动库开发笔记26:nRF24L01无线通讯驱动

现在无线在我们的生活中无处不在。而我们开发的物联网产品也大量使用无线通讯。在这一篇文章中&#xff0c;我们将讨论nRF24L01无线通讯模块驱动程序的开发与实现。 1、功能概述 nRF24L01是一款工作在2.4~2.5GHz世界通用ISM 频段的单片无线收发器芯片无线收发器包括&#xff…

外设驱动库开发笔记27:ESP8266无线通讯驱动

我们的物联网产品所使用的平台都支持无线通讯&#xff0c;而且无线通讯本身更的成本较低&#xff0c;受到大家的欢迎。在本篇文章中&#xff0c;我们将详细讨论并实现ESP8266无线通讯模块的驱动。 1、功能概述 ESP8266是由乐鑫公司出品的一款物联网芯片&#xff0c;因为价格较…

外设驱动库开发笔记28:W5500以太网控制器

以太网通讯是一种被广泛使用的数据通讯方式。在嵌入式应用中也经常使用&#xff0c;但协议栈的实现并不是一件容易的事。不过有些以太网控制器就带有协议栈&#xff0c;如W5500。在本篇中我们将讨论如何设计并实现W5500以太网控制器的驱动。 1、功能概述 W5500是WIZnet开发的…