模擬IIC通訊協議,IIC通訊,普通I/O模擬IIC

1.IIC起始與停止信號
在這裏插入圖片描述
起始信號:在SCL爲高電平期間,SDA由高電平到低電平轉變
void IIC_Start(void)
{
SDA_OUT; //SDA數據線配置爲輸出
SCL_H; //SCL數據線拉高
dlyus(5);
SDA_H; //SDA數據線拉高
dlyus(5);
SDA_L; //SCL爲高,SDA由高變低,爲開始信號
dlyus(5);
SCL_L; //將SCL拉低,準備發送數據
dlyus(5);
}
停止信號:在SCL爲高電平期間,SDA由低電平到高電平轉變
void IIC_Stop(void)
{
SDA_OUT; //SDA數據線配置爲輸出
SCL_L; //SCL數據線拉低
dlyus(5);
SDA_L; //SDA數據線拉低
dlyus(5);
SCL_H; //SCL爲高
dlyus(5);
SDA_H; //SCL爲高電平,SDA由低變高,爲停止信號
dlyus(5);
}
等待應答信號:在SCL爲高電平期間,SDA爲低電平爲應答,SDA爲高電平爲非應答
void IIC_WaitACK(void)
{
unsigned char ACK_ERROR = 0;
unsigned char error = 1;
unsigned char ACK_OK = 0;
SDA_IN;
SDA_H; //主動非ACK
dlyus(2);
SCL_H;
dlyus(2);
while(READ_SDA)
{
ACK_ERROR ++;
if(ACK_ERROR >= 200)
{
IIC_Stop();
return error;
}
SCL_L;
dlyus(2);
return ACK_OK ;
}
}
產生應答:在SCL爲高電平期間,SDA爲低電平
void IIC_ACK(void)
{
SDA_OUT; //SDA數據線配置爲輸出
SCL_L; //SCL數據線拉低
SDA_L; //SDA數據線拉低
dlyus(5);
SCL_H; //SCL爲高電平,SDA由低變高,爲停止信號
dlyus(5);
SCL_L; //SCL數據線拉低
}
產生非應答:在SCL爲高電平期間,SDA爲低電平
void IIC_NOACK(void)
{
SDA_OUT; //SDA數據線配置爲輸出
SCL_L; //SCL數據線拉低
SDA_H; //SDA數據線拉高
dlyus(5);
SCL_H; //SCL爲高電平
dlyus(5);
SCL_L; //SCL數據線拉低
}
發送一個字節:
void IIC_Send_Byte(unsigned char data)
{
unsigned char i;
SDA_OUT;
SCL_L;
for(i=0;i<8;i++)
{
if(data&0x80)
{
SDA_H;
}
else
{
SCL_L;
}
data <<= 1;
dlyus(3);
SCL_H;
dlyus(3);
SCL_L;
dlyus(3);
}
}
接收一個字節:
unsigned char IIC_Send_Byte(unsigned char data)
{
unsigned char i;
unsigned char RECEVE_DATA=0;
SDA_IN;
for(i=0;i<8;i++)
{
SCL_L;
dlyus(3);
SCL_H;
RECEVE_DATA<<=1;
if(READ_SDA)RECEVE_DATA++;
dlyus(2);
}
return receive;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章