我尝试在 PIC 18F4520 中实现 I2C 位碰撞以与 OLED 进行通信。它在没有“时钟拉伸”的情况下工作正常,但如果我把“时钟拉伸”放在它不起作用。而且我还尝试在 ACK 脉冲之前和之后放置“时钟拉伸”块,两者都不起作用。我的时钟拉伸有什么问题?
void send_packet(){
/* Soft_I2C_Start(); //Here its working fine
Soft_I2C_Write(0x78);
Soft_I2C_Write(tx_packet[0]);
Soft_I2C_Write(tx_packet[1]);
Soft_I2C_Stop();*/
unsigned char i,temp=0x78; //Slave Address with write permission
ASDA=1; //Start Condition
ASCL=1;
delay_ms(1);
ASDA=0;
ASCL=0;
for(i=0;i<8;i++){
if(temp & 0x80){
ASDA=1;
}
else{
ASDA=0;
}
temp=temp<<1;
ASCL=1;
ASCL=0;
}
ASCL=1; //Acknowledgment Pulse
ASCL=0;
while(PORTC.RC4==0); //Clock Stretching
for(i=0;i<8;i++){
if(tx_packet[0] & 0x80){
ASDA=1;
}
else{
ASDA=0;
}
tx_packet[0]=tx_packet[0]<<1;
ASCL=1;
ASCL=0;
}
ASCL=1; //Acknowledgment Pulse
ASCL=0;
while(PORTC.RC4==0); //Clock Stretching
for(i=0;i<8;i++){
if(tx_packet[1] & 0x80){
ASDA=1;
}
else{
ASDA=0;
}
tx_packet[1]=tx_packet[1]<<1;
ASCL=1;
ASCL=0;
}
ASCL=1; //Acknowledgment Pulse
ASCL=0;
while(PORTC.RC4==0); //Clock Stretching
ASCL=1; //Stop Condition
ASDA=1;
}