Witam chcialem sobie odczytac 14 kolejnych bitow na wejsciu uC taktujac uklad zewnetrzny sygnalem SCK. Chodzi tutaj o magistrale SPI. Uklad ten posiada 3 szyny komunikacyjne SCK, CS, SO. W uC niestety nie jest on podlaczony do sprzetowego SPI tylko do portow PD5,PD6,PD7 uC.
Napisalem prosty programik (byc moze zly :)) ktory ma mi te bity pokazac. Zmienna Shift puki co nic nie robi, oraz wiem ze do zmiennej typu char da sie wsadzic tylko 8 bitow. Chodzi o to ze na uarcie widze tylko:
01111111111111 co jest nie prawda poniewaz przedostatni bit zawsze powinien byc zerem. Uklad zaczyna wysylanie danych po CS -> L i nowy bit pokazuje sie po kazdym opadajacym zboczu sygnalu.#define SPI_PULSE { PORTD &= ~_BV(PD7); PORTD |= _BV(PD7); } //zostaw wysoki do czasu nastepnego pulse.
#define SOIN { DDRD &= ~_BV(PD5); PORTD |= _BV(PD5); } //ustaw jako wejscie, wlacz pullup.
#define CSLOW { DDRD |= _BV(PD6); PORTD &= ~_BV(PD6); } //wyjscie low #define CSHIGH { DDRD |= _BV(PD6); PORTD |= _BV(PD6); } //wyjscie high
unsigned char rspi(void) { uart_puts("-"); register unsigned int BitCnt = 14; register unsigned char Shift; SOIN; CSLOW; do { if(bit_is_set(PORTD,PIND5)) { uart_puts("1"); }else{ uart_puts("0"); } SPI_PULSE; } while (--BitCnt); CSHIGH; return(Shift); }
co robie zle ze to SPI mi nie dziala? wydaje sie proste zrozumienie tego protokolu... ktos mi pomoze?
Pzdr, Mario.