最近做的項目中涉及了IIC總線的運用
IIC總線的運用范圍十分廣泛
寫下博客記錄
IIC總線延時 大于4.7us
#define Decoded_iic_delay() \
{\
Decoded_iic_DELAY_TMP=Decoded_iic_DELAY_VALUE;\
while(--Decoded_iic_DELAY_TMP);\
}
初始化
void Decoded_iic_init()
{
Decoded_iic_SCL=1;
Decoded_iic_delay();
Decoded_iic_SDA=1;
Decoded_iic_delay();
}
開始信號
void Decoded_iic_start()
{
Decoded_iic_SDA=1;
Decoded_iic_delay();
//Myputchar(Decoded_iic_SDA);
Decoded_iic_SCL=1;
Decoded_iic_delay();
//Myputchar(Decoded_iic_SCL);
Decoded_iic_SDA=0;
Decoded_iic_delay();
//Myputchar(Decoded_iic_SDA);
Decoded_iic_SCL=0;
Decoded_iic_delay();
//Myputchar(Decoded_iic_SCL);
}
寫時序
void Decoded_iic_write(uchar dat)
{
uchar idata t=8;
while(t--)
{
Decoded_iic_SDA=(bit)(dat&0x80);
dat<<=1;
Decoded_iic_SCL=1;
Decoded_iic_delay();
Decoded_iic_SCL=0;
Decoded_iic_delay();
}
}
讀時序
uchar Decoded_iic_read()
{
uchar dat=0;
uchar t=8;
//Myputchar(dat);
Decoded_iic_SDA=1;讀之前SDA拉高
while(t--)
{
Decoded_iic_SCL=1;
Decoded_iic_delay();
dat <<= 1;一定要先移位后讀 如果先讀后移位會擠掉最高位
if(Decoded_iic_SDA)
{
dat |= 0x01;
}
Decoded_iic_SCL=0;
Decoded_iic_delay();
}
return dat;
}
獲取ACK
bit Decoded_iic_getack()
{
bit ack;
Decoded_iic_SDA=1;SDA為高釋放總線
Decoded_iic_delay();
Decoded_iic_SCL=1;
Decoded_iic_delay();
ack=Decoded_iic_SDA;
Decoded_iic_SCL=0;
Decoded_iic_delay();
return ack;
}
發送ACK
void Decoded_iic_putack(bit ack)
{
Decoded_iic_SDA=ack;
Decoded_iic_SCL=1;
Decoded_iic_delay();
Decoded_iic_SCL=0;
Decoded_iic_delay();
}
結束信號
void Decoded_iic_stop()
{
uint t=Decoded_iic_WAIT_VALUE;
Decoded_iic_SDA=0;
Decoded_iic_delay();
Decoded_iic_SCL=1;
Decoded_iic_delay();
Decoded_iic_SDA=1;
Decoded_iic_delay();
while(t--);
}
綜合發送
bit Decoded_iic_puts(unsigned char SlaveAddr,uchar *dat,unsigned int Length)
{
if ( Length == 0 ) return 0;
Decoded_iic_start();
Decoded_iic_write(SlaveAddr);發送地址
if ( Decoded_iic_getack() )
{
Decoded_iic_stop();
return 1;
}
發送數據
do
{
Decoded_iic_write(*dat++);
if ( Decoded_iic_getack() )
{
//Myputchar('c');
break;
}
} while ( --Length != 0 );
Decoded_iic_stop();
if ( Length == 0 )
{
//Myputchar('a');
return 0;
}
else
{
//Myputchar('b');
return 1;
}
}
綜合接收數據
bit Decoded_iic_gets(unsigned char SlaveAddr,uchar *dat,unsigned int Length)
{
if(!Length)
return 0;
Decoded_iic_start();
Decoded_iic_write(SlaveAddr+1);發送地址+1 +1是讀的意思
if(Decoded_iic_getack())
{
Decoded_iic_stop();
return 1;
}
for (;;)
{
*dat++ = Decoded_iic_read();
if ( --Length == 0 )
{
Decoded_iic_putack(1);發送非ACK
break;
}
Decoded_iic_putack(0);發送ACK
}
//接收完畢,停止I2C總線,并返回結果
Decoded_iic_stop();
return 0;
}