會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客



(1) 2 »


老鳥的問題
中級會員
註冊日期:
2013/05/26 14:10
來自 台中市潭子區
所屬群組:
註冊會員
文章: 47
等級: 5; EXP: 67
HP : 0 / 116
MP : 15 / 1367
離線
各位大大:

我是一位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

3月02日 08:09:55
轉換PDF檔 列印


Re: 老鳥的問題
資深會員
註冊日期:
2010/06/30 16:18
來自 CAE, Microchip Technology Inc.
所屬群組:
站務管理者
註冊會員
文章: 1521
等級: 33; EXP: 22
HP : 161 / 805
MP : 507 / 16265
離線
試試看以下方式,

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);
}

3月03日 15:49:46
轉換PDF檔 列印


Re: 老鳥的問題
中級會員
註冊日期:
2013/05/26 14:10
來自 台中市潭子區
所屬群組:
註冊會員
文章: 47
等級: 5; EXP: 67
HP : 0 / 116
MP : 15 / 1367
離線
感謝Adam Syu:

實驗成功,3Q , 3Q

3月10日 09:02:06
轉換PDF檔 列印


Re: 老鳥的問題
中級會員
註冊日期:
2013/05/26 14:10
來自 台中市潭子區
所屬群組:
註冊會員
文章: 47
等級: 5; EXP: 67
HP : 0 / 116
MP : 15 / 1367
離線
其實我試了很久一直試不出來,

今天用掃描方式,發現一個問題,位址出現錯置現象,這又是什麼問題呢?

I2C2_MasterWrite(I2C2Array,3,0x50,&i2cErrorr);

實際傳送出來是0xa0,如附圖

I2C2_MasterWrite(I2C2Array,3,0xA0,&i2cErrorr);

附加檔案:



jpg  I2C錯位.JPG (67.34 KB)
21003_58c20041a1a96.jpg 626X446 px

3月10日 09:24:29
轉換PDF檔 列印


Re: 老鳥的問題
資深會員
註冊日期:
2012/05/04 19:18
所屬群組:
註冊會員
文章: 169
等級: 12; EXP: 5
HP : 0 / 276
MP : 56 / 4089
離線
0X50 = 0B01010000
0XA0 = 0B10100000
兩者SHIFT了一位喔~~
不知道您的I2C Slave address為多少?
I2C Address的寫法是bit7~bit1為address然後bit0為R/W,
是不是這裡有錯呢?

3月10日 12:21:27
轉換PDF檔 列印


Re: 老鳥的問題
中級會員
註冊日期:
2013/05/26 14:10
來自 台中市潭子區
所屬群組:
註冊會員
文章: 47
等級: 5; EXP: 67
HP : 0 / 116
MP : 15 / 1367
離線
謝謝您的回答

我用的是貴公司的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怎樣才正確

感謝先

3月10日 15:35:15
轉換PDF檔 列印


Re: 老鳥的問題
資深會員
註冊日期:
2012/05/04 19:18
所屬群組:
註冊會員
文章: 169
等級: 12; EXP: 5
HP : 0 / 276
MP : 56 / 4089
離線
很粗略的看了一下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應該可以找出答案!

附加檔案:



jpg  1.jpg (57.60 KB)
9227_58c3212c3d313.jpg 819X460 px

jpg  2.jpg (55.41 KB)
9227_58c32136dfe19.jpg 819X474 px

jpg  3.jpg (82.19 KB)
9227_58c3213e8ec94.jpg 1134X460 px

3月11日 06:06:20
轉換PDF檔 列印


Re: 老鳥的問題
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 915
等級: 26; EXP: 97
HP : 0 / 649
MP : 305 / 18928
離線
這個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)...

3月11日 07:49:27
_________________
程式是
依照寫出來(的code),跑出結果
不是依照你想出來的,得到結果

先有需求規格 後有解決方案
轉換PDF檔 列印


Re: 老鳥的問題
資深會員
註冊日期:
2012/05/04 19:18
所屬群組:
註冊會員
文章: 169
等級: 12; EXP: 5
HP : 0 / 276
MP : 56 / 4089
離線
抱歉有筆誤喔,更正如下以免造成誤導
bit7~bit1為slv addr, bit0為(read or write, read = 1 and write = 0)

3月11日 08:35:03
轉換PDF檔 列印


Re: 老鳥的問題
資深會員
註冊日期:
2010/06/30 16:18
來自 CAE, Microchip Technology Inc.
所屬群組:
站務管理者
註冊會員
文章: 1521
等級: 33; EXP: 22
HP : 161 / 805
MP : 507 / 16265
離線
引用:

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()

3月13日 10:30:46
轉換PDF檔 列印



(1) 2 »



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

[進階搜尋]


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