會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客





I2C Salve mode 如何正確送出 第2 byte data?
資深會員
註冊日期:
2007/08/13 14:27
所屬群組:
註冊會員
文章: 200
等級: 13; EXP: 18
HP : 0 / 304
MP : 66 / 10024
離線
設計一個I2C slave 把10 bit adc data 送出.
//---------------addr----data
//---write-ADC : 0xA6 , 0x18.
//---read--ADC : 0xA7 , AD_Result.byte[], 2 byte response.

Master 都只能正確收到第一個byte, 第二byte都是錯的
看來送lo byte 送出前還需要做判斷,有那位高手可以指點迷津一下!

修改傳送的 adc data.
// CHECK FOR MASTER READ, LAST BYTE RECEIVED WAS ADDRESS
if((SSPSTAT & 0x2C) == 0x0C){

SSPBUF = ADC_Result.Byte[0]; //send hi byte.
SSPCON1bits.CKP = 1;
//
// 可能缺判斷式 ?
//
SSPBUF = ADC_Result.Byte[1]; //send lo byte.
SSPCON1bits.CKP = 1;

//



原本的 code
=========================================================
#pragma code i2c_interrupt_handler = 0x08 // Place i2c_interrupt_handler at 0x08 (interrupt high vector)
#pragma interrupt i2c_interrupt_handler // Define i2c_interrupt_handler as interrupt function

void i2c_interrupt_handler(void){
if(PIR1bits.SSPIF){
// MASTER WRITE, LAST BYTE RECEIVED WAS ADDRESS, BUFFER FULL
if((SSPSTAT & 0x2D) == 0x09){
dummy_read = SSPBUF; // Dummy read I2C data buffer
SSPCON1bits.CKP = 1; // Release clock
}

// CHECK FOR MASTER WRITE, LAST BYTE RECEIVED WAS DATA, BUFFER FULL
if((SSPSTAT & 0x2D) == 0x29){
column_data_rx = SSPBUF; // Read received sample data request from I2C data buffer
SSPCON1bits.CKP = 1; // Release clock
}

// CHECK FOR MASTER READ, LAST BYTE RECEIVED WAS ADDRESS
if((SSPSTAT & 0x2C) == 0x0C){
SSPBUF = sample_data_tx;
SSPCON1bits.CKP = 1; // Release clock
}

// CHECK FOR MASTER NACK
if((SSPSTAT & 0x2D) == 0x2){
// DO NOTHING
}

PIR1bits.SSPIF = 0; // Clear I2C interrupt flag bit
}
}

2012/08/28 17:44
轉換PDF檔 列印


Re: I2C Salve mode 如何正確送出 第2 byte data?
高級會員
註冊日期:
2011/09/09 18:20
所屬群組:
註冊會員
文章: 120
等級: 9; EXP: 96
HP : 0 / 224
MP : 40 / 4718
離線
你知道在 進入 address read的中斷後 你去收完address 後
馬上要送出 你的第一筆data嗎 如果不是的話
就會發生後面的資料是錯的

2012/08/30 09:28
轉換PDF檔 列印


Re: I2C Salve mode 如何正確送出 第2 byte data?
中級會員
註冊日期:
2005/10/28 00:53
來自 豐原 ; 大里
所屬群組:
註冊會員
文章: 54
等級: 6; EXP: 19
HP : 0 / 129
MP : 18 / 4957
離線
在 Microchip I2C 範例中,有I2C Slave 範列
在 I2C 接收中斷中,使用一個狀態變數去記憶
線再收到是第一個Byte還是第二各Byte

您找一下吧。

2012/08/30 09:56
轉換PDF檔 列印


Re: I2C Salve mode 如何正確送出 第2 byte data?
新會員
註冊日期:
2012/08/24 11:38
所屬群組:
註冊會員
文章: 19
等級: 3; EXP: 9
HP : 0 / 52
MP : 6 / 951
離線
我也遇到了和你一樣的問題


如果你的IC有ACKSTAT標誌位的話,,,,

恭喜你

BF=0; ACKSTAT=1;的情況下 再發送第二個數據就好了,,,


我很慘。。。。。。。沒有這個標誌位判斷

哎。。

2012/09/06 16:48
轉換PDF檔 列印


Re: I2C Salve mode 如何正確送出 第2 byte data?
新會員
註冊日期:
2012/08/24 11:38
所屬群組:
註冊會員
文章: 19
等級: 3; EXP: 9
HP : 0 / 52
MP : 6 / 951
離線
我也遇到了和你一樣的問題


如果你的IC有ACKSTAT標誌位的話,,,,

恭喜你

BF=0; ACKSTAT=1;的情況下 再發送第二個數據就好了,,,


我很慘。。。。。。。沒有這個標誌位判斷

哎。。

2012/09/06 16:48
轉換PDF檔 列印


Re: I2C Salve mode 如何正確送出 第2 byte data?
資深會員
註冊日期:
2004/07/23 16:25
所屬群組:
註冊會員
文章: 1186
等級: 30; EXP: 5
HP : 0 / 726
MP : 395 / 30380
離線
用SSPSTAT的 D_A 和 R_W 不是就可以分辦出 address_r,address_w, data_r,data_w

收到 r的指令時,程序必需盡快計算出要送出的資料,並塞到 SSPBUF 之中

2012/09/07 08:32
轉換PDF檔 列印


Re: I2C Salve mode 如何正確送出 第2 byte data?
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14528
等級: 73; EXP: 10
HP : 1081 / 1802
MP : 4842 / 76634
離線
很久以前寫的範例程式,可以參考一下裡面的 Sequential Read from EEPROM 的函數及如何做 EEPROM Acknowledge Polling( ).

附加檔案:


zip I2C_Mast.zip 大小: 3.05 KB; 下載次數: 237

2012/09/10 13:48
轉換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