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

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

Покажите кто нибудь как с TWI атмельским (мега32) работать! задрал он меня уже(+)

Отправлено kan 02 марта 2009 г. 15:18


Адрес памяти A0.
Так у меня и вычитывается всегда это число, что и где я делаю не так, кто плотно знаком, я думаю не составит труда увидеть мой косяк...

__interrupt void I2C_ISR(void)
{
switch(TWSR&0xF8) // TWI status tasking
{
case(0x00): // A start condition has been sent
// SLR+R/W are transmitted, ACK bit received
I2C_fbusy = 0; // TWI is free
break;
case(0x08): // A start condition has been sent
TWDR = i2c_icaddr; // âûñòàâèòü àäðåñ íà çàïèñü
TWCR &= ~(1<<TWSTA); // îòìåíèòü ñòàðòîâóþ êîìáèíàöèþ
break;
case(0x10): // A repeated start condition has been sent
// SLR+R/W are transmitted, ACK bit received
TWDR = i2c_icaddr; // âûñòàâèòü àäðåñ ìèêðîñõåìû íà çàïèñü
TWCR &= ~(1<<TWSTA); // îòìåíèòü ñòàðòîâóþ êîìáèíàöèþ
break;
case(0x18): // SLR+W was transmitted, ACK bit received
TWCR &= ~( (1<<TWSTA) | (1<<TWSTO) );
TWDR = i2c_data[i2c_counter++]; // ïåðåäàòü ïåðâûé áàéò
break;
case(0x20): // SLR+W was transmitted, NOT ACK bit received
TWCR |= (1<<TWSTO); // Transmit STOP
I2C_fbusy = 0; // TWI is free
break;
case(0x28): // DATA was transmitted, ACK bit received
if ( i2c_counter < i2c_count )
{
TWCR &= ~( (1<<TWSTA) | (1<<TWSTO) );
TWDR = i2c_data[i2c_counter++]; // Transmit data byte, ACK bit received
}
else
{
I2C_fbusy = 0; // TWI is free
TWCR |= (1<<TWSTO); // send STOP
}
break;
case(0x30): // DATA was transmitted, NOT ACK bit received
TWCR |= (1<<TWSTO); // Transmit STOP
I2C_fbusy = 0; // TWI is free
break;
case(0x38): // Arbitration lost in SLA+W or DATA.
TWCR |= (1<<TWSTO); // Transmit STOP
I2C_fbusy = 0; // TWI is free
break;
case(0x40): // SLA+R was transmitted, ACK bit received
if ( (i2c_counter+1) < i2c_count )
{
TWCR |= (1<<TWEA); // set AA
}
else
{
TWCR &= ~(1<<TWEA); // Clr AA
}
break;
case(0x48): // SLA+R was transmitted, NOT ACK bit received
TWCR |= (1<<TWSTA); // Transmit repeated start
break;
case(0x50): // äàííûå ïðèíÿòû, ACK bit received
i2c_data[i2c_counter++] = TWDR;
if ( (i2c_counter+1) < i2c_count )
TWCR |= (1<<TWEA); // set AA
else
TWCR &= ~(1<<TWEA); // clear AA
break;
case(0x58): // Data Byte has been received; NOT ACK has been returned
i2c_data[i2c_counter++] = TWDR; // Transmit data byte, ACK bit received
TWCR |= (1<<TWSTO); // Transmit STOP
I2C_fbusy = 0; // TWI is free
break;
}
TWCR |= (1<<TWINT); // clear INT flag
}


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

Ответы


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

Сообщение:

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

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

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

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