2009-06-03 77 views
2

我正在研究PIC16F88X的I2C協議。 我想要做的是根據I2C上接收到的數據,使I2C從器件發送ACK或NACK信號。PIC I2C從器件數據確認

PIC可以對線路上發送的I2C地址進行ACK或NACK,但是從我讀過的內容來看,它總是會對隨後接收到的字節進行ACK。那是對的嗎?

在下面的通信:

Start - I2c_Addr+write/ACK - Register_value/Nack 

我想從能夠ACK或NACK取決於註冊_值的值。如果從設備不瞭解Register _的值,則不應該確認。

有人可以請確認這是不可能的,或告訴我該怎麼做?

+0

快速說明問題:您的PIC將成爲此I2C事務中的主器件還是從器件(或兩者)? – Nate 2009-06-03 11:59:12

+0

兩個PIC,一個從機和一個主機。問題似乎在奴隸(決定NAck一個不相關的登記冊)。 你可能在想多個主人?如果你是和你有信息給,不要猶豫,回答... – Gauthier 2009-06-03 12:57:22

回答

7

假設你使用MSSP外設

簡短的回答:是你的要求可能不能夠以PIC,至少在沒有位模擬I/O線。原因是在第9個時鐘邊沿檢查ack/nack,直到第9個時鐘結束才觸發SSPIF中斷。當數據字節移入I/O寄存器(第8個時鐘)後,您可以嘗試重複檢查BF位,因爲它會被置位。如果您可以在第9個時鐘週期之前關閉比較並設置SSPOV位,則會產生一個NACK,如果您有任何中斷正在運行,則這非常粗略。

更長的回答:這聽起來像你試圖驗證從機接收的數據字節是否有效或不使用ack。我個人不會這樣做,ack是指示線路的完整性,而不是驗證數據的完整性。如果設備是從設備,則主設備必須確切地知道它是如何工作的,並且可以在將其推出I2C總線之前檢查該字節的有效性。在這種情況下,我假定您也可以控制I2C主控的代碼,使用一個公共頭文件來定義可以發送的所有命令或有效數據字節,以避免代碼中的不匹配。

如果您必須保證由於某種原因發送了正確的字節,請讓主設備向從設備詢問響應字節,讓從設備返回一個代碼,指示上次傳輸的結果。

如果您的目的是保證I2C線路的完整性,那麼這些方法都不可行。你唯一的選擇是在啓動時發送大量字節或者定期發送一個CRC,並檢查它是否與從機匹配。一般來說,I2C線路可以工作或不工作,它們速度低,通常線路很短,並且具有高容許總線電容,如果它們不工作,你根本看不到任何ack。

1

我的猜測是,如果I2C硬件內置於PIC中。我所使用的所有硬件解決方案都有一個狀態機,除非傳輸出現問題(例如缺少一點),否則無法確認第二個字節。你最好在軟件中使用bit-banging和用於ACK的開放式收集緩衝區來實現自己的I2C實現。那麼你可以做任何你想做的事情。它不會是I2C標準,因此請注意,如果您將總線上的任何設備都不符合您的規格,請注意。我不敢肯定,但我認爲對於任何標準I2C器件,如果它沒有收到ACK,它可能會重新傳輸數據,或者只是故障,因爲它不能確定誰在失敗後控制總線(由NAK )。