成功驱动5150用HT68F30

用了自己写的起动总线和停止总线,终于可以成功


// PROGRAM	: 4-17.c									      2011.0521
// FUNCTION	: I2C Master/Slave Mode Demo Program   By Steven
// Note		: Configuration Option Setting--
//			  SIM Function = Enable	
//void I2C_START(void);
//void I2C_STOP(void);
//void WriteByte(unsigned short);
//unsigned short ReadByte(void);
//void CheckACK(void);
//void PAUSEIIC(unsigned short);
//void I2C_INIT(void);
//void INIT_TVP5150(void);
//void IICWRITE_ADDRSSDATA(unsigned char addrss,unsigned char data);
//#pragma	rambank0						            //BIT Data Type Must in Bank 0
//bit		RxFlag,DeviceFlag;
//unsigned short RxData,TxData;	
#include	"HT68F30.h"
#include	"ht68f30iic.h"

const unsigned char IICADDRSS=0XB8;//I2CSEL接做VD1_OUT7的话地址是0XB8,I2CSEL=0,地址是0XBA

void I2C_INIT(void)
{
	_cp0c=0x08; _cp1c=0x08; //_acerl=0;		   //Disable CP0/CP1/ADC
	WIDEO_PWDN_C=0;//把PWN设置成为输出状态
	WIDEO_PWDN=0;//设置时钟频率
	WIDEO_RESET_C=0;//把复位端口设置成输出状态
	WIDEO_RESET=1; //低电平进行复位 置成1保证处在正常工作状态	
//	PWR_EN5150C=0;
//	PWR_EN5150=1;//电源供电给5150
	//SEG_Port=0; SEG_PortC=0;						//Clear & Config SEG_Port as O/P
	//ID_PortC=0xFF; ID_Pull=0xFF; 					//ID_Port as I/P & Enable Pull-up
	//FG_LED=0; FG_LEDC=0;							   //Clear FG_LED & Config as O/P
	//_sima=GetID()<<1;								   //Get ID from DIP SW
	//_simc0=0b11000000;								//Select I2C Slave Mode
	//_mf2e=1; _sime=1; _simen=1; _emi=1;		   //Enable Interrupt and SIM Function		
}
void INIT_TVP5150(void)
{	
	unsigned char data;
/*	unsigned int k;
	k=10;
	while(k--){		
		SCL=0; SDA=0;								   	//Set SCL=0, SDA=0
		//PAUSEIIC(10);
		_delay(10);
		SCL=1; SDA=1;								   	//Set SCL=0, SDA=0	
		//PAUSEIIC(10);
		_delay(10);
	}
	
	//I2C_INIT();//开始IIC前开始的初始化工作
	IICWRITE_ADDRSSDATA(0x03,0x8F);//2.	杂项控制寄存器
	k=10;
	SCLC=0;SDAC=0;
	while(k--){		
		SCL=0; SDA=0;								   	//Set SCL=0, SDA=0
		//PAUSEIIC(10);
		_delay(10);
		SCL=1; SDA=1;								   	//Set SCL=0, SDA=0	
		//PAUSEIIC(10);
		_delay(10);
	}
	data =IICREAD_ADDRSSDATA(0x03);//0x0D默认值是0x47	
	
	k=10;
	while(k--){		
		SCL=0; SDA=0;								   	//Set SCL=0, SDA=0
		//PAUSEIIC(10);
		_delay(10);
		SCL=1; SDA=1;								   	//Set SCL=0, SDA=0	
		//PAUSEIIC(10);
		_delay(10);
	}
	//if(data!=0)
	if(data==0x8F)
	{
		Test_Pc6C=0;
		Test_Pc6=1;	
		_tmpc0=0;//取消PC5引脚的复用功能
		Test_Pc5C=0;  //如果从机应答的话把这个引脚电平拉高
		Test_Pc5=1;	
	}*/
	IICWRITE_ADDRSSDATA(0x03,0x8F);//2.	杂项控制寄存器
	IICWRITE_ADDRSSDATA(0x0D,0x40);//3.	输出和数据比率选择寄存器	
	
}
void IICWRITE_ADDRSSDATA(unsigned char addrss,unsigned char data)
{
	I2C_START();
	WriteByte(IICADDRSS);
	CheckACK();
	I2C_START();
	WriteByte(addrss);	
	CheckACK();
	WriteByte(data);
	CheckACK();
	_delay(64);//5150要求有64us的延时
	I2C_STOP();
}
unsigned char IICREAD_ADDRSSDATA(unsigned char addrss)
{
	unsigned char data;
	I2C_START();
	WriteByte(0XB8);//写器件地址
	CheckACK();
	WriteByte(addrss);//写寄存器地址
	CheckACK();
	//_delay(64);
	I2C_STOP();
	
	I2C_START();
	WriteByte(0XB9);//写器件地址
	//_delay(64);
	CheckACK();
	data=ReadByte();//读	
	I2C_STOP();
	return data;
}
void I2C_START(void)
{	
/*	SCL=0; SDA=0;								   	//Set SCL=0, SDA=0
	SCLC=0;SDAC=0;								   	//SCL/SDA as Output Mode
	_delay(10);
	SCL=1; SDA=1; _delay(10);						//SCL=1, SDA=1, Delay 10us
	SDA=0; _delay(10);								//SDA=0, Delay 10us	
	SCL=0; _delay(10);									//SCL=0, Delay 10us	
*/	
	SCLC=0;SDAC=0;
	SCL=0;SDA=0;
	_delay(10);
	SCL=1;SDA=1;
	_delay(10);
	SDA=0;_delay(10);
	SCL=0;_delay(10);
}
void I2C_STOP(void)
{
/*	SCL=0; SDA=0;									   //Set SCL=0, SDA=0
	SDAC=0;										   	//SDA as Output Mode
	_delay(10);
	SCL=1; _delay(10);								//SCL=1, Delay 10us
	SDA=0; _delay(10);								//SDA=0, Delay 10us
	SDA=1; _delay(10);								//SDA=1, Delay 10us		
	SCL=0; _delay(10);								//SCL=0, Delay 10us	
*/	
	SCLC=0;SDAC=0;
	SCL=0;SDA=0;
	_delay(10);
	SCL=1;_delay(10);
	SDA=1;_delay(10);
	SCL=0;_delay(10);	
}
void WriteByte(unsigned short I2CData)
{	unsigned short temp=0b10000000;
	SCLC=0;
	SCL=0; SDAC=0;									   //SCL=0, SDAC as Output
	do
	{	SDA=I2CData & temp; 
		_delay(10);	      //Set SDA State and delay 10us
		SCL=1; 
		_delay(10);
		//_delay(10); 
		SCL=0; 
		_delay(10);  //Generate SCL Clock
		temp>>=1;									   //Next Bit
	} while (temp!=0);
}
unsigned char ReadByte(void)
{	unsigned char I2CData=0, temp=0b10000000;
	SDAC=1;											   //Config SDAC as Input
	SCLC=0;
	SCL=0;
	do
	{	SCL=1; _delay(10);							//Set SCL=1, Delay 10us
		if(SDA) I2CData|=temp;						//Received Data
		SCL=0; _delay(10);							//Set SCL=0, Delay 10us
		temp>>=1;									   //Next Bit
	} while (temp!=0);
	SDA=1; SDAC=0; _delay(10);						//Send NoACK Signal
	SCL=1; _delay(10); SCL=0;
	return I2CData;
}
void CheckACK(void)
{	unsigned short i=200;
	SDAC=0;
	SDA=1;// 先由主机把数据线拉高释放总线 再去检测数据线的电平高低
	SDAC=1;											   //Config SDAC as Input
	SCL=1; //_delay(10);								//Set SCL=1, Delay 10us
	while(i--)
	{
		//Test_Pc4C=0;  //如果从机应答的话把这个引脚电平拉高
		//Test_Pc4=1;	
		if(!SDA) {
			//DeviceFlag=1; 
			Test_Pc4C=0;  //如果从机应答的话把这个引脚电平拉高
			Test_Pc4=1;	
			//_tmpc0=0;//取消PC5引脚的复用功能
			//Test_Pc5C=0;  //如果从机应答的话把这个引脚电平拉高
			//Test_Pc5=1;
			break;
		}//Break if Device Respounding
		_delay(100);
									   //200*100uS=2ms Waiting Time
	} 
	SCL=0; _delay(10);								//Set SCL=0, Delay 10us
}
void PAUSEIIC(unsigned short i)
{	unsigned short j;
	for (j=0;j<i;j++) _delay(10000);				//Delay i*10mS
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值