STM32之MAX31826驱动

https://blog.youkuaiyun.com/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_R
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值