接https://blog.csdn.net/pxy198831/article/details/98038695,
MAX31826是一款单总线的温度传感器,带有1K EEPROM驱动如下:
/******************************************************************************
* 文 件 名 称:BspMAX31826.c
* 文件功能概述:实现MAX31826接口声明
* 文 件 作 者:xxx
* 版 本:V1.0.0.0
* 修 订 记 录:2017-6-30创建
2019-2-14修订 潘星宇 添加搜索ROM ID功能
******************************************************************************/
#include "BspMAX31826.h"
#include "PeripheralPollTask.h" //之所以#include "PeripheralPollTask.h"不放在头文件是因为该头文件调用了"BspMAX31826.h"的一个枚举定义
//如果放在"BspMAX31826.h"中也要放到该枚举定义的后面
#define MAX31826DelayUs(x) DelayUs(x)
typedef struct
{
uint8 IdCode[8];
}S_Max31826IdCode;
S_Max31826IdCode stMax31826IdCode[E_MAX31826_Max]=
{
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
};
static E_OWx stMax31826Ow[E_MAX31826_Max] = {E_OW_1,E_OW_DYDY,E_OW_GYDY,E_OW_MB,E_OW_BB};
//全局搜索变量
static uint8 stROM_NO[8]; //数组,存放本次搜索到的ROM码(8个字节)
static uint8 LastDiscrepancy; //每轮搜索后指向最后一个走0的差异位
static uint8 LastFamilyDiscrepancy; //指向家族码(前8位)中最后一个走0的差异位
static uint8 LastDeviceFlag; //搜到最后一个ROM后,程序通过判别将该变量置TRUE,下轮搜索时即会结束退出
//uint8 crc8_status; //CRC校验结果
uint8 OWSearch(E_MAX31826 eMax31826);
uint8 OWFirst(E_MAX31826 eMax31826);
uint8 OWNext(E_MAX31826 eMax31826);
uint8 OWVerify(E_MAX31826 eMax31826);
void MAX31826_GPIO_Init(void)
{
GPIO_InitTypeDef s_GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOI , ENABLE);/* 使能GPIOB&GPIOC&GPIOD时钟*/
s_GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_3;
s_GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
s_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOA, &s_GPIO_InitStructure);
s_GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
s_GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
s_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOI, &s_GPIO_InitStructure);
}
/*******************************************************************************
* 函 数 名:static void MAX31826DelayUs(uint16 Us)
* 参 数:uint16 Us : 延时单位
* 返 回:无
* 创 建 人:xxx
* 创建时间:2017-6-30
* 详 述:MAX31826使用的延时函数
* 修改记录:2017-6-30创建
*******************************************************************************/
//static void MAX31826DelayUs(uint16 Us)
//{
// uint16 i=0,j=0;
//
// for(j=0; j<Us; j++)
// {
// for(i=0; i<21; i++)
// {
// }
// }
//
//}
/*******************************************************************************
* 函 数 名:static sint8 MAX31826ReadRom(uint8 *pdata)
* 参 数:E_MAX31826 eMax31826: 选择对应的器件
* uint8 *pdata: 存储序列码的数据地址
* 返 回:0 成功
* -1 失败
* 创 建 人:xxx
* 创建时间:2017-6-30
* 详 述:获取max31826的max31826的序列码
* 修改记录:2017-6-30创建
*******************************************************************************/
static sint8 MAX31826ReadRom(E_MAX31826 eMax31826, uint8 *pdata)
{
uint8 data[8]={0, 0, 0, 0, 0, 0, 0, 0};
if(OneWireReset(stMax31826Ow[eMax31826]) == 0)
{
OneWireWriteByte(stMax31826Ow[eMax31826],MAX31826_READ_ROM);
data[0] = OneWireReadByte(stMax31826Ow[eMax31826]);
data[1] = OneWireReadByte(stMax31826Ow[eMax31826]);
data[2] = OneWireReadByte(stMax31826Ow[eMax31826]);
data[3] = OneWireReadByte(stMax31826Ow[eMax31826]);
data[4] = OneWireReadByte(stMax31826Ow[eMax31826]);
data[5] = OneWireReadByte(stMax31826Ow[eMax31826]);
data[6] = OneWireReadByte(stMax31826Ow[eMax31826]);
data[7] = OneWireReadByte(stMax31826Ow[eMax31826]);
if(data[7] == crc8(data,7))
{
if(data[0] == MAX31826_FAMILYCODE)
{
memcpy(pdata, data, 8);
return 0;
}
else
{
return -1;
}
}
else
{
return -1;
}
}
return -1;
}
/*******************************************************************************
* 函 数 名:static sint8 MAX31826SerchRom(uint8 *pdata)
* 参 数:E_MAX31826 eMax31826: 选择对应的器件
* uint8 *pdata: 存储序列码的数据地址
* 返 回:0 成功
* -1 失败
* 创 建 人:潘星宇
* 创建时间:2019-2-13
* 详 述:搜索max31826的ROM序列码
* 修改记录:2019-2-13创建
*******************************************************************************/
static sint8 MAX31826SerchRom(E_MAX31826 eMax31826, uint8 *pdata)
{
uint8 data[8]={0, 0, 0, 0, 0, 0, 0, 0};
uint8 i;
if(OneWireReset(stMax31826Ow[eMax31826]) == 0)
{
//目前单总线仅挂接至多2个1-WIRE设备,先不用FOR循环
if((eMax31826 == E_MAX31826_DYDY) || (eMax31826 == E_MAX31826_MB))
{
//每根总线第一次查询,第一次查询到的ID号和第二次查询到的器件不一定在条件中的板件位置,因为二叉路径选择具有随机性
if((TRUE == OWFirst((E_MAX31826)stMax31826Ow[eMax31826])) &&
(TRUE == OWVerify((E_MAX31826)stMax31826Ow[eMax31826])))
{
for(i = 0; i < 8; i++)
{
data[i] = stROM_NO[i];
}
}
else
{
return -1;
}
}
else
{
//每根总线第二次查询
if((TRUE == OWNext((E_MAX31826)stMax31826Ow[eMax31826])) &&
(TRUE == OWVerify((E_MAX31826)stMax31826Ow[eMax31826])))
{
for(i = 0; i < 8; i++)
{
data[i] = stROM_NO[i];
}
}
else
{
return -1;
}
}
//两次查询到ROM ID号之后要进行CRC校验
if(data[7] == crc8(data,7))
{
if(data[0] == MAX31826_FAMILYCODE)
{
memcpy(pdata, data, 8);
}
else
{
return -1;
}
}
else
{
return -1;
}
}
else
{
}
return -1;
}
/*******************************************************************************
* 函 数 名:static sint8 MAX31826SerchRom(uint8 *pdata)
* 参 数:E_MAX31826 eMax31826: 选择对应的器件
* 返 回:0 成功
* -1 失败
* 创 建 人:潘星宇
* 创建时间:2019-2-14
* 详 述:匹配max31826的ROM序列码
* 修改记录:2019-2-14创建
*******************************************************************************/
sint8 MAX31826MatchROM(E_MAX31826 eMax31826)
{
uint8_t i,j;
uint8 data[9]={0};
uint8 address = 0xff;
for(i = 0; i<E_MAX31826_Max ; i++)
{
//复位
if(OneWireReset(stMax31826Ow[eMax31826]) == 0)
{
//发送ROM匹配命令
OneWireWriteByte(stMax31826Ow[eMax31826],MAX31826_MATCH_ROM);
//发送64位ROM地址
for(j = 0; j < 8; j++)
{
OneWireWriteByte(