⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dewire_.c

📁 单片机与pc机通讯例程的mcu部分
💻 C
字号:
#include "Def_.h"


/*----------------------------------------------------
ONE Wire器件DS2406的操作
----------------------------------------------------*/
BOOL InitWire(void)
/*
ONE Wire总线的初始化
*/
{
U08 i;
BOOL result;
	PDallasWire = 0;
	TL2 = 0;
	for(i=0;i<4;i++)
	{
		while(TL2 < 220);	/*	120us	*/
		TL2 = 0;
	}

	PDallasWire = 1;
	TL2 = 0;
	while(TL2 < 248);	/*	135us	*/

	if(1 ==	PDallasWire)
		result = FALSE;
	else
		result = TRUE;

	TL2 = 0;
	for(i=0;i<4;i++)
	{
		while(TL2 < 220);	/*	120us	*/
		TL2 = 0;
	}
	TL2 = 0;
	while(TL2 < 36);	/*	20us	*/

	return result;
}

void WireWrBit(BOOL sw)
/*
ONE Wire的写入一个bit
*/
{
	PDallasWire = 0;
	TL2 = 0;
	if(sw)
	{
		while(TL2 < 11);	/*	6us	*/
		PDallasWire = 1;
		TL2 = 0;
		while(TL2 < 118);	/*	64us	*/
	}
	else
	{
		while(TL2 < 110);	/*	60us	*/
		PDallasWire = 1;
		TL2 = 0;
		while(TL2 < 18);	/*	10us	*/
	}
}

BOOL WireRdBit(void)
/*
ONE Wire的读取一个bit
*/
{
BOOL result;
	PDallasWire = 0;
	TL2 = 0;
	while(TL2 < 11);	/*	6us		*/
	PDallasWire = 1;
	TL2 = 0;
	while(TL2 < 16);	/*	9us		*/
	if(PDallasWire)	result = 1;
	else			result = 0;
	TL2 = 0;
	while(TL2 < 101);	/*	55us	*/

	return result;
}


void DallasProgram(void)
/*
对写入的字节进行编程
*/
{
U08 loop;
	DALLAS_PROG_1;
	TL2 = 0;
	for(loop=0; loop<4; loop++)
	{
		while(TL2 < 220);	/*	120us	*/
		TL2 = 0;
	}
	DALLAS_PROG_0;
}


void WireWrByte(U08 datas)
/*
写入一个byte
*/
{
U08 i;
	for(i=0;i<8;i++)
	{
		WireWrBit(datas & 0x01);
		datas >>= 1;
	}
}

U08 WireRdByte(void)
/*
读取一个byte
*/
{
U08 i;
U08 rdTemp;

	for(i=0;i<8;i++)
	{
		rdTemp >>= 1;
		if(WireRdBit())
			rdTemp |= 0x80;
	}
	return rdTemp;
}

void WireSetAddr(U16 addr)
/*
设置地址
*/
{
	WireWrByte(addr&0xff);
	WireWrByte(addr>>8);
}

void ReadU16Crc(void)
/*
读取16位的crc校验码
*/
{
	CrcU16RdDat = WireRdByte();
	CrcU16RdDat += (U16)(WireRdByte()<<8);
}

BOOL WirePreFunc(U08 funcCommand)
/*
ONE Wire器件功能命令
*/
{
BOOL result;
	ClrBit(IE,7);
	if(! InitWire())
		result = FALSE;
	else
	{
		WireWrByte(funcCommand);
		result = TRUE;
	}
	SetBit(IE,7);
	return result;
}

#if USE_WIRE_RD_SN
BOOL WireRdSn(U08 snBuff[],U08 snBuffLen)
/*
读取序列号,8位数组
*/
{
BOOL result;
U08 loop;
	if(! WirePreFunc(READ_ROM_COMMAND))
		result = FALSE;
	else
	{
		ClrBit(IE,7);

		for(loop=0; loop<snBuffLen; loop++)
			snBuff[loop] = WireRdByte();

		SetBit(IE,7);

		CrcU08RdDat = snBuff[snBuffLen-1];
		CrcU08MyDat = 0;
		for(loop=0; loop<(snBuffLen-1); loop++)
			Crc8Value(&CrcU08MyDat,snBuff[loop]);
		if(CrcU08MyDat == CrcU08RdDat)
			result = TRUE;
		else
			result = FALSE;
	}
	return result;
}
#endif

#if USE_WIRE_RD_STATUS
BOOL WireRdStatus(U08 statBuff[],U08 statBuffLen)
/*
读状态字节
*/
{
BOOL result;
U08 loop;
	if(! WirePreFunc(SKIP_ROM_COMMAND))
		result = FALSE;
	else
	{
		ClrBit(IE,7);
		WireWrByte(READ_STATUS);

		WireSetAddr(0x0000);

		for(loop=0; loop<statBuffLen; loop++)
			statBuff[loop] = WireRdByte();

		ReadU16Crc();

		CrcU16MyDat = 0x0000;
		Crc16Value(&CrcU16MyDat,READ_STATUS);
		Crc16Value(&CrcU16MyDat,0x00);
		Crc16Value(&CrcU16MyDat,0x00);
		for(loop=0; loop<8; loop++)
			Crc16Value(&CrcU16MyDat,statBuff[loop]);

		SetBit(IE,7);

		if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
			result = TRUE;
		else
			result = FALSE;
	}
	return result;
}
#endif

#if USE_WIRE_WR_STATUS
BOOL WireWrStatus(U08 dat,U16 address)
/*
写状态字节,每次写一个,地址只能为0,1,2,3,4,7
当地址为7时可能返回错误,但是已经写进去,因为读出的校验与本身器件有关
*/
{
BOOL result = TRUE;
U08 recByte;
	if(! WirePreFunc(SKIP_ROM_COMMAND))
		result = FALSE;
	else
	{
		ClrBit(IE,7);

		WireWrByte(WRITE_STATUS);
		WireSetAddr(address);
		WireWrByte(dat);
		ReadU16Crc();

		CrcU16MyDat = 0x0000;
		Crc16Value(&CrcU16MyDat,WRITE_STATUS);
		Crc16Value(&CrcU16MyDat,address&0xff);
		Crc16Value(&CrcU16MyDat,address>>8);
		Crc16Value(&CrcU16MyDat,dat);

		if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
		{
			if(address == 7)	WireWrByte(0xff);
			else				DallasProgram();
			recByte = WireRdByte();
			if(dat == recByte)
				result = TRUE;
			else
				result = FALSE;
		}
		else
		{
			result = FALSE;
		}

		SetBit(IE,7);
	}
	return result;
}
#endif

#if USE_EXT_RD_32BYTE_MEM
BOOL ExtRd32ByteMem(U16 address)
/*
读取32bytes数据
*/
{
BOOL result;
U08 redirectionByte;
U08 loop;
	if(! WirePreFunc(SKIP_ROM_COMMAND))
		result = FALSE;
	else
	{
		ClrBit(IE,7);

		WireWrByte(EXT_READ_MEMORY);

		WireSetAddr(address);

		redirectionByte = WireRdByte();

		ReadU16Crc();

		CrcU16MyDat = 0;
		Crc16Value(&CrcU16MyDat,EXT_READ_MEMORY);
		Crc16Value(&CrcU16MyDat,address&0xff);
		Crc16Value(&CrcU16MyDat,address>>8);
		Crc16Value(&CrcU16MyDat,redirectionByte);

		if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
		{
			CrcU16MyDat = 0x0000;
			for(loop=0; loop<DALLAS_REC_BUFF_MAX; loop++)
			{
				DallasRecBuff[loop] = WireRdByte();
				Crc16Value(&CrcU16MyDat,DallasRecBuff[loop]);
			}

			ReadU16Crc();

			if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
				result = TRUE;
			else
				result = FALSE;
		}
		else
		{
			result = FALSE;
		}

		SetBit(IE,7);
	}
	return result;
}
#endif

#if USE_WR_32BYTE_MEM
BOOL Wr32ByteMem(U16 address,U08 count)
/*
对ds2406写入数个字节进行编程
count < 32
*/
{
BOOL result;
U08 recDat;
U08 loop;
	if(count > 32)	count = 32;

	if(! WirePreFunc(SKIP_ROM_COMMAND))
		result = FALSE;
	else
	{
		ClrBit(IE,7);

		WireWrByte(WRITE_MEMORY);
		WireSetAddr(address);

		CrcU16MyDat = 0x0000;
		Crc16Value(&CrcU16MyDat,WRITE_MEMORY);
		Crc16Value(&CrcU16MyDat,address&0xff);
		Crc16Value(&CrcU16MyDat,address>>8);

		for(loop=0; loop<count; loop++)
		{
			WireWrByte(DallasSendBuff[loop]);

			if(loop > 0)		CrcU16MyDat = address + loop;
			Crc16Value(&CrcU16MyDat,DallasSendBuff[loop]);

			ReadU16Crc();

			if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
			{
				DallasProgram();

				recDat = WireRdByte();
				if(DallasSendBuff[loop] == recDat)
				{
					result = TRUE;
				}
				else
				{
					result = FALSE;
					break;
				}
			}
			else
			{
				result = FALSE;
				break;
			}
		}

		SetBit(IE,7);
	}
	return result;
}
#endif

#if USE_WR_DE_BYTE_MEM
BOOL WrDeByteMem(U08 dat,U16 address)
/*
对ds2406写入一个字节进行编程
*/
{
BOOL result;
U08 recDat;
	if(! WirePreFunc(SKIP_ROM_COMMAND))
		result = FALSE;
	else
	{
		ClrBit(IE,7);

		WireWrByte(WRITE_MEMORY);
		WireSetAddr(address);
		WireWrByte(dat);
		ReadU16Crc();

		CrcU16MyDat = 0x0000;
		Crc16Value(&CrcU16MyDat,WRITE_MEMORY);
		Crc16Value(&CrcU16MyDat,address&0xff);
		Crc16Value(&CrcU16MyDat,address>>8);
		Crc16Value(&CrcU16MyDat,dat);

		if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
		{
			DallasProgram();

			recDat = WireRdByte();
			if(dat == recDat)
				result = TRUE;
			else
				result = FALSE;
		}
		else
		{
			result = FALSE;
		}

		SetBit(IE,7);
	}

	return result;
}
#endif

#if USE_RD_DE_PIO
BOOL RdDePIO(U08 cmd_1,U08 cmd_2,U08 *dat)
/*
读取通道控制字
*/
{
BOOL result;
	if(! WirePreFunc(SKIP_ROM_COMMAND))
		result = FALSE;
	else
	{
		ClrBit(IE,7);

		WireWrByte(CHANNEL_ACCESS);
		WireWrByte(cmd_1);
		WireWrByte(cmd_2);
		*dat = WireRdByte();

		result = TRUE;
		SetBit(IE,7);
	}

	return result;
}
#endif

#if USE_WR_DE_PIO
BOOL WrDePIO(U08 cmd_1,U08 cmd_2,U08 dat)
/*
读取通道控制字
*/
{
BOOL result;
	if(! WirePreFunc(SKIP_ROM_COMMAND))
		result = FALSE;
	else
	{
		ClrBit(IE,7);

		WireWrByte(CHANNEL_ACCESS);
		WireWrByte(cmd_1);
		WireWrByte(cmd_2);
		WireWrByte(dat);

		result = TRUE;
		SetBit(IE,7);
	}

	return result;
}
#endif

#if USE_READ_ROM_SN_TEST
BOOL ReadRomSnTest(void)
/*
读取序列码测试
*/
{
U08 loop;
	ClrBit(IE,7);

	if(! InitWire())
	{
		SetBit(IE,7);
		return FALSE;
	}

	WireWrByte(READ_ROM_COMMAND);
	for(loop=0; loop<8; loop++)
		TempBuff8Byte[loop] = WireRdByte();
	CrcU08MyDat = 0;
	for(loop=0; loop<7; loop++)
		Crc8Value(&CrcU08MyDat,TempBuff8Byte[loop]);

	SetBit(IE,7);
	if(CrcU08MyDat == TempBuff8Byte[7])
		return TRUE;
	else
		return FALSE;
}
#endif

#if USE_EXT_READ_MEM_TEST
BOOL ExtReadMemTest(void)
/*
读取存储器测试
*/
{
U08 redirectionByte;
U08 loop;
BOOL result;
//	if(ReadRomSnTest())
	if(SkipRomTest())
	{
		ClrBit(IE,7);

		WireWrByte(EXT_READ_MEMORY);

		DallasAddr = 0x0000;
		WireSetAddr(DallasAddr);

		redirectionByte = WireRdByte();

		ReadU16Crc();

		CrcU16MyDat = 0;
		Crc16Value(&CrcU16MyDat,EXT_READ_MEMORY);
		Crc16Value(&CrcU16MyDat,DallasAddr&0xff);
		Crc16Value(&CrcU16MyDat,DallasAddr>>8);
		Crc16Value(&CrcU16MyDat,redirectionByte);

		if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
		{
			CrcU16MyDat = 0x0000;
			for(loop=0; loop<DALLAS_REC_BUFF_MAX; loop++)
			{
				DallasRecBuff[loop] = WireRdByte();
				Crc16Value(&CrcU16MyDat,DallasRecBuff[loop]);
			}

			ReadU16Crc();

			SetBit(IE,7);
			if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
				result = TRUE;
			else
				result = FALSE;
		}
		else
		{
			SetBit(IE,7);
			result = FALSE;
		}
	}
	else
	{
		result = FALSE;
	}
	return result;
}
#endif

#if USE_READ_STATUS_TEST
BOOL ReadStatusTest(void)
/*
读取状态信息测试
*/
{
U08 loop;
BOOL result;
	if(ReadRomSnTest())
	{
		ClrBit(IE,7);

		WireWrByte(READ_STATUS);

		DallasAddr = 0x0000;
		WireSetAddr(DallasAddr);

		for(loop=0; loop<8; loop++)
			TempBuff8Byte[loop] = WireRdByte();

		ReadU16Crc();

		CrcU16MyDat = 0x0000;
		Crc16Value(&CrcU16MyDat,READ_STATUS);
		Crc16Value(&CrcU16MyDat,DallasAddr&0xff);
		Crc16Value(&CrcU16MyDat,DallasAddr>>8);
		for(loop=0; loop<8; loop++)
			Crc16Value(&CrcU16MyDat,TempBuff8Byte[loop]);

		SetBit(IE,7);

		if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
			result = TRUE;
		else
			result = FALSE;
	}
	else
	{
		result = FALSE;
	}
	return result;
}
#endif

#if USE_WRITE_STATUS_TEST
BOOL WriteStatusTest(void)
/*
写状态信息测试
*/
{
U08 loop;
BOOL result;
//	if(ReadRomSnTest())
	if(SkipRomTest())
	{
		ClrBit(IE,7);

		WireWrByte(WRITE_STATUS);

		DallasAddr = 0x0007;
		WireSetAddr(DallasAddr);

		WireWrByte(0xa5);

		ReadU16Crc();

		CrcU16MyDat = 0x0000;
		Crc16Value(&CrcU16MyDat,WRITE_STATUS);
		Crc16Value(&CrcU16MyDat,DallasAddr&0xff);
		Crc16Value(&CrcU16MyDat,DallasAddr>>8);
		Crc16Value(&CrcU16MyDat,0xa5);

		if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
		{
			WireWrByte(0xff);
			result = TRUE;
		}
		else
		{
			result = FALSE;
		}

		SetBit(IE,7);
	}
	else
	{
		result = FALSE;
	}
	return result;
}
#endif


#if USE_SKIP_ROM_TEST
BOOL SkipRomTest(void)
/*
功能命令测试
*/
{
BOOL result;
	if(! InitWire())
	{
		result = FALSE;
	}
	else
	{
		ClrBit(IE,7);

		WireWrByte(SKIP_ROM_COMMAND);

		SetBit(IE,7);

		result = TRUE;
	}
	return result;
}
#endif

#if USE_WR_ONE_BYTE_TEST
BOOL WrOneByteTest(U08 dat)
/*
写一个字节测试
*/
{
BOOL result;
U08 recDat;
	ClrBit(IE,7);

	if(! InitWire())
	{
		SetBit(IE,7);
		result = FALSE;
	}
	else
	{
		WireWrByte(SKIP_ROM_COMMAND);

		WireWrByte(WRITE_MEMORY);

		DallasAddr = 0x0000;
		WireSetAddr(DallasAddr);

		WireWrByte(dat);

		ReadU16Crc();

		CrcU16MyDat = 0x0000;
		Crc16Value(&CrcU16MyDat,WRITE_MEMORY);
		Crc16Value(&CrcU16MyDat,DallasAddr&0xff);
		Crc16Value(&CrcU16MyDat,DallasAddr>>8);
		Crc16Value(&CrcU16MyDat,dat);

		if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
		{
			DallasProgram();

			recDat = WireRdByte();
			if(dat == recDat)
				result = TRUE;
			else
				result = FALSE;

			SetBit(IE,7);
		}
		else
		{
			SetBit(IE,7);
			result = FALSE;
		}
	}
	return result;
}
#endif




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -