Witam.
Otóż mam taki kod, do próby nawiązania komunikacji z kartą SD podłączoną w trybie SPI
Do PORTD mam podłączonych 8diód za pomocą których monitoruję sobie, co odpowiada mi karta. Cały problem w tym, ze w funkcji mmccmd, PORTD cały czas równa się 0xFF (wszystkie diody świecą). A powinno choćby raz na jakiś czas być 0x01, co oznaczałoby prawidłowe przełączenie się w tryb "in idle state".
Kartę mam 512MB mikroSD z telefonu Nokia, włożoną do adapteru który jest podłączony do płytki stykowej. Procesor oraz karta zasilana jest z portu USB za pomocą stabilizatora LM1117T 3.3V. Karta jest prawidłowo wykrywana i daje się formatować w komputerze.
Nie mam już pojęcia ani pomysłów, co może być nie tak
Czy hardware czy software ? Moze ktoś z forumowiczów wie, co może być nie tak, lub widzi jakiś "głupi" błąd w sofcie ?
Pozdrawiam
Otóż mam taki kod, do próby nawiązania komunikacji z kartą SD podłączoną w trybie SPI
#include <avr/io.h>
#include <util/delay.h>
//Komendy dostepne w trybie SPI
#define go_idle_state 0x40 //0
#define send_op_cond 0x41 //1
#define cend_csd 0x49 //9
#define send_cid 0x4a //10//01001010
#define send_status 0x4d //13
#define set_blocken 0x50 //16
#define read_single_block 0x51 //17
#define write_block 0x58 //24
#define program_csd 27
#define set_write_port 28
#define clr_write_port 29
#define send_write_port 30
#define tag_sector_start 0x60 //32
#define tag_sector_end 0x61 //33
#define untag_sector 0x62 //34
#define tag_erase_group_start 0x63 //35
#define tag_erase_group_end 0x64 //36
#define untag_erase_group 0x65 //37
#define erase 0x66 //38
#define crc_on_off 0x7b //59
//odpowiedzi
#define r1_busy 128
#define r1_parametr 64
#define r1_address 32
#define r1_erase_seq 16
#define r1_com_crc 8
#define r1_illegal_com 4
#define r1_erase_reset 2
#define r1_idle_state 1
#define Finish 1
#define leave 0
#define pincs 0
#define portcs PORTB
#define dir_cs_in DDRB&=~(1<<pincs);
#define dir_cs_out DDRB|= (1<<pincs);
#define out_cs_low portcs &=~(1<<pincs);
#define out_cs_hi portcs |= (1<<pincs);
#ifndef mmc_asm
//deklaracje typow
typedef unsigned char u08;
typedef unsigned short u16;
typedef unsigned long u32;
//prototypy funkcji
u08 reset(void);
u08 read_sector(u32 sector);
u08 write_sector(u32 sector);
u32 capacity(void);
u08 get_cid(void);
#endif
u08 mmc_sbuf[512]; //bufor sektora
//procedury pomocnicze
void spi_init(void)
{
DDRB |= (( 1 << PB5 ) | ( 1 << PB3 ) | ( 1 << PB2 )); //MOSI, SCK, SS' jako wyjścia
SPCR = (( 1 << SPE ) | ( 1 << MSTR ) | ( 1 << SPR1 ) | ( 1 << SPR0 )); //Włączamy SPI,
} //układ Master, najmniejsza częstotliwość SCK fosc / 128
u08 spi_tx_rx(u08 byte) //wysylanie i odbior przez spi
{
SPDR = byte;
while((SPSR & 128)!=128) //czekaj na zakonczenie transmisji
return (SPDR);
}
void finish(void) //zakonczenie trasmisji
{
dir_cs_out; //cs wyjscie
out_cs_hi; //cs wysoki
spi_tx_rx(0xff); //wysli 8 imp zegarowych
}
void flush_mmc(u08 count)
{
while(count--)
spi_tx_rx(0xff);
}
//wysylanie komendy i odbior potwierdzenia
u08 mmccmd(u08 cmd, u32 param, u08 state)
{
u08 i, tmp;
dir_cs_out; //cs wyscie
out_cs_low; //cs niski
spi_tx_rx(cmd); //wysli komende
spi_tx_rx(param>>24); //wysli 4 bajty argumentu
spi_tx_rx(param>>16);
spi_tx_rx(param>>8);
spi_tx_rx((u08)param); //lsb
spi_tx_rx(0x95); // wysli crc
for(i=0;i<10;i++)
{
tmp=spi_tx_rx(0xff); //odbierz odpowiedz, wysylajac cokolwiek np 0xff
}
PORTD=tmp; //Caly czas 0xFF !!! a powinno byc 0x01 -co oznacza in idle state
finish();
return tmp;
}
//inicjalizacja spi oraz reset
u08 reset(void)
{
u08 tmp;
dir_cs_out; //cs wyjscie
out_cs_hi; //cs niski
spi_init(); // inicjalizacja spi
flush_mmc(10); //80 pustych cykli zegarowych
tmp=(mmccmd(go_idle_state, 0, Finish));
return 1;
}
main()
{
DDRD = 0xff;
reset();
}
Do PORTD mam podłączonych 8diód za pomocą których monitoruję sobie, co odpowiada mi karta. Cały problem w tym, ze w funkcji mmccmd, PORTD cały czas równa się 0xFF (wszystkie diody świecą). A powinno choćby raz na jakiś czas być 0x01, co oznaczałoby prawidłowe przełączenie się w tryb "in idle state".
Kartę mam 512MB mikroSD z telefonu Nokia, włożoną do adapteru który jest podłączony do płytki stykowej. Procesor oraz karta zasilana jest z portu USB za pomocą stabilizatora LM1117T 3.3V. Karta jest prawidłowo wykrywana i daje się formatować w komputerze.
Nie mam już pojęcia ani pomysłów, co może być nie tak
Pozdrawiam