Gast
#1215239
Hallo Leute,
ich programmiere mit einem XC167 und möchte über den IIC Bus den eeprom
beschreiben. Laut Datenblatt ein 24WC08, sollte also 8Kbit groß sein.
Ich beschreibe eine Adresse (16 Bit) und lese anschließend den Wert
wieder aus. Ich bekomme allerdings immer 0xFF zurück. Ich habe mich
bereits erkundigt und erfahren, dass dies der Auslieferungszustand ist.
Ich vermute also, dass das Auslesen des eeproms funktioniert, aber das
Beschreiben nicht. Der WP Pin ist auf GND, sollte also nicht
schreibgeschützt sein!
Rufe ich untenstehende Routine auf, bekomme ich 0 zurück. Alle ACK Bits
werden also erkannt. Wäre super wenn jemand helfen könnte!
Danke!
byte writeEE(word address,byte data){
if((IIC_ST&0x0010)>>4!=0) return (1); //check for busy flag
IIC_ST = 0x0000; //reset status register
IIC_CON |= 0x0010; //generate start (Set BUM)
IIC_RTBL = 0xA8; //write slave address and WR
while ((IIC_ST & 0x0020) == 0); //wait for end of Tx (IRQD)
if (IIC_ST & 0x0008) goto noack; //check for ACK (LRB)
IIC_RTBL = (byte)(address>>8); //write address high byte
while ((IIC_ST & 0x0020) == 0); //wait for end of Tx (IRQD)
if (IIC_ST & 0x0008) goto noack; //check for ACK (LRB)
IIC_RTBL = (byte)address; //write address low byte
while ((IIC_ST & 0x0020) == 0); //wait for end of Tx (IRQD)
if (IIC_ST & 0x0008) goto noack; //check for ACK (LRB)
IIC_RTBL = data; //write data byte
while ((IIC_ST & 0x0020) == 0); //wait for end of Tx (IRQD)
if (IIC_ST & 0x0008) goto noack; //check for ACK (LRB)
IIC_CON &= 0xFFEF; //generate stop (clear
BUM)
IIC_ST &= 0xFF1F; //clear IRQD, IRQP, IRQE
while (IIC_ST & 0x0010); //wait for idle bus
return (0); //done
noack:
IIC_CON &= ~0x0010; // generate stop (clear BUM)
IIC_ST &= ~0x00E0; //clear IRQD, IRQP, IRQE
while (IIC_ST & 0x0010); //wait for idle bus
return (2); //signal error
}