[an error occurred while processing this directive]
Живее всех живых ;-D (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Сидоргек 26 января 2006 г. 14:33
В ответ на: Лыжи не едут. В Меге 8 TWI вообще живой?? Ну никак не хочет даже Старт сделать... отправлено <font color=gray>Неспящие_с_Трезором</font> 26 января 2006 г. 14:21

// Биты TWCR
#define TWINT 7
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define TWWC 3
#define TWEN 2
#define TWIE 0

// Состояния
#define START 0x08
#define REP_START 0x10

// Коды статуса
#define MTX_ADR_ACK 0x18
#define MRX_ADR_ACK 0x40
#define MTX_DATA_ACK 0x28
#define MRX_DATA_NACK 0x58
#define MRX_DATA_ACK 0x50

// Подготовка аппаратного мастера I2C
void twi_init (void)
{
TWSR=0x00;
TWBR=0x20;
TWAR=0x00;
TWCR=0x04;
}

// Жду флажка
static void twi_wait_int (void)
{
while (!(TWCR & (1<}

// Стартовое условие
// Возвращает не 0, если все в порядке
unsigned char twi_start (void)
{
TWCR = ((1<
twi_wait_int();

if((TWSR != START)&&(TWSR != REP_START))
{
return 0;
}

return 255;
}

// Стоповое условие
void twi_stop (void)
{
TWCR = ((1<}

// Передача адреса
// Возвращает не 0, если все в порядке
unsigned char twi_addr (unsigned char addr)
{
twi_wait_int();

TWDR = addr;
TWCR = ((1< twi_wait_int();

if((TWSR != MTX_ADR_ACK)&&(TWSR != MRX_ADR_ACK))
{
return 0;
}
return 255;
}

// Передача байта данных
// Возвращает не 0, если все в порядке
unsigned char twi_byte (unsigned char data)
{
twi_wait_int();

TWDR = data;
TWCR = ((1< twi_wait_int();

if(TWSR != MTX_DATA_ACK)
{
return 0;
}

return 255;
}

// Чтение байта
// Возвращает не 0, если все в порядке
unsigned char twi_read (unsigned char * pByt, unsigned char notlast)
{
twi_wait_int();

if(notlast)
{
TWCR = ((1< }
else
{
TWCR = ((1< }

twi_wait_int();

*pByt = TWDR;

if(((TWSR == MRX_DATA_NACK)&&(notlast == 0))||(TWSR == MRX_DATA_ACK))
{
return 255;
}

return 0;
}

// Передача в заданный адрес I2C nbytes байт
void i2c_bytes (unsigned char addr, unsigned char sbaddr, unsigned char nbytes, ...)
{
va_list argptr;
char byt;

va_start(argptr, nbytes);

while(1)
{
if (!twi_start())
{
twi_stop();
continue;
}

if (!twi_addr(addr))
{
twi_stop();
continue;
}

break;
}

twi_byte(sbaddr);

while(nbytes--)
{
byt = va_arg(argptr, char);
twi_byte(byt);
}
va_end(argptr);

twi_stop();
}


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru