用了自己写的起动总线和停止总线,终于可以成功
// 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
}