會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





MCC 產生之 I2C Slave 範例 code 請益
新會員
註冊日期:
2017/02/12 20:58
所屬群組:
註冊會員
文章: 18
等級: 2; EXP: 97
HP : 0 / 49
MP : 6 / 230
離線
各位先進好

最近使用 PIC32MM0064GPM0028 撰寫 Slave 裝置

並使用 mcc 產生 I2C Slave 的 code

測試時使用 arduino due 作為 Master 端測試

當 Master write to Slave 的時候結果正常,多次寫入均沒問題

但當 Master read from Slave ,第一次 read 正確

但經過第一次 read 後,要再次下達 wirte 或read 請求時,address 發送後均得到 NACK 的回應

請問有人有過類似的經驗嗎?

或著建議觀察哪些 SRF 檢查 I2C 的狀態是否異常?

附件為測試時的 code,使用 I2C2 並確認有接上拉電阻

謝謝

附加檔案:


zip PIC32MM0064GPM0028_Sample_20180528.X.zip 大小: 223.51 KB; 下載次數: 31

5月31日 15:58:20
轉換PDF檔 列印


Re: MCC 產生之 I2C Slave 範例 code 請益
中級會員
註冊日期:
2010/10/19 13:16
所屬群組:
註冊會員
文章: 45
等級: 5; EXP: 51
HP : 0 / 112
MP : 15 / 2612
離線
您好,我遇到問題是,當master read時,master發送address時,都會有NACK回應,最後我在
"case I2C2_SLAVE_RECEIVED_DATA_DETECTED:"
最後面加上"I2C2_RELEASE_SCL_CLOCK_CONTROL_BIT = 1;"
就可以了,我也不確定,這是不是正確的解法.

6月01日 10:38:55
轉換PDF檔 列印


Re: MCC 產生之 I2C Slave 範例 code 請益
新會員
註冊日期:
2017/02/12 20:58
所屬群組:
註冊會員
文章: 18
等級: 2; EXP: 97
HP : 0 / 49
MP : 6 / 230
離線
Hi

我剛剛試著加上去

但好像沒有效果

剛剛在 Master Read from Slave 1byte 的資料後,觀看 I2CxSTAT

不知道會不會跟 RBF = 1 有關(此時Slave端已經收到Stop bit)

附加檔案:



jpg  AfterMasterReadFromSlave.jpg (253.97 KB)
50946_5b10df8c0dcf4.jpg 1411X837 px

6月01日 13:54:22
轉換PDF檔 列印


Re: MCC 產生之 I2C Slave 範例 code 請益
新會員
註冊日期:
2017/02/12 20:58
所屬群組:
註冊會員
文章: 18
等級: 2; EXP: 97
HP : 0 / 49
MP : 6 / 230
離線
剛剛修改了一下 Code

在 mcc 產生的 i2c2.c 內的 switch case 中

將 case S_SLAVE_TRANSMIT_MODE: 的最後一段加上清除 I2C2bits.I2COV 的動作後

I2C 程式就能正常讀寫了

case S_SLAVE_TRANSMIT_MODE:

// this is the state where an ACK or NACK is expected
// to occur after the slave has placed data to the
// transmit register.

// if the transaction was ACK'ed, more data needs to be sent
// if the transaction was NACK'ed then we don't need to send
// more data
if (I2C2_ACKNOWLEDGE_STATUS_BIT == 0)
{
// prepare next data
I2C2_StatusCallback(I2C2_SLAVE_TRANSMIT_REQUEST_DETECTED);

// transmit more data
I2C2_TransmitProcess();

}
else //if (I2C2_ACKNOWLEDGE_STATUS_BIT == 1)
{
// no more data to be sent so we go to idle state
i2c2_slave_state = S_SLAVE_IDLE;
}


if( I2C2_RECEIVE_OVERFLOW_STATUS_BIT == true )
{
dummy = I2C2_RECEIVE_REG;
I2C2_RECEIVE_OVERFLOW_STATUS_CLR;
}


break;

不確定是什麼原因

在 Master 向 Slave 發起 read 請求後

RBF,I2COV 被設為 1,且直到 Read 結束後沒有被清除

導致後續 Master 發出 ADDRESS 請求,也不會收到 Slave 端的 ACK

目前翻 datasheet 也只翻到 RBF,I2COV 被設為 1 的原因

Overrun is indicated if either (or both):
•The buffer full bit, RBF (I2CxSTAT<1>), was set before the transfer was received
•The overflow bit, I2COV (I2CxSTAT<6>), was set before the transfer was received

6月01日 15:14:37
轉換PDF檔 列印


Re: MCC 產生之 I2C Slave 範例 code 請益
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14474
等級: 73; EXP: 2
HP : 1080 / 1800
MP : 4824 / 75694
離線
一般在 Data Sheet 不會有詳細的說明,請參考:
PIC32 Family Reference Manual, Sect. 24 Inter-Integrated Circuit
http://ww1.microchip.com/downloads/en/DeviceDoc/61116F.pdf

依聚餐存氣的位元說明 I2COV: I2C Receive Overflow Status bit
1 =A byte is received while the I2CxRCV register is still holding the previous byte.
I2COV is a “don’t care” in Transmit mode. This bit must be cleared in software.
0 = No overflow

在 Figure 24-30:Slave Message 有時序圖說明。此外也提及:
Reading the I2CxRCV register clears the RBF bit. The I2COV bit is cleared by writing to a ‘0’ through software.

6月04日 14:33:17
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2018 Winter Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project