|
|||||||||||
| 技術(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 |
44b0 IIC 問題,急!。。。! |
| 作者:liyuanhua 欄目:ARM技術(shù) |
三星的例程 void Wr24C040(U32 slvAddr,U32 addr,U8 data) { _iicMode=WRDATA; _iicPt=0; _iicData[0]=(U8)addr; _iicData[1]=data; _iicDataCount=2; rIICDS=slvAddr;//0xa0 rIICSTAT=0xf0; //MasTx,Start //Clearing the pending bit isn''t needed because the pending bit has been cleared. while(_iicDataCount!=-1); _iicMode=POLLACK; while(1) { rIICDS=slvAddr; _iicStatus=0x100; rIICSTAT=0xf0; //MasTx,Start rIICCON=0xaf; //resumes IIC operation. while(_iicStatus==0x100); if(!(_iicStatus&0x1)) break; // when ACK is received } rIICSTAT=0xd0; //stop MasTx condition rIICCON=0xaf; //resumes IIC operation. Delay(1); //wait until stop condtion is in effect. //write is completed. } 從程序上看,程序一開始就把要寫入的地址和數(shù)據(jù)發(fā)送,然后等待中斷,寫完后,再次START總線,再把從地址發(fā)下去然后再等待ACK,這似乎與2402時(shí)序不符。 請(qǐng)問各位大俠:為什么這個(gè)程序要寫完之后,再START,最后才等ACK,而不是每個(gè)字節(jié)都判斷ACK 再者,我的程序老是在while(_iicStatus==0x100);就一直處在等待狀態(tài),根本就不產(chǎn)生中斷了,程序不往下執(zhí)行了。 望各位大俠幫幫忙,非常感謝 * - 本貼最后修改時(shí)間:2006-6-21 19:50:57 修改者:liyuanhua |
| 2樓: | >>參與討論 |
| 作者: liyuanhua 于 2006/6/21 20:42:00 發(fā)布:
頂! 真是急死我了,各位大俠幫幫忙吧 |
|
| 3樓: | >>參與討論 |
| 作者: huai903 于 2006/8/21 19:38:00 發(fā)布:
西西哈哈 |
|
| 4樓: | >>參與討論 |
| 作者: huai903 于 2006/8/23 0:45:00 發(fā)布:
我也是啊 |
|
| 5樓: | >>參與討論 |
| 作者: liyuanhua 于 2006/8/23 8:59:00 發(fā)布:
re: 其實(shí)就是按照IIC的時(shí)序做就可以了,不必理這個(gè)例子程序,下面是我的程序, 我是試過了的 U8 IIC_DATA[20]; void WRITE_IIC(U8 SLAVE_ADDR,U8 ADDR,U8 *P,U8 NUM) { U8 I; IICMODE=WRDATA; rI_ISPC=BIT_IIC; IIC_PT=0; IIC_DATA[0]=ADDR; IIC_COUNT=NUM+1; for(I=0;I<NUM;I++) IIC_DATA[I+1]=P[I]; rIICDS=SLAVE_ADDR; rIICSTAT=0XF0; while(IIC_COUNT!=-1); /*IICMODE=POLLACK; while(1) { rIICDS=0XA0; IICSTATUS=0X100; rIICSTAT=0XF0; rIICCON=0XAF; if(rIICSTAT & 0X01) ; while(IICSTATUS==0X100) ; if(!(IICSTATUS & 0X01)) ; break; }*/ rIICSTAT=0XD0; rIICCON=0XAF; DELAY(2); } |
|
| 6樓: | >>參與討論 |
| 作者: HUAI903 于 2006/8/23 10:38:00 發(fā)布:
呵呵,看明白了。 liyuanhua,看中斷服務(wù)程序: void __irq IicInt(void) { U32 iicSt,i; rI_ISPC=BIT_IIC; iicSt=rIICSTAT; if(iicSt&0x8){} // when bus arbitration is failed. if(iicSt&0x4){} // when a slave address is matched with IICADD if(iicSt&0x2){} // when a slave address is 0000000b if(iicSt&0x1){} // when ACK isn't received這里已經(jīng)對(duì)ACK進(jìn)行了判斷,你可以在其中加代碼的。 SWITCH(_iicMode) { case POLLACK: _iicStatus=iicSt; break; case RDDATA: if((_iicDataCount--)==0) { _iicData[_iicPt++]=rIICDS; rIICSTAT=0x90; //stop MasRx condition rIICCON=0xaf; //resumes IIC operation. Delay(1); //wait until stop condtion is in effect. //too LONG time... //The pending bit will not be set after issuing stop condition. break; } _iicData[_iicPt++]=rIICDS; //The last data has to be read with no ack. if((_iicDataCount)==0) rIICCON=0x2f; //resumes IIC operation with NOACK. else rIICCON=0xaf; //resumes IIC operation with ACK break; case WRDATA: if((_iicDataCount--)==0) { rIICSTAT=0xd0; //stop MasTx condition rIICCON=0xaf; //resumes IIC operation. Delay(1); //wait until stop condtion is in effect. //The pending bit will not be set after issuing stop condition. break; } rIICDS=_iicData[_iicPt++]; //_iicData[0] has DUMMY. for(i=0;i<10;i++); //for setup time until rising edge of IICSCL rIICCON=0xaf; //resumes IIC operation. break; case SETRDADDR: //Uart_Printf("[S%d]",_iicDataCount); if((_iicDataCount--)==0) { break; //IIC operation is stopped because of IICCON[4] } rIICDS=_iicData[_iicPt++]; for(i=0;i<10;i++); //for setup time until rising edge of IICSCL rIICCON=0xaf; //resumes IIC operation. break; default: break; } } 呵呵,他的程序是沒有問題的,可以實(shí)際放手跑一下,只要你沒有把全局中斷屏蔽掉,中斷應(yīng)該可以產(chǎn)生的,自己試過的,再說現(xiàn)在這個(gè)程序不知道多少家都用了,最少是學(xué)了,肯定是沒問題的。自己寫當(dāng)然也行了,不過有經(jīng)典的程序方式,還是可以值得學(xué)習(xí)一下的,自己按照IIC時(shí)序?qū)懙囊餐ㄟ^的。 下面是自己調(diào)的時(shí)候?qū)懙腎IC讀的部分: void RdAT24C08(U32 slvAddr,U32 addr,U8 *data) { CHAR recv_byte; iGetACK = 0; rIICDS = slvAddr; rIICSTAT=0xf0; while(iGetACK == 0);// 等待 ACK iGetACK = 0; rIICDS = addr; rIICCON = 0xaf; while(iGetACK == 0); iGetACK = 0; rIICDS = slvAddr; rIICSTAT=0xb0; // 主方式Rx 開始 rIICCON=0xaf; while(iGetACK == 0); iGetACK = 0; recv_byte = rIICDS; rIICCON = 0x2f; DelayMs(1); recv_byte = rIICDS; rIICSTAT = 0x90; rIICCON = 0xaf; DelayMs(5); *data = recv_byte; } * - 本貼最后修改時(shí)間:2006-8-23 11:03:28 修改者:HUAI903 |
|
|
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號(hào) |