|
Re: I2C問題
|
|
新會員
|
再請問
由master寫入資料slave時,slave接收到資料或是位址時的ack是由PIC硬體自動產生還是需要在slave設定才會產生ack呢?
發表於: 2007/2/27 15:44
|
|
|
I2C問題
|
|
新會員
|
我使用16f877A與876A做I2C通訊
877A為master,876A為slave
maste呼叫slave時,slave的中斷有反應,不過ack總是1,請問是哪邊出了問題
使用20MHZ震盪器 =========以下為CODE================== MASTER
void interrupt intrpt(void) { if(TMR0IF==1) //1 ms { TMR0IF=0; TMR0=217; t_count++; if(t_count%100==0)iic_flag=1; if(t_count%500==0) //0.5sec { RD0=1; } if(t_count>=1000) //1 sec { RD0=0; t_count=0; } } } //---------------------------------------------------------- void main(void) { unsigned char sum=0,i=0,*temp1; PORTB=0x00; TRISD=0x00; TRISB=0x00; Initial_timer0(); Initial_I2C(); PEIE=1; //周邊中斷致能位元 GIE=1; //全域中斷致能位元 on while(1) { if(iic_flag) { int i=0; iic_flag=0; I2C_start(); for(i=0;i<=3;i++) { if(I2C_address(0x10,0)==0) { if(I2C_write(I2C_BUFFER[0]))break; if(I2C_write(I2C_BUFFER[1]))break; break; } } I2C_stop(); iic_flag=0; } } } //---------------------------------------------------------- void Initial_I2C(void) { TRISC3=1; TRISC4=1; SSPSTAT=0x80; SSPCON=0x38; SSPCON2=0x00; SSPADD=49; //100khz SSPIE=0; } //---------------------------------------------------- bit I2C_write(unsigned char data) { SSPBUF=data; while(STAT_BF||STAT_RW); I2C_wait(); return ACKSTAT; } //---------------------------------------------------- bit I2C_address(unsigned char address,char io) { switch (io) { case 1: address=(address&0xfe)+1; break; case 0: address=address&0xfe; break; } SSPBUF=address; while(STAT_BF || STAT_RW); I2C_wait(); return ACKSTAT; } //------------------------------------------------------- void I2C_stop(void) { PEN=1; I2C_wait(); } //-------------------------------------------------------- void I2C_start(void) { SEN=1; I2C_wait(); } //----------------------------------------------------- void I2C_wait(void) { while(!SSPIF); SSPIF=0; }
==================================== SLAVE void interrupt intrpt(void) { if(SSPIF==1) { SSPIF=0; iic_flag=1; } } //------------------------------------------------------------------------- void main(void) { TRISC0=0; Initial_I2C(); PEIE=1; //周邊中斷致能位元 GIE=1; //全域中斷致能位元 on while(1) { if(iic_flag) { unsigned char cmd=0; iic_flag=0; cmd=SSPSTAT&0x2d; switch (cmd) { case 0x0c: //資料讀取 iic_count=0; iic_dataR(iic_count); iic_count++; break; case 0x2c: iic_dataR(iic_count); iic_count++; break; case 0x09: //資料寫入 iic_count=0; break; case 0x29: iic_dataW(iic_count); iic_count++; break; }
}
} } //--------------------------------------------------------------------------- void Initial_I2C(void) { TRISC3=1; TRISC4=1; SSPSTAT=0x80; SSPCON=0x36; SSPCON2=0x00; SSPADD=0x20; SSPIF=0; SSPIE=1; SSPEN=1; } //--------------------------------------------------------------------------- void iic_dataR(unsigned char data_count) { CKP=0; SSPBUF=I2C_BUFFER[data_count]; while(!STAT_BF); CKP=1; } //---------------------------------------------------------------------- void iic_dataW(unsigned char data_count) { CKP=1; I2C_BUFFER[data_count]=SSPBUF; }
發表於: 2007/2/26 0:15
|
|
|
Re: 16F88無法燒錄
|
|
新會員
|
感謝版主幫忙
那目前的情況以LEAPER48是無法解決 MCLR Disable的問題囉?
發表於: 2006/12/19 13:30
|
|
|
16F88無法燒錄
|
|
新會員
|
請問16F88再燒錄時會有設定造成無法重複燒錄嗎?
我使用LEAPER48燒錄器 編譯器為HI-tech C
以下為功能設定 __CONFIG(INTIO&WDTDIS&MCLRDIS&LVPDIS&BORDIS&UNPROTECT); __CONFIG(FCMDIS&IESODIS);
是否有設定是會造成無法重複燒錄或是燒錄失敗呢?
發表於: 2006/12/18 22:36
|
|