Prosze wszystkic forumowiczow o pomoc z nastepujacym probleme:
Mam program ktory ma za zadanie obslugiwac I2C.
Chodzi mi o proste przesyłanie bitów za pomoca tego interfejsu, w zasadzie dla wielu jest to trywialna sprawa.
Jedank mamy z tym problem, nie mozemy uzyskac odp na slave, tzn. po prostym podlaczeniu diód na port ktory ma byc wyjsciem nic nie widzimy, zero reakcji w zasadzie tylko po nacisnieciu resetu obserwujemy jakas reakcjie(reset mastersa, daje efekt na slave).
Wiem ze moze zaistniec tak sytuacjia ze poprostu nie zuwazymy jak zmieniaja sie wysyłane bity lecz po zastosowaniu funkcji spowolniajacej proces nic nie mozna zuwazyc na slave wiec to raczej nie to.
Mozliwe ze blad jest u samoego poczatku tzn.
powismy wysłac w natepujacej kolejnosci start, adres,dana, stop, start adres, dana, stop....
Ale wtedy nie ma zadnej reakcji na wyswietlaczu.
KOdy tuch programow to:
Slave:
master:
Prosze o jakas pomoc.
Wiem ze lopalotogicznie opisalem problem lecz z moja wiedza w tym temacie jest slabo, nawet bardzo...
pozdrawiam
>Proszę dostosować się do p.15 regulaminu i poprawić treść wiadomości<
Zmieniłem tytuł.
[zumek]
Mam program ktory ma za zadanie obslugiwac I2C.
Chodzi mi o proste przesyłanie bitów za pomoca tego interfejsu, w zasadzie dla wielu jest to trywialna sprawa.
Jedank mamy z tym problem, nie mozemy uzyskac odp na slave, tzn. po prostym podlaczeniu diód na port ktory ma byc wyjsciem nic nie widzimy, zero reakcji w zasadzie tylko po nacisnieciu resetu obserwujemy jakas reakcjie(reset mastersa, daje efekt na slave).
Wiem ze moze zaistniec tak sytuacjia ze poprostu nie zuwazymy jak zmieniaja sie wysyłane bity lecz po zastosowaniu funkcji spowolniajacej proces nic nie mozna zuwazyc na slave wiec to raczej nie to.
Mozliwe ze blad jest u samoego poczatku tzn.
powismy wysłac w natepujacej kolejnosci start, adres,dana, stop, start adres, dana, stop....
Ale wtedy nie ma zadnej reakcji na wyswietlaczu.
KOdy tuch programow to:
Slave:
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/io.h>
#include <avr/twi.h>
// init slave
//
//
void init_twi_slave (uint8_t addr) {
//DDRC = 0xff;
// set slave addr to 1
// do not respond to general call
TWAR = (addr<<1)|0;
// enable twi interface and interrupt and acks
TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA);
TWCR |= TWSTO;
}
// recv data
//
//
volatile uint8_t do_things;
volatile uint8_t value;
volatile uint8_t index;
SIGNAL (SIG_2WIRE_SERIAL) {
// grab the value
value = TWDR;
//if(value != 2)
//reset
if(TWSR == 0)
TWCR |= TWSTO;
// do things
//do_things = 1;
// allow i2c to continue
TWCR |= _BV(TWINT);
//PORTC = 0xFF;
}
// print data
//
//
int main (void) {
init_twi_slave (1);
send_init ();
DDRB = 0xFF;
sei ();
do_things = 0;
uint16_t sleep;
uint8_t i;
while (1) {
PORTB = ~TWSR;
if(TWSR == 0)
TWCR |= TWSTO;
}
return 0;
}
master:
#include <avr/io.h>
#include <avr/twi.h>
#include <avr/interrupt.h>
// init master
//
//
void init_twi_master (uint8_t twbr) {
// set the scl
TWBR = twbr;
TWCR = _BV(TWEN);
}
// send data
//
//
int main (void) {
init_twi_master (13);
DDRB = 0xFF;
uint16_t sleep;
uint8_t i = 1;
while (1) {
PORTB = ~TWSR;
// send start
TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);
while (!(TWCR & _BV(TWINT)));
PORTB = ~TWSR;
// send the addr
TWDR = (1<<1) | 0;
TWCR = _BV(TWINT) | _BV(TWEN);
while (!(TWCR & _BV(TWINT)));
PORTB = ~TWSR;
if ((TWSR & 0xF8) != TW_MT_SLA_ACK){
//error(TWSR, 0x01);
}
//while(1){
TWDR = i;
TWCR = _BV(TWINT) | _BV(TWEN);
while (!(TWCR & _BV(TWINT)));
PORTB = ~TWSR;
if((TWSR & 0xF8) != TW_MT_DATA_ACK){
//error(TWSR, 0x02);
}
// i++;
//}
// send stop
TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN) | _BV(TWEA);
while( !(TWCR & _BV(TWSTO)) );
//while (!(TWCR & _BV(TWINT)));
PORTB = ~TWSR;
//sleep = 65535;
//while(sleep--);
//TWCR = TWCR & ~(_BV(TWEN));
i++;
}
return 0;
}
Prosze o jakas pomoc.
Wiem ze lopalotogicznie opisalem problem lecz z moja wiedza w tym temacie jest slabo, nawet bardzo...
pozdrawiam
>Proszę dostosować się do p.15 regulaminu i poprawić treść wiadomości<
Zmieniłem tytuł.
[zumek]