📄 ds1820drv.c
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DS1820温度传感器驱动程序
//
// 说明:
// 所有函数名都以 DS1820_ 开头, 例如: DS1820_Main_Run();
// 所有变量都包括 TempeSen , 例如 chTempeSenState
// 所有常量名都以 TEMPESEN 开头, 例如 TEMPESENChannelPort
// 所有的宏定义都以 TEMPESEN_ 开头, 例如 TEMPESEN_FAMILY_CODE
//
// 温度传感器的序号按先列后排的顺序排列, 001列01排, 001列02排, 001列03排...... 001列12排, 002列01排, 002列02排
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "msp430x14x.h"
#include "main.h"
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
//from debug.c
extern void InsertDebugSendBuf(unsigned char *pData, unsigned int intLen);
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
#define Mark_FF 255
#define Mark_00 0
//////////////////////////////////////////////////常量定义//////////////////////////////////////////////////////////////////////
//2003-1-4 13:07 cyh
//通道 01--12 与 物理口的关系!
//TTL7--TTL19 DB62的12--21 。。。 TTL7 为 特通道
//各个通道端口地址 ---不会改变!
const unsigned int MCUPortDIR[] = {0, P1DIR_, P2DIR_, P3DIR_, P4DIR_, P5DIR_, P6DIR_};
const unsigned int MCUPortOUT[] = {0, P1OUT_, P2OUT_, P3OUT_, P4OUT_, P5OUT_, P6OUT_};
const unsigned int MCUPortIN[] = {0, P1IN_, P2IN_, P3IN_, P4IN_, P5IN_, P6IN_};
//////////////////////////////////////变量定义/////////////////////////////////////////////////////////
////////////////////////////////////函数声明////////////////////////////////////////////////////////////////
unsigned char DS1820_Read_Byte_MultiChannel(unsigned char chMCUPort, unsigned int DataBit);
void DS1820_Write_Byte_MultiChannel(unsigned char chMCUPort, unsigned int DataBit, unsigned char val);
unsigned char DS1820_Reset_MultiChannel(unsigned char chMCUPort, unsigned int DataBit);
void DS1820_Write_Reg_MultiChannel(unsigned char chMCUPort, unsigned int DataBit);
void DS1820_StartConvert_MultiChannel(unsigned char chMCUPort, unsigned int DataBit);
//读 板上温度
unsigned char DS1820_Read_Temperature_Board(unsigned char chMCUPort, unsigned int DataBit);
////////////////////////////////////供外部调用的函数/////////////////////////////////////////////////////////////////////
void DS1820_Init(void);
void DS1820_Read_ID_MultiChannel(unsigned char chMCUPort, unsigned char DataBit, unsigned char *pDS1820ID);
void DS1820_Read_ID_MultiChannel(unsigned char chMCUPort, unsigned char DataBit, unsigned char *pDS1820ID);
///////////////////////////////////内部使用的功能型性函数////////////////////////////////////////////////////////////////////////////////////////////////
//功能: 延时, DS1820_Delay(1000)<--->2500us, DS1820_Delay(400)<--->800us, DS1820_Delay(10)<--->25us => DS1820_Delay(1)<--->2.5us
//参数: useconds : 延时记数
//返回: 无
void DS1820_Delay(long int useconds)
{
for( ; useconds > 0; useconds--);
}
//功能: 温度传感器初始化,将所有温度传感器的ID写入Flash Memory
//参数: 无
//返回: 无
void DS1820_Init(void)
{
//门的ID 号的 初始化
if(*(unsigned char *)(FLASHMEM_Seg_DoorAddr + 511) == 0xFF)
{
unsigned int i;
// //写段之前先关闭看门狗和中断-------目前在 开中断之前 调用
// WDTCTL = WDTPW + WDTHOLD;
// _DINT();
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*(unsigned char *)(FLASHMEM_Seg_DoorAddr) = 0; // Dummy write to erase Flash segment B
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i = 0; i < 512; i++)
{
*(unsigned char *)(FLASHMEM_Seg_DoorAddr + i) = '0';
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Reset LOCK bit
// //恢复看门狗和中断
// _EINT();
// WDTCTL = WDT_ARST_1000;
}
}
////////////////////////////////////DS1820温度传感器驱动函数模块----用于多通道//////////////////////////////////////////////////////////////////
//功能: 读一个字节
//参数: chMCUPort : 通道所在MCU上的端口号
// DataBit : 数据位线
//返回: 读取到的字节
unsigned char DS1820_Read_Byte_MultiChannel(unsigned char chMCUPort, unsigned int DataBit)
{
unsigned int *PXDIR;
unsigned int *PXOUT;
unsigned int *PXIN;
unsigned char i, value = 0x01;
PXDIR = (unsigned int *)MCUPortDIR[chMCUPort];
PXOUT = (unsigned int *)MCUPortOUT[chMCUPort];
PXIN = (unsigned int *)MCUPortIN[chMCUPort];
_DINT();
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗定时器
//读取字节数据的各个位, 先读低位, 再读高位
for (i = 0; i < 8; i++)
{
value >>= 1;
//先将数据线至少拉 "低" 1us
(*PXOUT) &= ~DataBit;
(*PXDIR) |= DataBit;
_NOP(); _NOP(); _NOP(); //拉低5us
_NOP(); _NOP(); _NOP();
_NOP(); _NOP(); _NOP();
_NOP(); _NOP(); _NOP();
_NOP(); _NOP(); _NOP();
//读取数据位,延时 60us--120us
(*PXDIR) &= ~DataBit;
_NOP(); _NOP(); _NOP(); //再等待5us后再读
_NOP(); _NOP(); _NOP();
_NOP(); _NOP(); _NOP();
_NOP(); _NOP(); _NOP();
_NOP(); _NOP(); _NOP();
if ( (*PXIN) & DataBit )
{
value |= 0x80;
}
_NOP(); _NOP(); _NOP(); //持续位状态
//恢复数据线, 正常时为 "高"
(*PXDIR) |= DataBit;
(*PXOUT) |= DataBit;
DS1820_Delay(36); //90us
}
_EINT();
WDTCTL = WDT_ARST_1000;
DS1820_Delay(36); // 90us
return(value);
}
//功能: 写一个字节
//参数: chMCUPort : 通道所在MCU上的端口号
// DataBit : 数据位线
// val : 要写的字节, 0--255
//返回: 无
void DS1820_Write_Byte_MultiChannel(unsigned char chMCUPort, unsigned int DataBit, unsigned char val)
{
unsigned int *PXDIR;
unsigned int *PXOUT;
unsigned int *PXIN;
unsigned char i;
PXDIR = (unsigned int *)MCUPortDIR[chMCUPort];
PXOUT = (unsigned int *)MCUPortOUT[chMCUPort];
PXIN = (unsigned int *)MCUPortIN[chMCUPort];
_DINT();
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗定时器
//写字节数据各个位, 先写低位,再写高位
for (i = 0; i < 8; i++)
{
//先将数据线至少拉 "低" 1us
(*PXOUT) &= ~DataBit;
(*PXDIR) |= DataBit;
_NOP(); _NOP(); _NOP(); //拉低10us, 3个_NOP() 占1us
_NOP(); _NOP(); _NOP();
_NOP(); _NOP(); _NOP();
_NOP(); _NOP(); _NOP();
_NOP(); _NOP(); _NOP();
_NOP(); _NOP(); _NOP();
_NOP(); _NOP(); _NOP();
_NOP(); _NOP(); _NOP();
_NOP(); _NOP(); _NOP();
_NOP(); _NOP(); _NOP();
//写取数据位,延时 60us--120us
if(val & 0x01)
{
(*PXOUT) |= DataBit;
DS1820_Delay(10); //持续30us
}
else
{
(*PXOUT) &= ~DataBit;
}
DS1820_Delay(38); //写持续100us
//恢复数据线, 正常时为 "高"
(*PXOUT) |= DataBit;
DS1820_Delay(10); //恢复持续30us
val >>= 1;
}
_EINT();
WDTCTL = WDT_ARST_1000;
}
//功能: 对某个通道上的所有温度传感器复位, 总计大约 833us
//参数: chMCUPort : 通道所在MCU上的端口号
// DataBit : 数据位线
//返回: 0 : 复位成功; 否则 : 复位失败
unsigned char DS1820_Reset_MultiChannel(unsigned char chMCUPort, unsigned int DataBit)
{
unsigned int *PXDIR;
unsigned int *PXOUT;
unsigned int *PXIN;
unsigned char chRslt,chValue = 255;
PXDIR = (unsigned int *)MCUPortDIR[chMCUPort];
PXOUT = (unsigned int *)MCUPortOUT[chMCUPort];
PXIN = (unsigned int *)MCUPortIN[chMCUPort];
DS1820_Delay(300); //about delay 750 us
_DINT();
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗定时器
//将数据线拉 "低", 480--960us
(*PXOUT) &= ~DataBit;
(*PXDIR) |= DataBit;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -