|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | 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 |
大家看看我的程序問題出在哪里 |
| 作者:feelfrank 欄目:MCU技術(shù) |
我是一個(gè)初學(xué)者,最近公司要我用LPC931做了一個(gè)產(chǎn)品,在調(diào)試過程中我發(fā)現(xiàn)在讀EEPROM時(shí)出現(xiàn)比較大的問題,既讀不出來,也寫不進(jìn)去,我想硬件上是沒什么問題的,SDA、SCL的上拉電阻也有。如果不是用在專用I2C腳P1.2、P1.3上,同樣的程序改在普通的I/O口就能正常讀寫。請教大俠是怎么回事,使用時(shí)應(yīng)注意什么事項(xiàng),應(yīng)該怎么解決,先謝了。也可以給我發(fā)E-MAIL:feelfrank@163.com 應(yīng)該說是很簡單的程序如下: #include <reg931.h> #define ERRORCOUNT 10 unsigned CHAR idata NUM[3]; void Delay(unsigned CHAR DelayCount); void _nop_ (void); bit RW24XX(unsigned CHAR *DataBuff,unsigned CHAR ByteQuantity,unsigned int Address, unsigned CHAR ControlByte); main() { P1M1=0x0C; P1M2=0x0C; // 設(shè)為開漏 . . . RW24XX(&NUM,3,0x00,0xa1); //讀EEPROM while(1) { . . . } } bit RW24XX(unsigned CHAR *DataBuff,unsigned CHAR ByteQuantity,unsigned int Address, unsigned CHAR ControlByte) { void IICStart1(void); void IICStop1(void); bit IICRecAck1(void); void IICNoAck1(void); void IICAck1(void); unsigned CHAR IICReceiveByte1(void); void IICSendByte1(unsigned CHAR sendbyte); unsigned CHAR data j,i=ERRORCOUNT; bit errorflag=1; while(i--) //while_1 { IICStart1(); //啟動(dòng) IICSendByte1(ControlByte&0xFE); //寫器件地址, 寫狀態(tài) if(IICRecAck1()) //等應(yīng)答 CY=1則從while_1重新啟動(dòng),并重寫器件地址 continue; IICSendByte1((unsigned CHAR)Address); //寫存儲單元地址 if(IICRecAck1()) //等應(yīng)答 CY=1則從while_1重新啟動(dòng),并重寫器件地址 continue; if(!(ControlByte&0x01)) //判斷讀寫 { j=ByteQuantity; errorflag=0; //寫操作開始,errorflag清除 while(j--) //while_2 { IICSendByte1(*DataBuff++); if(!IICRecAck1()) //等應(yīng)答 CY=0則轉(zhuǎn)到while_2開始,并繼續(xù)寫下一個(gè)數(shù)據(jù) continue; //否則應(yīng)答出錯(cuò),重新置errorflag標(biāo)志,并退出寫數(shù)據(jù) errorflag=1; break; } if(errorflag==1) continue; break; } else { IICStart1(); //啟動(dòng) IICSendByte1(ControlByte); //寫器件地址,讀狀態(tài) if(IICRecAck1()) //等應(yīng)答 CY=1則從while_1重新啟動(dòng),并重寫器件地址 continue; while(--ByteQuantity) { *DataBuff++=IICReceiveByte1(); IICAck1(); } *DataBuff=IICReceiveByte1(); //最后一字節(jié) IICNoAck1(); errorflag=0; ////讀操作完成,errorflag清除 break; } } IICStop1(); if(!(ControlByte&0x01)) //寫操作完成后延時(shí) { Delay(255); Delay(255); Delay(255); Delay(255); } return(errorflag); } /*****************以下是對IIC總線的操作子程序*** /*****************啟動(dòng)總線**********************/ void IICStart1(void) { SCL=0; // SDA=1; SCL=1; _nop_(); _nop_(); _nop_(); SDA=0; _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; SDA=1; // } /*****************停止IIC總線****************/ void IICStop1(void) { SCL=0; SDA=0; SCL=1; _nop_(); _nop_(); _nop_(); SDA=1; _nop_(); _nop_(); _nop_(); SCL=0; } /**************檢查應(yīng)答位*******************/ bit IICRecAck1(void) { SCL=0; SDA=1; SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); CY=SDA; //因?yàn)榉祷刂悼偸欠旁贑Y中的 SCL=0; return(CY); } /***************對IIC總線產(chǎn)生應(yīng)答*******************/ void IICACK1(void) { SDA=0; SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); SDA=1; } /*****************對IIC總線產(chǎn)生高電平***************/ void IICNoAck1(void) { SDA=1; SCL=1; _nop_(); _nop_(); |
| 2樓: | >>參與討論 |
| 作者: zlgmcu 于 2006/4/4 8:34:00 發(fā)布:
把您的客戶信息發(fā)給我,我就給您發(fā)一個(gè)現(xiàn)成的! |
|
| 3樓: | >>參與討論 |
| 作者: feelfrank 于 2006/4/4 18:39:00 發(fā)布:
周工 周工: 您好,你指的客戶信息指的是哪些?如果要發(fā)給你應(yīng)發(fā)到哪里? |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |