помогите пожалуйста: надо написать класс I2C для общения с EEPROM. Смотрел апноты, техноты и даташит. В результете родилось вот это:
void TI2C::Transfer(unsigned char Addr, unsigned char Data) { DATA = Data; I2ADR = Addr; I2CONCLR = 0xFF; I2CONSET = 0x40; I2CONSET = 0x20; busy = true; while(busy) { }; I2CONSET = 0x10; }
void TI2C::I2C_ISR(void) { switch(I2STAT) {
case 0x08: //Условие СТАРТ было передано I2DAT = WRITE_ROM; I2CONCLR = 0x28; break; case 0x10: //Повторное условие СТАРТ было передано break; case 0x18: //Slave-адрес и флаг записи были переданы, АСК получен I2DAT = I2ADR; //Записываем первый байт данных adr_transmit = true; //Флаг передачи адреса break; case 0x20: //Slave-адрес и флаг записи были переданы, АСК не получен I2DAT = WRITE_ROM; //Повторная передача break; case 0x28: //Байт был передан, АСК получен if(count) { I2DAT = 0xaa; count--; }; if(!count) { I2CONSET = 0x10; //условие СТОП }; busy = false; break; case 0x30: //Байт был передан, АСК не получен break;
default: break; }
I2CONCLR = 0x08; VICVectAddr = 0x00; } это только для записи по I2C в EEPROM байта данных по адресу WORD_ADDRESS. Как я понимаю посылка должна состоять из 3 байт DEVICE_ADDRESS+WORD_ADDRESS+DATA_BYTE? Если в case 0x28: оставить только I2CONSET = 0x10; то все работает ( на экране осцилографа видна вся посылка вместе условиями СТАРТ и СТОП), но пересылается только DEVICE_ADDRESS+WORD_ADDRESS. Если оставить как есть, то посылку не видно, никаких СТАРТ и СТОП, а высвечивается только DATA_BYTE. Как заставить отослать все три байта? Подскажите плиз....
--------------------
|