Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

twi аппаратный ничего никогда не висло

Отправлено omen (92.100.41.56) 13 ноября 2011, г. 01:46
В ответ на: у меня нет отправлено whale 13 ноября 2011, г. 00:51



unsigned char EEPROM_init
(
unsigned int adr
)
{
TWBR = 20;
TWSR = 0x00;

//transmit START
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));

// отлавливаем правильность посылки START
if ((TWSR & 0xf8) != 0x08)
{
TWCR = 0;
return( 1 );
}

// set slave address for write
TWDR = 0xa0;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xf8) != 0x18)
{
TWCR = 0;
return( 1 );
}

// set low byte address
TWDR = (unsigned char)(adr & 0x00ff);
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xf8) != 0x28)
{
TWCR = 0;
return( 1 );
}

// set hi byte address
TWDR = (unsigned char)(adr>>8);
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xf8) != 0x28)
{
TWCR = 0;
return( 1 );
}

return( 0 );
}




__monitor unsigned char EEPROM_write_byte
(
unsigned int adr,
unsigned char data
)
{
// PORTE &= ~0x08;

if (EEPROM_init( adr )) return( 1 );

// write byte
TWDR = data;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xf8) != 0x28)
{
TWCR = 0;
return( 1 );
}

TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);

__delay_cycles( 80000 ); // задержка на 5.4 мс

// PORTE |= 0x08;
return( 0 );
}


__monitor unsigned char EEPROM_read_byte
(
unsigned int adr,
unsigned char * refdata
)
{
// PORTE &= ~0x08;
if (EEPROM_init( adr )) return( 1 );

//transmit repeate START
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));

if ((TWSR & 0xf0) != 0x10)
{
TWCR = 0;
return( 1 );
}

// set slave address for read
TWDR = 0xa1;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xf8) != 0x40)
{
TWCR = 0;
return( 1 );
}

//get data
TWCR = (1<<TWINT)|(1<<TWEN); // NO_ASK
while (!(TWCR & (1<<TWINT)));

if ((TWSR & 0xf8) != 0x58)
{
TWCR = 0;
return( 1 );
}
else *refdata = TWDR;

//transmit STOP
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
__delay_cycles( 147 ); // задержка на 10 мкс

// PORTE |= 0x08;
return( 0 );
}

__monitor unsigned char EEPROM_read_str
(
unsigned int adr,
unsigned char * refdata
)
{
// PORTE &= ~0x08;
if (EEPROM_init( adr )) return( 1 );


//transmit repeate START
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));

if ((TWSR & 0xf0) != 0x10)
{
return( 1 );
}

// set slave address for read
TWDR = 0xa1;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xf8) != 0x40)
{
return( 1 );
}

//get data
for( unsigned char i=0; i<8; i++ )
{
if (i != 7) TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
else TWCR = (1<<TWINT)|(1<<TWEN); // NO_ASK

while (!(TWCR & (1<<TWINT)));

if (i != 7)
{
if ((TWSR & 0xf8) != 0x50) return( 1 );
else refdata[ i ] = TWDR;
}
else
{
if ((TWSR & 0xf8) != 0x58) return( 1 );
else refdata[ i ] = TWDR;
}
}

//transmit STOP
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
__delay_cycles( 147 ); // задержка на 10 мкс

// PORTE |= 0x08;

return( 0 );
}







Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 654:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru