2017-11-29 38 views
0

I2C 비트를 구현하여 PIC 18F4520의 OLED와 통신하려고합니다. 'clock stretching'이 없어도 잘 작동하지만 'clock stretching'을 넣으면 작동하지 않습니다. 또한 나는 ACK 펄스 전후에 '시계 늘이기'블록을 넣으려고했는데 두 가지 모두 작동하지 않습니다. 내 시계가 길게 늘어나는 이유는 무엇입니까 ??클럭 스트레칭으로 I2C 비트가 작동하지 않음

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; 

} 

답변

0

경우 ((TEMP &을 0x80) == 1) {& 0x80으로 두 개의 가능한 값을 0x80 0을 갖는다

TEMP. 결코 == 1이되지 않습니다.

+0

감사합니다. . . 나는 그 오류를 정정하지만 여전히 작동하지 않는다. . . 편집 된 코드 –

+0

을 업데이트했습니다. . . 문제는 시계 스트레칭 라인입니다. . 나는 그것과 그 일을 삭제했다. . . 하지만 여전히 의심의 여지가 있습니다. –

+0

내 질문도 업데이트되었습니다. –