|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
lpc900 I2C問題 |
| 作者:leslie34 欄目:MCU技術(shù) |
我用I2C操作EEPROM 2402,程序如下 #include"reg932.h" #include"hi2c.h" #define uCHAR unsigned CHAR #define cat2402 0xa0 //定義cat2402從機(jī)地址 uCHAR dat,sla,suba,num; uCHAR mtd[20]; uCHAR mrd[20]; void delay() { int i,j; i=1000; j=1000; while(i--) { while(j--); j=1000; } } void main(void) { uCHAR i; P1M1=0x0c; P1M2=0x0c; sla=cat2401; suba=0x20; for(i=0;i<20;i++) { mtd[i]=i; } iwrnbyte(sla,suba,mtd,20); delay(); irdnbyte(sla,suba,mrd,20); while(1) ; } 我用的是從ZLG網(wǎng)站上下載的I2C軟件包.但出來的結(jié)果不對(duì).mtd是發(fā)送了內(nèi)容,mrd是接收的內(nèi)容.mtd和mrd在仿真器中觀察,內(nèi)容不一致. 請(qǐng)高手解答. |
| 2樓: | >>參與討論 |
| 作者: zlg900 于 2005/2/26 10:56:00 發(fā)布:
可能是超過頁長度 對(duì)2402連續(xù)送數(shù)據(jù)時(shí),該芯片會(huì)默認(rèn)為頁寫模式,頁長度為16字節(jié)。如果連續(xù)寫入的數(shù)據(jù)超過16個(gè)字節(jié),則第16個(gè)字節(jié)以后的數(shù)據(jù)會(huì)自動(dòng)覆蓋先前寫入的數(shù)據(jù)。您的錯(cuò)誤可能在此。 處理該問題的方法是每寫入16個(gè)字節(jié)后,重新啟動(dòng)總線,發(fā)送地址,然后再寫入。 |
|
| 3樓: | >>參與討論 |
| 作者: LESLIE34 于 2005/3/1 10:14:00 發(fā)布:
謝謝!!! 果然是這個(gè)問題,把寫數(shù)據(jù)的個(gè)數(shù)設(shè)為小于16就行了. |
|
| 4樓: | >>參與討論 |
| 作者: andrewpei 于 2005/3/1 10:37:00 發(fā)布:
2402的頁長度不一定都是16字節(jié)。 事實(shí)上,就我看到的資料而言,只的Catalyst公司的2402其頁長度是16個(gè)字節(jié),ATMEL與MICROCHIP的2402其頁長度都是8字節(jié)。 另外我認(rèn)為,用戶在寫入多字節(jié)數(shù)據(jù)時(shí),必須對(duì)自己要寫的起始地址指定一個(gè)明確的地址值,最好是從每一頁的頁頭寫起(即地址0x???? ?000B或0x???? 0000B)。因?yàn)槿绻恢付ㄆ鹗嫉刂返脑挘?a target="_blank" href="http://m.58mhw.cn/stock-ic/2402.html">2402里的地址寄存器有可能是指向一個(gè)頁的中間地址,在這種情況下多字節(jié)寫入,將產(chǎn)生卷繞。 |
|
| 5樓: | >>參與討論 |
| 作者: z_bing 于 2005/4/25 13:39:00 發(fā)布:
我改成5個(gè)字節(jié)都不行。——我用的是AT24C04 下面的程序,如果運(yùn)行正確,LDE應(yīng)該閃爍。先寫24C04,再讀24C04,比較讀到的數(shù)據(jù)與寫入的數(shù)據(jù)一致,則LED取反;若不一致則沒有現(xiàn)象。LED一直滅。取下24C04放到編程器上讀,發(fā)現(xiàn)寫入正確。 #include<reg932.h> #include"Hi2C_C51.h" #define I2CADDR 0xA0 typedef unsigned CHAR uCHAR; sbit LED=P0^1; void Delay() { unsigned int i=0x07FFFF; do { i--; } while(i!=0); } main() { uCHAR s[32],d[32]; uCHAR i; for(i=0;i<32;i++) { s[i]=i; d[i]=i+3; } P1M1=0xFF; P1M2=0xFF; P0M1=0xFF; P0M2=0xFF; P1=0xFF; while(1) { ISendStr(I2CADDR, 0x20, s, 5); IRcvStr(I2CADDR, 0x20, d, 5); if(s[4]!=d[4]) //LED=!LED; Delay(); else LED=!LED; Delay(); } } |
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |