Re: I2C的問題(1個傳送,3個接收)
|
||||
---|---|---|---|---|
新會員
|
請問一下
傳送位址與資料時的ACK訊號為一個1伏的方波 這算正常嗎? 如果不正常,原因出在哪呢?
發表於: 2006/5/11 21:44
|
|||
|
Re: I2C的問題(1個傳送,3個接收)
|
||||
---|---|---|---|---|
新會員
|
大家安安~
小弟想問一下: Master傳送一個byte時, 如果Slave因為資料遺失而沒收滿一個byte, 也就不會回傳確認訊號, 這時Master發個STOP, Slave可以繼續接收資料而不會有任何影響嗎? 如果START和STOP的訊號也接收失敗, 這樣會影響資料接收吧?!
發表於: 2006/5/10 17:36
|
|||
|
Re: I2C的問題(1個傳送,3個接收)
|
||||
---|---|---|---|---|
新會員
|
傳送端是根據PIC18f452寫的
接收端則是PIC18f4431 我看波形圖比較奇怪的是傳送位址跟資料的時候 ACK的波形都是1,照理說應該只有傳送資料時的ACK為1才對 不過我怎麼改都還是1.... 以下是傳送端與接收端的程式碼 ( 一傳一時可以持續接收, 一傳三就傳一段時間就掛掉了= = ) //====================傳送端 只作傳送===========
#include <p18f452.h>
發表於: 2006/5/4 20:55
|
|||
|
Re: I2C的問題(1個傳送,3個接收)
|
||||
---|---|---|---|---|
新會員
|
請問一下
我用led來顯示接收到的資料值 傳送端一直傳資料 接收端就不斷把資料值顯示在led上 傳送端每隔2.5ms傳送一次資料 大約過半分鐘後 接收端就停住而無法繼續接收了 請問有可能是某些暫存器溢位造成的嗎? 不過,會溢位的暫存器我程式方面已經做過處理 但是還是發生無法繼續接收的情況 這是哪種原因造成的呢??
發表於: 2006/5/4 13:58
|
|||
|
Re: I2C的問題(1個傳送,3個接收)
|
||||
---|---|---|---|---|
新會員
|
很抱歉 我沒遇過耶= =
應該丟什麼到SSPBUF,就傳什麼出來才對... 我只碰過傳資料時傳的位址被當成資料,傳的資料被當成位址,所以接收端一直收不到... 後來把接收端的SSPADD改成傳送端傳過來的資料時,SSPBUF就可以收到位址了(事實上是傳送端傳來的資料),但是第二筆資料還是收不到... 用示波器看波形後發現SCL有19個方波(中間SCL held low的地方,SDA跟SCL產生一個方波,我只傳送2個BYTES,所以理論上是18個才對),上述傳送端傳的位址跟資料才被當成位址來傳了,所以才會發生傳的資料被當成位址的情況= = 最後 在開始跟結束的位元後都用for迴圈DELAY一段時間,就正常工作了
發表於: 2006/5/2 17:22
|
|||
|
Re: I2C的問題(1個傳送,3個接收)
|
||||
---|---|---|---|---|
新會員
|
我找到錯誤的來源了
因為接收端都沒加裝reset裝置 reset後就可以正常接收了= =
發表於: 2006/5/1 15:34
|
|||
|
I2C的問題(1個傳送,3個接收)
|
||||
---|---|---|---|---|
新會員
|
各位大大好~
小弟我有個問題 我在使用一對一時, 接收端都可以確實的接收到資料 在用一對三時, 傳送端是輪流傳送資料至三個接收端 假設分別為1,2,3號接收端 剛開始可能是只有1號可以收到資料 後來跳到2號, 1號又收不到了, 再後來又跳到3號, 其他的又收不到了 接收情況就像上述跳來跳去, 而不是輪流接收 看傳送的波形時, 的確是輪流傳送三筆資料給三個接收端 請問這情形要如何解決呢
發表於: 2006/5/1 12:00
|
|||
|
Re: 關於使用PIC18F4431於APP001實驗板 --> I2C功能
|
||||
---|---|---|---|---|
新會員
|
以上問題都解決了
請問一下 我觀測波形後發現 有些資料會遺失 請問有那些方法可以增加傳送時的穩定性呢?
發表於: 2006/4/24 19:49
|
|||
|
Re: 關於使用PIC18F4431於APP001實驗板 --> I2C功能
|
||||
---|---|---|---|---|
新會員
|
恩~謝謝版主回答
我對調後 Master可以傳送位址了 請問一下PIC18F452 的 I2C 的 Master 傳送資料的問題 在傳送數據後的ACK是由slave接受的嘛? 為何有個箭頭說"ACKSTAT in SSPCON2 = 1" 這樣的話不就代表沒有從slave接收到確認訊號 ( 在PIC18FXX2 datasheet的156頁 ) 了解的大大們就回答一下吧~ ~~甘溫唷~~~ 再問一個問題 : MASTER端傳送的位址為0x12 資料為0x33 SLAVE端的SSPADD設為0x12, SSPBUF接收不到資料 把SLAVE端的SSPADD改為0x33, SSPBUF卻接收到0x33 看SDA-SCL波形發現,在傳送的第一個BYTE時, SCL的第九個脈衝對應到的SDA值都是HIGH, 照理說應該是LOW才對 會不會是這裡造成上述問題? 怎麼改程式都是如此....我要如何解決呢><" 註 : MASTER的晶片是PIC18F452,只做傳送 SLAVE的晶片是PIC18F4431,只做接收 //===================MASTER 端程式======= #include <p18f452.h> #include <delays.h> #include <i2c.h> void F_Initial(void); void F_I2C_START(void); unsigned char F_I2C_WAIT(void); unsigned char F_I2C_Send_Address(unsigned char); void F_I2C_Send_Data(unsigned char); void F_I2C_STOP(void); void main(void) { unsigned char UC_I2C_Data=0x33, //0101 0101 I2C_Devicel=0x13; //0001 0010 F_Initial(); while(1) { F_I2C_START(); if (F_I2C_Send_Address(I2C_Devicel & 0XFE)) { F_I2C_Send_Data(UC_I2C_Data); } F_I2C_STOP(); } } void F_Initial(void) { TRISD = 0; LATD = 0; TRISCbits.TRISC3 = 0; TRISCbits.TRISC4 = 0; SSPSTATbits.SMP = 1; SSPSTATbits.CKE = 0; SSPCON1 = 0x38; SSPADD = 0x30; } void F_I2C_START(void) { SSPCON2bits.SEN = 1; } unsigned char F_I2C_WAIT(void) { if ( PIR1bits.SSPIF ) { PIR1bits.SSPIF = 0; return (1); } else return (0); } unsigned char F_I2C_Send_Address(unsigned char UC_Address) { SSPBUF = UC_Address; while(!SSPCON2bits.ACKSTAT); if(!F_I2C_WAIT()) return (1); else return (0); } void F_I2C_Send_Data(unsigned char UC_Data) { SSPBUF = UC_Data; while(!F_I2C_WAIT()); } void F_I2C_STOP(void) { SSPCON2bits.PEN = 1; while(!F_I2C_WAIT()); } //===================SLAVE端程式======= #include <p18f4431.h> #include <i2c.h> #include <delays.h> unsigned char UC_I2C_CMD=0x00,TEMP=0x00; void F_Check_I2C_CMD(void); void i2c_Initial(void); void High_INT_SER(void); #pragma code High_Interrupt_Vector=0x08 void High_INT_VEC (void) { _asm goto High_INT_SER _endasm } #pragma code #pragma interrupt High_INT_SER void High_INT_SER (void) { if ( PIR1bits.SSPIF == 1 ) { PIR1bits.SSPIF = 0; F_Check_I2C_CMD(); } } void main(void) { i2c_Initial(); while(1); } void i2c_Initial(void) { LATD = 0; TRISD=0; TRISCbits.TRISC4=1; TRISCbits.TRISC5=1; SSPSTATbits.SMP = 0; SSPSTATbits.CKE = 0; SSPCON = 0x3e; SSPADD = 0x13 & 0xFE; SSPBUF=0x00; //======= i2c interrupt ======= PIE1bits.SSPIE=1; IPR1bits.SSPIP=1; //======= interrupt set ======= RCONbits.IPEN=1; INTCONbits.GIEH=1; INTCONbits.GIEL=1; SSPSTATbits.BF=0; } void F_Check_I2C_CMD(void) { TEMP=SSPBUF; LATD=TEMP; }
發表於: 2006/4/19 21:35
|
|||
|