Re: I2C SCL 訊號一問
|
||||
---|---|---|---|---|
中級會員
|
首先非常謝謝 Ryang 的回答
可是, 那個example 似乎差距較大, 要改的東西較多 於是我就到 microchip 下載以下這個 EEPRom 的 example code 完全符合我的 mcu 及 EEPRom http://ww1.microchip.com/downloads/en ... I2C%20Master%20EEPROM.zip 硬體軟體都接好 compile 好後測試, 依然沒反應 SCL pin 量不到方波, 於是我單步 debug 發現底下的程式碼在執行到 StartI2C2 後, SCL , SDA 同時由 High 變 Low 天啊, I2C 的 start bit 不是 SCL high , SDA low 嗎? 怎麼不符合規定? MicroChip 的 bug? (心想一定不可能) 應該是我硬體接線哪裡有要注意結果搞錯?? 我的母板是用 PIC24F Starter Kit 1, MCU 是 pic24fj256gb106, 拉 PortF 的 Bit4 (SDA, pin 31), Bit5 (SCL,pin 32)到 測試板連接 EEPRom, 二個 PIN 都有 Pull-Ups 實在不知道哪裡有問題, 還請各位多多幫忙 ---------------- .... i2cData[0] = (SlaveAddress << 1) | 0; //Device Address & WR111 i2cData[1] = 0x05; //eeprom high address byte i2cData[2] = 0x40; //eeprom low address byte i2cData[3] = 0xAC; //data to write DataSz = 4; StartI2C2(); // <-- 執行過這一行後就 SCL, SDA 均變 low, 這正常嗎? IdleI2C2(); // Wait to complete while( DataSz ) // 寫 0xAC 到 EE { MasterWriteI2C2( i2cData[Index++] ); IdleI2C2(); //雖然都 low, 但這裡的 MaserWrite , Idle 均可以過, 完全成功執行完, 沒被 block 住 DataSz--; // ACKSTAT is 0 when slave acknowledge, // if 1 then slave has not acknowledge the data. if( I2C2STATbits.ACKSTAT ) break; } ....
發表於: 2009/1/15 13:44
|
|||
|
Re: I2C SCL 訊號一問
|
||||
---|---|---|---|---|
版主
|
看了一下所附的 Code Example , 如果沒有正確的接上 Slave 該程式就會卡在等待 ACK 的訊號,這程式相形之下過於簡單不適合實際的應用。你可以參考一下 dsPIC30F Peripheral 教育訓練裡有詳細的 I2C 對 EEPROM 的的應用可以測看看。
http://www.microchip.com.tw/modules/w ... glefile.php?cid=4&lid=229
發表於: 2009/1/14 10:45
|
|||
|
Re: I2C SCL 訊號一問
|
||||
---|---|---|---|---|
中級會員
|
以前我用 8051 或其它 mcu 時都自己寫 I2C, 一個bit一個bit的shift進shift出
現在這顆則是只有三個 register , 非常簡單, 全自動化, 但也因此無從 debug 起, 連 CLK 都沒輸出, 波形量不到, 有沒在跑不知道 因此, 我想知道的是... 1. 有沒有什麼動作我漏掉的? 例如 pin 要設 output? 2. 我接上 sensor , 但沒 pull-ups 時 CLK 有出來, 但訊號很奇怪, 是類似三角波(奇怪, 這顆 MCU 一定要接 slave 才有波形?) 3. 我接上 sensor , 且 pull-ups 時卻遇到進 IdleI2C2 這副程式出不來的現象, 好像一直在等什麼 4. 我現在勢必要知道的是 空接(有 pull-ups, 但沒 slave) 時, Master 一直拼命 Write 是不是至少 CLK 要出來? 為什麼它都沒有
發表於: 2009/1/14 10:25
|
|||
|
Re: I2C SCL 訊號一問
|
||||
---|---|---|---|---|
中級會員
|
有 pull-up , 2.2 K ohm
發表於: 2009/1/14 10:12
|
|||
|
Re: I2C SCL 訊號一問
|
||||
---|---|---|---|---|
版主
|
量不到訊號出來,請問你有接 10K ohm 的 Pull-Up 電阻嗎?
I2C 是 Open Drain 的架構,電阻衣錠要自己加的。
發表於: 2009/1/14 9:57
|
|||
|
I2C SCL 訊號一問
|
||||
---|---|---|---|---|
中級會員
|
大家好,
我現在用 PIC24FJ256GB106 MCU, 我要用 I2C 去控制某 sensor, 但目前我先空接 SCL2/SDA2 (有 pull-up) 我試著用 Microchip 的 example code 去 write 訊號出來, 但是, 我在 SCL2 上量測訊號, 示波器卻量不到東西 我的問題是, I2C 在 SCL2/SDA2 未接 slave device 時, 難道 clock 不會有輸出訊號? 一定要有對接時才行? 以下是 microchip 的程式碼 void testI2C(void) { unsigned int config2, config1; unsigned char *wrptr; unsigned char tx_data[] = {'M','I','C','R','O','C','H','I','P','\0'}; wrptr = tx_data; /* Baud rate is set for 100 Khz */ config2 = 0x11; /* Configure I2C for 7 bit address mode */ config1 = (I2C_ON & I2C_IDLE_CON & I2C_CLK_HLD & I2C_IPMI_DIS & I2C_7BIT_ADD & I2C_SLW_DIS & I2C_SM_DIS & I2C_GCALL_DIS & I2C_STR_DIS & I2C_NACK & I2C_ACK_DIS & I2C_RCV_DIS & I2C_STOP_DIS & I2C_RESTART_DIS & I2C_START_DIS); OpenI2C2(config1,config2); IdleI2C2(); StartI2C2(); /* Wait till Start sequence is completed */ while(I2C2CONbits.SEN ); //while(1) <-- unmark 這三行作無限輸出測試 //{ <-- unmark 這三行作無限輸出測試 /* Write Slave address and set master for transmission */ MasterWriteI2C2(0xE); /* Wait till address is transmitted */ while(I2C2STATbits.TBF); while(I2C2STATbits.ACKSTAT); //} <-- unmark 這三行作無限輸出測試 /* Transmit string of data */ MasterputsI2C2(wrptr); StopI2C2(); /* Wait till stop sequence is completed */ while(I2C2CONbits.PEN); CloseI2C2(); }
發表於: 2009/1/13 17:15
|
|||
|