Re: 讀取eeprom問題.....非常感謝各位
|
||||
---|---|---|---|---|
中級會員
|
您好
經過一番test後,已可順利寫、讀,感謝所有提供建言的 大大,m(_ _)m,最後想請教一下,eeprom記憶體內容 到多少才需像24LC256醬子,address byte 需改成hi btye和 low byte呢?
發表於: 2004/10/19 12:06
|
|||
|
Re: 讀取eeprom問題.....非常感謝各位
|
||||
---|---|---|---|---|
中級會員
|
您好
對於各位大大的建議,小弟一定會去好好研究一番。很感 謝您們的回答,謝謝。
發表於: 2004/10/15 22:22
|
|||
|
Re: 讀取eeprom問題.....非常感謝各位
|
||||
---|---|---|---|---|
版主
|
有沒有用示波器量過波形,EEPROM 有沒有回Ack信號?
有些 Debugger 單靠程式是不容易找出蟲子的。 建議先讀一下I2C的規範後,就會比較清楚I2C的Timing的意義。
發表於: 2004/10/15 16:24
|
|||
|
Re: 讀取eeprom問題.....非常感謝各位
|
||||
---|---|---|---|---|
版主
|
麻煩去看一下EEPROM 24LC01B及24LC256 DATA SHEET中的時序圖就知道了。
一張圖,抵得過千言萬語。
發表於: 2004/10/15 15:42
|
|||
|
Re: 讀取eeprom問題.....非常感謝各位
|
||||
---|---|---|---|---|
版主
|
http://ww1.microchip.com/downloads/en/DeviceDoc/51297c.pdf
以上的連結是C18 library manu。其中的page 31 (檔案的page 35)有針對24LC01B的範例。 先用24LC01B試,可以動了,再設法改成針對24LC256。01和256的基本差別,只在於address用一個byte或兩個byte來組成而已。 當然,前提是:您的硬體接線必須要是正確的。
發表於: 2004/10/14 23:24
|
|||
|
Re: 讀取eeprom問題.....非常感謝各位
|
||||
---|---|---|---|---|
中級會員
|
上述程式即是12.1的範例,complier後因有LCDxx等的error,所以自行修正忽略掉所有關LCD的函式,其餘原封不動,下述是所定義的Function Prototype,最後所得到的Read_Data沒有值, f是在EEPROM_Read完後的回傳值為10(十六進制),但真的不是很清楚程式中的Send_Data、Send_Addr值到底為何?...且不知回應的f值是否為正確?
程式都頗長的,不知各位大大有沒有適合的範例... 感謝各位解惑... #pragma udata access My_RAM near unsigned char Debounce; near unsigned char Send_Addr; near unsigned char Send_Data; near unsigned char Send_Length; near unsigned char Read_Data; near unsigned char P_SW2; near unsigned char P_SW6; #pragma udata #define Page_Length 8 #define SW2 PORTAbits.RA4 #define SW6 PORTEbits.RE1 #define Bounce_Time 6 #define EE_CMD 0xA0
發表於: 2004/10/14 22:21
|
|||
|
Re: 讀取eeprom問題.....非常感謝各位
|
||||
---|---|---|---|---|
版主
|
發表於: 2004/10/14 17:33
|
|||
|
Re: 讀取eeprom問題.....非常感謝各位
|
||||
---|---|---|---|---|
中級會員
|
以下是從版上範例程式中來的,這program可讀寫24LCxx系列的eeprom程式,我稍微修改,只單純讀寫一個byte,但還是讀寫不到值,是什麼問題呢?
謝謝各位的教導。 #include <p18f452.h> #include <i2c.h> #include <stdlib.h> void Initialize_I2C_Master(void); void EE_SEQU_Read(unsigned char,unsigned char,unsigned char,unsigned char *); void EEPROM_Write(unsigned char,unsigned char,unsigned char); void EEPROM_ACK(unsigned char); void InitialPort(void); unsigned char EEPROM_Read(unsigned char,unsigned char); #define SW2 PORTAbits.RA4 unsigned char Read_Data; void main(void) { TRISAbits.TRISA4=1; Initialize_I2C_Master( ); while(1) { if(!SW2) { EEPROM_Write(0xA0,0x10,0x05); EEPROM_ACK(0xA0); Read_Data = EEPROM_Read(0xA0,0x10); } } } //-------------------------------------------------------------- void EEPROM_Write(unsigned char ctrl,unsigned char addr,unsigned char data) { IdleI2C(); StartI2C(); I2C_Done(); WriteI2C(ctrl); while(SSPCON2bits.ACKSTAT); I2C_Done(); WriteI2C(addr); while(SSPCON2bits.ACKSTAT); I2C_Done(); WriteI2C(data); while(SSPCON2bits.ACKSTAT); I2C_Done(); StopI2C(); I2C_Done(); } //----------------------------------------------------------------- void EEPROM_ACK(unsigned char ctrl) { unsigned char i; IdleI2C(); StartI2C(); I2C_Done(); WriteI2C(ctrl); I2C_Done(); while (SSPCON2bits.ACKSTAT) { for (i=0;i<100;i++); RestartI2C(); I2C_Done(); WriteI2C(ctrl); I2C_Done(); } StopI2C(); I2C_Done(); } //-------------------------------------------------------------unsigned char EEPROM_Read(unsigned char ctrl,unsigned char addr) { unsigned char f; IdleI2C(); StartI2C(); I2C_Done(); WriteI2C(ctrl); while(SSPCON2bits.ACKSTAT); I2C_Done(); WriteI2C(addr); while(SSPCON2bits.ACKSTAT); I2C_Done(); RestartI2C(); I2C_Done(); WriteI2C(ctrl+1); while(SSPCON2bits.ACKSTAT); I2C_Done(); f=ReadI2C(); I2C_Done(); NotAckI2C(); I2C_Done(); StopI2C(); I2C_Done(); return(f); } //----------------------------------------------- void I2C_Done(void) { while (!PIR1bits.SSPIF); PIR1bits.SSPIF=0; } //------------------------------------------------ void Initialize_I2C_Master(void) { OpenI2C(MASTER,SLEW_ON); SSPADD= 9; }
發表於: 2004/10/14 16:33
|
|||
|
Re: 讀取eeprom問題.....非常感謝各位
|
||||
---|---|---|---|---|
中級會員
|
找到了…很感謝您
發表於: 2004/10/14 14:20
|
|||
|