📄 iic.c
字号:
/*==========================================
==========================================*/
#include "include.h"
////////////////////////////////////////////////////////
/*==========================================
==========================================*/
void DDC2(void)
{
// ISCL = 0; //sherry ????
// ISCL = 1;
}
/*==========================================
==========================================*/
void SetISCL(Bit flag)
{
if(flag)
PTB_REG |= PB4;
else
PTB_REG &= ~PB4;
}
void SetISDA(Bit flag)
{
if(flag)
PTB_REG |= PB5;
else
PTB_REG &= ~PB5;
}
void IIC_Start(void)
{
SetISCL(1);
_nop_();
_nop_();
SetISDA(1);
_nop_();
_nop_();
SetISDA(0);
SetISCL(0);
}
/*==========================================
==========================================*/
void IIC_Stop(void)
{
SetISDA(0);
SetISCL(1);
_nop_();
_nop_();
SetISDA(1);
}
Bit ReadISDA()
{
Byte tmp;
RDPB_REG |= 0x20;
_nop_();
_nop_();
_nop_();
_nop_();
tmp=PTB_REG & PB5;
RDPB_REG &= 0xdf;
if(tmp == PB5)
return 1;
else
return 0;
}
void IIC_ReStart(void) //s0310
{
SetISCL(1);
_nop_();
_nop_();
SetISDA(1);
_nop_();
_nop_();
SetISDA(0);
SetISCL(0);
}
/*==========================================
==========================================*/
void CheckIIC(void)
{
// ISCL = 1;
// ISDA = 1;
// while(!ISDA || !ISCL) //waiting for IIC released
// {
// ISCL = 0;
// IIC_Stop();
// }
}
/*==========================================
==========================================*/
Byte IIC_Tx(Byte Data)
{ //subroutine total time 630us
Byte AckLoop,Ack;
Byte i;
for(i=0;i<8;i++)
{
SetISCL(0);
_nop_();
_nop_();
SetISDA((Data & 0x80));
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SetISCL(1);
_nop_();
_nop_();
_nop_();
Data =Data<<1;
}
SetISCL(0);
_nop_();
_nop_();
SetISDA(1);
SetISCL(1);
Ack = NACK;
for(AckLoop=0;AckLoop<50;AckLoop++) //260us
{
if(!(ReadISDA()))
{
Ack = ACK;
break;
}
}
SetISCL(0);
return Ack; //return success=0 / failure=1
}
/*==========================================
==========================================*/
Byte IIC_Rx(Bit Ack)
{
Byte Data;
Byte i;
Data = 0;
for(i=0;i<8;i++)
{
Data <<= 1;
SetISCL(0);
SetISDA(1);
SetISCL(1);
CLRWDT = 0x55;
if((ReadISDA()))
Data |= 1;
else
Data &= 0xfe;
}
SetISCL(0);
SetISDA(Ack);
SetISCL(1);
SetISCL(0);
return Data;
}
/*==========================================
==========================================*/
void WriteIIC(Byte device,Byte addr,Byte ch)
{
IIC_Start();
IIC_Tx(device);
IIC_Tx(addr);
IIC_Tx(ch);
IIC_Stop();
}
/*==========================================
==========================================*/
void WriteIIC563(unsigned short addr,unsigned char ch)
{
CheckRegPage(addr);
IIC_Start();
IIC_Tx(SCALER_ADDR);
IIC_Tx(addr);
IIC_Tx(ch);
IIC_Stop();
}
/*==========================================
==========================================*/
void WriteWordIIC563(unsigned short addr,unsigned short value)
{
CheckRegPage(addr);
IIC_Start();
IIC_Tx(SCALER_ADDR);
IIC_Tx((Byte)addr);
IIC_Tx((Byte)value);
IIC_Tx((Byte)(value>>8));
IIC_Stop();
}
/*==========================================
==========================================*/
unsigned char ReadIIC563(unsigned short addr)
{
Byte value;
CheckRegPage(addr);
IIC_Start();
IIC_Tx(SCALER_ADDR);
IIC_Tx(addr);
IIC_ReStart();
IIC_Tx(SCALER_ADDR+1);
value = IIC_Rx(NACK); //nack
IIC_Stop();
return value;
}
/*==========================================
==========================================*/
unsigned short ReadWordIIC563(unsigned short addr)
{
Byte temp;
Word value;
CheckRegPage(addr);
IIC_Start();
IIC_Tx(SCALER_ADDR);
IIC_Tx(addr);
IIC_ReStart();
IIC_Tx(SCALER_ADDR+1);
temp = IIC_Rx(ACK);
value = IIC_Rx(NACK); //nack
value <<= 8;
value += temp;
IIC_Stop();
return value;
}
/*==========================================
==========================================*/
void CheckRegPage(unsigned short addr)
{
Byte page;
IIC_Start();
IIC_Stop();
page = (Byte)((addr/256) & 0x003);
if(page != RegPage)
{
RegPage = page;
WriteIIC(SCALER_ADDR,0xff,RegPage);
}
}
/*
void Write24C16(unsigned short k,unsigned char ch)
{
unsigned char device,addr;
addr = (unsigned char)k;
device = (unsigned char)((k>>7)&0x0e);
device |= EEPROM;
WriteIIC(device,addr,ch);
WaitEEprom();
}
void WaitEEprom(void)
{
Byte i,ack;
for(i=0;i<100;i++) //10ms
{
IIC_Start();
ack = IIC_Tx(0xa0); //polling ACKnowledge
IIC_Stop();
if(ack == ACK){
break;}
CLRWDT = 0x55;
}
}
*/
void WriteIIC_Video(Byte Subaddr,Byte Data)
{
IIC_Start();
IIC_Tx(0xba);
IIC_Tx(Subaddr);
IIC_Tx(Data);
IIC_Stop();
}
/*==========================================
==========================================*/
Byte ReadIIC_Video(Byte Subaddr)
{
Byte value;
IIC_Start();
IIC_Tx(0xba);
IIC_Tx(Subaddr);
IIC_ReStart();
IIC_Tx(0xbb);
value = IIC_Rx(NACK); //nack
IIC_Stop();
return value;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -