0

我尝试在 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; 

}
4

1 回答 1

0

如果((温度&0x80)==1){

temp&0x80 有两个可能的值,0 和 0x80。它永远不会== 1。

于 2017-11-29T05:16:03.020 回答