會員登陸
網站導航
最新下載
- Microchip 程式... (Tue, 17-Apr-2018)
- Microchip 程式... (Mon, 09-Apr-2018)
- Microchip2018微... (Fri, 19-Jan-2018)
- Microchip 2018 ... (Tue, 19-Dec-2017)
- 2017 精英年會特... (Wed, 11-Oct-2017)
- 2017 秋 研討會... (Wed, 11-Oct-2017)
- 2017 暑期微控制... (Fri, 07-Jul-2017)
- ATM6 講義與實作... (Tue, 27-Jun-2017)
- ATM5 講義與實作... (Tue, 27-Jun-2017)
- ATM4 講義與實作... (Tue, 27-Jun-2017)
訪問統計 (自2012/5/3)
|
正在流覽:
1 名訪客
|
老鳥的問題 |
|
中級會員 
註冊日期: 2013/05/26 14:10
來自 台中市潭子區
所屬群組:
註冊會員
文章: 58
等級: 6; EXP: 48 HP : 0 / 137 MP : 19 / 1968
|
各位大大:
我是一位50多歲從組合語言玩起的老鳥,以前都是用簡單的C來建構程式,最近想借用MCC來幫忙,但是產生出來的Code,常常因為語法和概念不同而動不了,想請教先進如何使用MCC產生的CODE
舉例:PIC33EP64MC204 I2C 讀寫47L04 ID:a0 Data:55 Addr:0000
MCC: Code 如下
void I2C2_MasterWrite( uint8_t *pdata, uint8_t length, uint16_t address, I2C2_MESSAGE_STATUS *pstatus) { static I2C2_TRANSACTION_REQUEST_BLOCK trBlock;
// check if there is space in the queue if (i2c2_object.trStatus.s.full != true) { I2C2_MasterWriteTRBBuild(&trBlock, pdata, length, address); I2C2_MasterTRBInsert(1, &trBlock, pstatus); } else { *pstatus = I2C2_MESSAGE_FAIL; }
}
void I2C2_MasterRead( uint8_t *pdata, uint8_t length, uint16_t address, I2C2_MESSAGE_STATUS *pstatus) { static I2C2_TRANSACTION_REQUEST_BLOCK trBlock;
// check if there is space in the queue if (i2c2_object.trStatus.s.full != true) { I2C2_MasterReadTRBBuild(&trBlock, pdata, length, address); I2C2_MasterTRBInsert(1, &trBlock, pstatus); } else { *pstatus = I2C2_MESSAGE_FAIL; }
}
請問我該如何用呢?3Q3Q
2017/03/02 08:09
|
|
|
Re: 老鳥的問題 |
|
資深會員 
註冊日期: 2010/06/30 16:18
來自 CAE, Microchip Technology Inc.
所屬群組:
站務管理者 註冊會員
文章: 1577
等級: 33; EXP: 70 HP : 163 / 817 MP : 525 / 18679
|
試試看以下方式,
unsigned char Array[3]; I2C2_MESSAGE_STATUS i2cErrorr;
void main( void ) {
Array[0] = 0x00; /* Address High Byte */ Array[1] = 0x00; /* Address Low Byte */ Array[2] = 0x55 /* Data */
I2C2_MasterWrite(Array,3,0xA0,&i2cErrorr);
while(1); }
2017/03/03 15:49
|
|
|
Re: 老鳥的問題 |
|
中級會員 
註冊日期: 2013/05/26 14:10
來自 台中市潭子區
所屬群組:
註冊會員
文章: 58
等級: 6; EXP: 48 HP : 0 / 137 MP : 19 / 1968
|
感謝Adam Syu:
實驗成功,3Q , 3Q
2017/03/10 09:02
|
|
|
Re: 老鳥的問題 |
|
中級會員 
註冊日期: 2013/05/26 14:10
來自 台中市潭子區
所屬群組:
註冊會員
文章: 58
等級: 6; EXP: 48 HP : 0 / 137 MP : 19 / 1968
|
其實我試了很久一直試不出來,
今天用掃描方式,發現一個問題,位址出現錯置現象,這又是什麼問題呢?
I2C2_MasterWrite(I2C2Array,3,0x50,&i2cErrorr);
實際傳送出來是0xa0,如附圖
I2C2_MasterWrite(I2C2Array,3,0xA0,&i2cErrorr);
附加檔案:
I2C錯位.JPG (67.34 KB)
2017/03/10 09:24
|
|
|
Re: 老鳥的問題 |
|
資深會員 
註冊日期: 2012/05/04 19:18
所屬群組:
註冊會員
文章: 200
等級: 13; EXP: 18 HP : 0 / 304 MP : 66 / 5314
|
0X50 = 0B01010000 0XA0 = 0B10100000 兩者SHIFT了一位喔~~ 不知道您的I2C Slave address為多少? I2C Address的寫法是bit7~bit1為address然後bit0為R/W, 是不是這裡有錯呢?
2017/03/10 12:21
|
|
|
Re: 老鳥的問題 |
|
中級會員 
註冊日期: 2013/05/26 14:10
來自 台中市潭子區
所屬群組:
註冊會員
文章: 58
等級: 6; EXP: 48 HP : 0 / 137 MP : 19 / 1968
|
謝謝您的回答
我用的是貴公司的47L04
Slave ID:a0 Data:55 Addr:0000
我程式一直用 I2C2_MasterWrite(I2C2Array,3,0xA0,&i2cErrorr); 一直沒有ACK,
後來把ID改為遞增方式,才找到用0x50可以得到ACK
奇怪的是,I2C2_MasterWrite(I2C2Array,3,0x50,&i2cErrorr);
示波器卻看到真正的輸出是0xa0 ; 後來我試了 I2C2_MasterRead(I2C2Array,3,0x50,&i2cErrorr); 卻沒出現像47L04的,先送0xa0再讀出0xa1
所以也想麻煩您做個範例,讀和寫都要,因為現在我還真沒法確定這顆IC怎樣才正確
感謝先
2017/03/10 15:35
|
|
|
Re: 老鳥的問題 |
|
資深會員 
註冊日期: 2012/05/04 19:18
所屬群組:
註冊會員
文章: 200
等級: 13; EXP: 18 HP : 0 / 304 MP : 66 / 5314
|
很粗略的看了一下datasheet,以SRAM BYTE WRITE來說明, START + CONTROL BYTE(WRITE) + ADDRESS(HIGH) + ADDRESS(LOW) + DATA + STOP可以完成動作,每個byte後的ack也要檢查
control byte = (0x50 << 1)| 0x01; 我猜這是函式內的實際的作法! 這主要須回歸到I2C Protocol本身就是這樣 bit7~bit1為slv addr, bit0為(read or write, read = 0, write = 1) 稍加注意一下附檔圖片及我前面跟您提示的bit shift應該可以找出答案!
2017/03/11 06:06
|
|
|
Re: 老鳥的問題 |
|
資深會員 
註冊日期: 2007/06/05 21:45
所屬群組:
註冊會員
文章: 964
等級: 27; EXP: 57 HP : 0 / 664 MP : 321 / 21130
|
這個I2C Address是一個容易出錯的問題... 原因在於I2C 7bits slave Address (還有10bits slave address跟本問題不相關) I2C 7bits slave Address在通信時是與 R/W(讀/寫) 合在一起,成為 8bits 送出. 因為只有1bits的差異,所以.... 0xA0 1010000- (8bits, R/W以0看待) 0x50 1010000 (7bits,不含R/W) 都有人使用... 且不同的函數(副程式),也是有的要用0xA0,有的0x50 所以常常會出錯. 但有一點比較不會出錯 當你聽到/看到 slave address 是 0xA0 一般只是 0xA0 1010000- (8bits, R/W以0看待) 當你聽到/看到 slave address 是 0x50 可能是 0xA0 1010000- (8bits, R/W以0看待) 0x50 1010000 (7bits,不含R/W) 或者是 0x50 0101000- (8bits, R/W以0看待) 0x28 0101000 (7bits,不含R/W) http://www.totalphase.com/support/art ... -bit-I2C-Slave-Addressing... Some vendors incorrectly provide 8-bit addresses which include the read/write bit.以上是經驗談... 雖然 slave address 0xA0 的稱呼是錯的 註:7bits slave address範圍只在0x00~0x7F, (且有效範圍在0x08~0x77) 那來的0xA0,但早期大家都是這樣來看待 所以到現在應該還是有一堆人搞不懂?? 到底是0xA0? 還是0x50? 雖然是0x50才是對的,但如果廠商與其他人 都"告訴"你是0xA0,甚至規格書與電路圖上 都標成0xA0,你示波器也量出來,是0xA0(含R/W)...
2017/03/11 07:49
|
|
|
Re: 老鳥的問題 |
|
資深會員 
註冊日期: 2012/05/04 19:18
所屬群組:
註冊會員
文章: 200
等級: 13; EXP: 18 HP : 0 / 304 MP : 66 / 5314
|
抱歉有筆誤喔,更正如下以免造成誤導 bit7~bit1為slv addr, bit0為(read or write, read = 1 and write = 0)
2017/03/11 08:35
|
|
|
Re: 老鳥的問題 |
|
資深會員 
註冊日期: 2010/06/30 16:18
來自 CAE, Microchip Technology Inc.
所屬群組:
站務管理者 註冊會員
文章: 1577
等級: 33; EXP: 70 HP : 163 / 817 MP : 525 / 18679
|
引用: LoverTech 寫道: 謝謝您的回答
我用的是貴公司的47L04
Slave ID:a0 Data:55 Addr:0000
我程式一直用 I2C2_MasterWrite(I2C2Array,3,0xA0,&i2cErrorr); 一直沒有ACK,
後來把ID改為遞增方式,才找到用0x50可以得到ACK
奇怪的是,I2C2_MasterWrite(I2C2Array,3,0x50,&i2cErrorr);
示波器卻看到真正的輸出是0xa0 ; 後來我試了 I2C2_MasterRead(I2C2Array,3,0x50,&i2cErrorr); 卻沒出現像47L04的,先送0xa0再讀出0xa1
所以也想麻煩您做個範例,讀和寫都要,因為現在我還真沒法確定這顆IC怎樣才正確
感謝先
讀跟寫基本上是兩個分開的東西, 你可以從EEPROM提供的讀寫流程中, 獲得解答 對於EEPROM提供的幾種讀取方式, 1.Current Address Read, 單純只有讀取 2.Random Read, 先寫入位置, 再讀取 3.Sequential Read, 先寫入位置, 再連續讀取 所以你必須根據你所需要的方式, 來組合MCC提供的函數, 1.Current Address Read, I2Cx_MasterRead() 2.Random Read, I2Cx_MasterWrite() -> I2Cx_MasterRead() 3.Sequential Read, I2Cx_MasterWrite() -> I2Cx_MasterRead()
2017/03/13 10:30
|
|
您無法在此發表文章
您可以在此觀看文章
您無法回覆文章
您無法編輯自己的文章
您無法刪除自己的文章
您無法發起投票調查
您無法在此投票
您無法上傳附加檔案
您無法不經審核直接發表文章
|
搜尋
Microchip連結
網頁捷徑
2018 Winter Elite 報名
教育訓練
其它網站連結
|