G
Gaurav Yadav
Guest
v podstatě chci pomoci na SPI
ale im snaží rozhraní ADNS 2610 optický senzor myši s ATmega 16 Použití SPI ale nereaguje
soo může někdo pomoci mne tis je můj kód
ale im snaží rozhraní ADNS 2610 optický senzor myši s ATmega 16 Použití SPI ale nereaguje
soo může někdo pomoci mne tis je můj kód
Code:
definovat F_CPU 11059200UL
# Include <avr/io.h>
# Include <util/delay.h>
/ / DEFINUJÍCÍ SPI PORT mikrokontroléru
# Define DDR_SPI DDRB
# Define SCK 7
# Define MISO 6
# Define MOSI 5
neplatné INIT_SPI (void); / / inicializace SPI na aktuální
neplatné ADNS_WRITE (unsigned char, unsigned char); / / zápis do ADNS (data, adresy)
unsigned char ADNS_READ (unsigned char) / / čtení z ADNS zadání adresy registru a získávání datneplatné SPI_INIT (void) / / INTIALIZATION
(
SPCR = (1 <<SPE) | (1 <<MSTR);
SPCR | = (0 <<CPOL); / / CLOCK TRALLING EDGE je 1, náběžné hrany je 0
SPCR | = (1 <<SPR0); / / přepne do režimu volby 2 pro SCLK (Fosc/16)
SPCR | = (0 <<DORD) / / MSB PRVNÍ
SPCR | = (1 <<CPHA); / / SETING BIT padá EDGE OF SCLK
DDR_SPI | = (0 <<MOSI) | (0 <<MISO);
PORTB | = (1 <<MISO) | (1 <<MOSI); / / MISO a MOSI u HI Z
DDRB = (1 <<SCK), / / VÝROBA SCK výstupu po MOSI a miso IS v Hi Z
/ / Takže není SYNC PROBLEM
)
/ / Minimální DIFF B / W TWO WRITE MÁ BÝT 100usec
neplatné ADNS_WRITE (unsigned char addr, unsigned char data)
(
addr | = (1 <<7), / / MSB adresa by měla být 1 v WRITE OP
SPDR = addr;
DDR_SPI | = (1 <<MOSI); / / Otevírací MOSI
while (! (SPSR & (1 <<SPIF)))
()SPDR = data;
while (! (SPSR & (1 <<SPIF)))
()
DDR_SPI | = (0 <<MOSI); / /
PORTB | = (1 <<MISO) | (1 <<MOSI); / / TRISTATING MISO a MOSI
)
/ / MINIMÁLNÍ rozdíl mezi dvěma číst nebo psát MÁ BÝT 250ns
unsigned char ADNS_READ (unsigned char addr1)
(
addr1 | = (1 <<7), / / MSB adresa by měla být 0 v ČTĚTE OP
SPDR = addr1;
DDR_SPI | = (1 <<MOSI);
while (! (SPSR & (1 <<SPIF)))
()
/ / HOLD poslední kousek adresy na více než 250ns
DDR_SPI | = (0 <<MOSI);
PORTB | = (1 <<MOSI); / / VÝROBA MISO HI Z
_delay_ms (1), / / zpoždění SV, že ADNS-2610 můžete připravit DATAPORTB = (0 <<MISO); / / Changi MISO OD TRISATE na vstup PIN
while (! (SPSR & (1 <<SPIF)))
()
návrat SPDR;
)