Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; 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
}
Составить ответ | Вернуться на конференцию.
Ответы
- Вот мой иср. - 1111 (02.03.2009 15:36:28 93.125.8.2, 4945 байт)